時間:2008-12-11 11:31:48來源:ronggang
圖1 CRC校驗原理圖
Fig.1The Schematic diagram of CRC[/align]
假定需傳輸的數據P=110,也就是信息元,此時k=3,與它對應的多項式為
n=7且對應的
(其最低4位為零,以便拼裝4位監督位)。用生成多項式g(x)去除
,在運算中使用的均為模2的特殊運算。求CRC碼所采用模2加減運算法則,即是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數式的乘除法運算是一樣,符合同樣的規律。如:
取余數Q=101,所傳輸的數據為
,n=7,該數據前三位是信息元,后四位是CRC序列。
接收端收到數據時,為進行校驗,仍用g(x)去除接收到信息所對應的多項式
,由表達式(4)可以得到:
應能被個g(x)整除。在此工作機制下,上述循環碼不但可檢查出n-k-1個獨立錯誤,還可以檢查出長度b
為完成求得CRC序列,可以使用一個15位移位寄存器CRC_RG(14:0)。若以NXTBIT標記該位流的下一位,它由從幀起始至數據場結束的無填充位的序列給定。CRC序列的計算如下:
CRC_RG=0 //初始化寄存器
REPEAT
CRCNXT = NXTBITE XOR CRC_RG(14);
CRC_RG(14:1) = CRC_RG(13:0);//寄存器左移一位
CRC_RG(0) = 0;
IF CRCNXT THEN
CRC_RG(14:0) = CRC_RG(14:0) EXOR (4599H);
END IF
UNTIL(CRC序列開始或者存在一個出錯狀態)
得到CRC序列為:000001000110101,發送/接收數據場的最后一位后,CRC_RG包含CRC序列,CRC序列后面是CRC界定符,它只包含一個隱位(高電平)1。
串行算法的VHDL程序代碼如下:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_arith.all;
Entity can_vhdl_crc is
port (
clk : in std_logic;
data : in std_logic;
enable : in std_logic;
initialize : in std_logic;
crc : out std_logic_vector(14 downto 0));
End entity can_vhdl_crc;
Architecture rtl of can_vhdl_crc is
Type xhdl_46 is array(0 ot 7) of std_logic_vector(7 downto 0);
Signal crc_next : std_logic;
Signal crc_tmp : std_logic_vector(14 DOWNTO 0);
Signal crc_xhdl1 : std_logic_vector(14 DOWNTO 0);
begin
crc <= crc_xhdl1;
crc_next <= data xor crc_xhdl1(14) ;
crc_tmp <= crc_xhdl1(13 downto 0) & ‘0‘ ;
process (clk)
begin
if (clk‘event and clk = ‘1‘) then
if (initialize = ‘1‘) then
crc_xhdl1 <= "000000000000000";
else
if (enable = ‘1‘) then then
if (crc_next = ‘1‘) then
crc_xhdl1 <= crc_tmp xor "100010110011001";
else
crc_xhdl1 <= crc_tmp ;
end if;
end if;
end if;
end if;
end process;
end Architecture rtl;
3.2 CRC編碼的并行計算
目前已采用CRC并行算法是查表法及基于查表法而導出的一些方法。這些方法均需要存儲長度較大的CRC余數表,隨著并行度的增加,余數表的長度大大增加(按指數增加),其現實性亦隨之大大降低。
該算法事先把待校驗的信息碼P的所有CRC碼全部計算出來,放在一個表里,編碼時只要根據P從表中找出對應的值進行處理即可。其硬件實現示意框圖如圖2所示。編碼解碼前清零CRC寄存器。編碼時待信息碼P輸入結束,CRC寄存器的值即為校驗碼Q;解碼校驗時待傳送碼P輸入結束時,若CRC寄存器中的值為零,則表明傳輸無誤。該算法執行速度快,適合于高速通信場合,但由于需要大容量的存儲表,花費的硬件資源較串行算法要大得多。
[align=center]
圖2 并行算法示意圖
Fig.2 The Schematic drawing of Parallel Algorithm[/align]
為使(n,k)碼能具體指出數據在傳輸中出錯的位,數據位數k和校驗位數r之間應滿足海明不等式:k+r<2[sup]r[/sup]-1 。為簡明起見,這里假設欲傳送的數據代碼P按4位一組分組(即k=4),則r≥3,若選定生成多項式g(x)=x[sup]3[/sup]+x[sup]2[/sup]+1則可得采用并行算法求Q的VHDL程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity crc_jym1 is
generic(m_wide:integer:=3;
r_wide:integer:=2);
port(m_in:in std_logic_vector(m_wide downto 0);
r_out:out std_logic_vector(r_wide downto 0));
end crc_jym1;
architecture a of crc_jym1 is
constant crc_wide:integer:=m_wide+r_wide+1;
constant g_wide:integer:=r_wide+1;
signal mm:std_logic_vector(crc_wide downto 0);
constant g:std_logic_vector(g_wide downto 0):="1101";
begin
process(m_in)
variable d:std_logic_vector(g_wide downto 0);
variable r:std_logic_vector(r_wide downto 0);
begin
r:=(others=>‘0‘);
mm<=m_in&r;
d:=mm(crc_wide downto(crc_wide-g_wide));
for i in(crc_wide-g_wide-1)downto 0 loop
if d(g_wide)=‘0‘then
r:=d(r_wide downto 0);
else
for j in r_wide downto 0 loop
r(j):=d(j)xor g(j);
end loop;
end if;
d:=r&mm(i);
end loop;
if d(g_wide)=‘0‘then
r:=d(r_wide downto 0);
else
for j in r_wide downto 0 loop
r(j):=d(j)xor g(j);
end loop;
end if;
r_out<=r;
end process;
end a;
4 總結
本文在分析了CRC計算原理的基礎上,仔細運用VHDL的特點進行串、并行CRC算法建模從而實現的設計,不僅具備采用公式法設計所具有的優點,還能很好地適用于各種數據塊大小不同、生成多項式選取不同的CRC編、解碼運用場合,明顯減輕設計開發工作量,大幅縮短產品的研發周期。此外,由于生成結果占用的硬件資源很少,只需利用系統集成芯片中剩余的少量資源即可實現,在當前大量的系統設計實現趨向單芯片化的大潮下,更具生命力。
參考文獻
[1] 王海光,并行CRC算法硬件實現研究與VHDL設計[J]. 漳州師范學院學報(自然科學版),2007年第4期(總第58期),51-56.
[2] 李永忠,通用并行CRC計算原理及其硬件實現方法[J]. 西北民族學院學報(自然科學版),2 0 0 2年3月第23卷總第43期,33-37.
[3] 蔣安平,循環冗余校驗碼(CRC)的硬件并行實現[J]. 微電子學與計算機,2007年第24卷第2期,107-109,112.
標簽:
上一篇:基于虛擬儀器的手機自動測試...
傳動網版權與免責聲明:凡本網注明[來源:傳動網]的所有文字、圖片、音視和視頻文件,版權均為傳動網(www.cdcst56.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“傳動網”,違反者本網將追究其法律責任。
本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
產品新聞
更多>2025-09-08
2025-08-06
2025-07-08
2025-06-30
2025-06-16
2025-06-09