技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > CAN總線協(xié)議中CRC編碼的VHDL實現(xiàn)

CAN總線協(xié)議中CRC編碼的VHDL實現(xiàn)

時間:2008-12-11 11:31:48來源:ronggang

導(dǎo)語:?為了提高CRC編碼的生成速度和CRC檢驗的效率,介紹了CRC檢驗的并行原理。最后給出了為滿足CAN協(xié)議的VHDL代碼。經(jīng)過測試,串、并行運算均滿足設(shè)計要求
摘 要:針對CAN協(xié)議中提出的串行CRC檢驗原理,給出其實現(xiàn)方法及硬件語言VHDL代碼。為了提高CRC編碼的生成速度和CRC檢驗的效率,介紹了CRC檢驗的并行原理。最后給出了為滿足CAN協(xié)議的VHDL代碼。經(jīng)過測試,串、并行運算均滿足設(shè)計要求。 關(guān)鍵字:CAN、CRC、串行、并行 [b][align=center]The VHDL Implementation for CRC in CanBus Protocol Hou Dian-Hua Chen Xing[/align][/b] Abstract: In the light of Serial CRC examination principle which proposed in the CAN protocol,this paper introduces the implementation method and the VHDL code. In order to enhance the production speed of CRC code and the efficiency of CRC examination, introduces the CRC examination parallel principle. Finally introduces the VHDL code. Key words: CAN、CRC、Serial、Parallel 1 引言   信息在傳遞過程中,可能因某種原因使傳輸?shù)臄?shù)據(jù)發(fā)生錯誤。為減少和避免這類錯誤的發(fā)生,除提高硬件的可靠性外,在數(shù)據(jù)的編碼上也應(yīng)提供檢錯和糾錯的支持。常見的校驗碼有奇偶校驗碼、海明校驗碼和循環(huán)冗余校驗CRC(Cyclic Redundancy Check)碼,它們都是將被校驗的數(shù)據(jù)代碼按k位一組分組,每組添加r個校驗位,形成n位一組的代碼,故又稱為(n,k)分組校驗碼。其中CRC碼既可檢錯又可糾錯(與生成多項式的選取有關(guān)),是以數(shù)據(jù)塊為對象進行校驗的一種高效、可靠的檢錯和糾錯方法,由于它的編解碼簡單、糾錯能力強且誤判概率很低,因而在工業(yè)測控及通信系統(tǒng)中得到了廣泛的應(yīng)用。   CAN協(xié)議中,為了保證幀傳輸?shù)目煽啃院洼^高的檢錯效率,其采用了以下幾種檢錯方式:位錯誤、填充錯誤、CRC錯誤、格式錯誤及應(yīng)答錯誤檢測。如果,用m表示報文受損率,那么通過以上檢錯方式,它對于受損報文檢測不到其受損的概率為:,因而CAN總線極高的檢錯率使得它目前被廣泛應(yīng)用到工業(yè)控制、通信、汽車甚至軍事等多個領(lǐng)域。CRC檢驗作為CAN協(xié)議中一種重要的且行之有效的檢錯方式,它的生成多項式可以檢驗7級,具有編碼簡單且誤判率低的優(yōu)點。 2 CRC編碼原理   循環(huán)冗余碼屬于多項式生成碼,編譯碼設(shè)備都不太復(fù)雜,檢(糾)錯能力較強。它的規(guī)律在于編碼后含n位碼元的一個碼組中有k位信息元和r=n-k位監(jiān)督元,二者混合形成規(guī)律性,監(jiān)督元是隨著所傳輸?shù)男畔⒃淖兊?。其工作原理如圖1所示,圖中P為輸入數(shù)據(jù),G為生成多項式對應(yīng)的編碼。 [align=center] 圖1 CRC校驗原理圖 Fig.1The Schematic diagram of CRC[/align]   假定需傳輸?shù)臄?shù)據(jù)P=110,也就是信息元,此時k=3,與它對應(yīng)的多項式為      n=7且對應(yīng)的(其最低4位為零,以便拼裝4位監(jiān)督位)。用生成多項式g(x)去除,在運算中使用的均為模2的特殊運算。求CRC碼所采用模2加減運算法則,即是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數(shù)式的乘除法運算是一樣,符合同樣的規(guī)律。如:。則有:      取余數(shù)Q=101,所傳輸?shù)臄?shù)據(jù)為,n=7,該數(shù)據(jù)前三位是信息元,后四位是CRC序列。   接收端收到數(shù)據(jù)時,為進行校驗,仍用g(x)去除接收到信息所對應(yīng)的多項式,由表達式(4)可以得到:      兩個相同的數(shù)的模2和為0,所以若接收數(shù)據(jù)無誤時,應(yīng)能被個g(x)整除。在此工作機制下,上述循環(huán)碼不但可檢查出n-k-1個獨立錯誤,還可以檢查出長度b3 CRC編碼的硬件語言實現(xiàn)   CRC編碼的硬件語言實現(xiàn),可以采用串行算法和并行算法兩種實現(xiàn)方式。串行算法即是移位算法,有的文獻稱之為比特流算法,需編碼的位流按位逐位輸入,位流輸入完成后生成檢驗碼,檢驗碼緊隨需檢驗的位流發(fā)出或接收到。并行方式中需檢驗的位流每k位輸入到檢驗碼生成電路中,因而檢驗碼的生成效率大大高于串行方式。以下針對CAN協(xié)議中CRC編碼的生成多項式進行闡述。   3.1 CRC編碼的串行實現(xiàn)   由循環(huán)碼的編碼方法可知,循環(huán)碼的編碼可以由除法電路實現(xiàn)。除法電路的主體由多級移位寄存器和模2加法器組成。由循環(huán)碼的譯碼與糾錯方法可知,譯碼器主要由一個除法器和緩沖移位寄存器構(gòu)成。若接收有誤,可經(jīng)過幾次移位后,在相應(yīng)的錯碼位上輸出“1”作為檢錯,并可以通過與緩沖移位寄存器輸出的錯碼模2加后來糾正錯誤。   CAN2.0A標(biāo)準(zhǔn)中,某數(shù)據(jù)幀(無數(shù)據(jù)場)前19位為0110001000111001000,對于生成多項式g(x)可從有關(guān)資料上查閱取得,它必須滿足下述要求:  ?。?)任何一位發(fā)生錯誤都應(yīng)使余數(shù)不為0;   (2)不同位發(fā)生錯誤應(yīng)使余數(shù)不同;  ?。?)對余數(shù)繼續(xù)作模2除時,應(yīng)是余數(shù)循環(huán)本處取      為完成求得CRC序列,可以使用一個15位移位寄存器CRC_RG(14:0)。若以NXTBIT標(biāo)記該位流的下一位,它由從幀起始至數(shù)據(jù)場結(jié)束的無填充位的序列給定。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序列開始或者存在一個出錯狀態(tài))   得到CRC序列為:000001000110101,發(fā)送/接收數(shù)據(jù)場的最后一位后,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并行算法是查表法及基于查表法而導(dǎo)出的一些方法。這些方法均需要存儲長度較大的CRC余數(shù)表,隨著并行度的增加,余數(shù)表的長度大大增加(按指數(shù)增加),其現(xiàn)實性亦隨之大大降低。   該算法事先把待校驗的信息碼P的所有CRC碼全部計算出來,放在一個表里,編碼時只要根據(jù)P從表中找出對應(yīng)的值進行處理即可。其硬件實現(xiàn)示意框圖如圖2所示。編碼解碼前清零CRC寄存器。編碼時待信息碼P輸入結(jié)束,CRC寄存器的值即為校驗碼Q;解碼校驗時待傳送碼P輸入結(jié)束時,若CRC寄存器中的值為零,則表明傳輸無誤。該算法執(zhí)行速度快,適合于高速通信場合,但由于需要大容量的存儲表,花費的硬件資源較串行算法要大得多。 [align=center] 圖2 并行算法示意圖 Fig.2 The Schematic drawing of Parallel Algorithm[/align]   為使(n,k)碼能具體指出數(shù)據(jù)在傳輸中出錯的位,數(shù)據(jù)位數(shù)k和校驗位數(shù)r之間應(yīng)滿足海明不等式:k+r<2[sup]r[/sup]-1 。為簡明起見,這里假設(shè)欲傳送的數(shù)據(jù)代碼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 總結(jié)   本文在分析了CRC計算原理的基礎(chǔ)上,仔細運用VHDL的特點進行串、并行CRC算法建模從而實現(xiàn)的設(shè)計,不僅具備采用公式法設(shè)計所具有的優(yōu)點,還能很好地適用于各種數(shù)據(jù)塊大小不同、生成多項式選取不同的CRC編、解碼運用場合,明顯減輕設(shè)計開發(fā)工作量,大幅縮短產(chǎn)品的研發(fā)周期。此外,由于生成結(jié)果占用的硬件資源很少,只需利用系統(tǒng)集成芯片中剩余的少量資源即可實現(xiàn),在當(dāng)前大量的系統(tǒng)設(shè)計實現(xiàn)趨向單芯片化的大潮下,更具生命力。 參考文獻   [1] 王海光,并行CRC算法硬件實現(xiàn)研究與VHDL設(shè)計[J]. 漳州師范學(xué)院學(xué)報(自然科學(xué)版),2007年第4期(總第58期),51-56.   [2] 李永忠,通用并行CRC計算原理及其硬件實現(xiàn)方法[J]. 西北民族學(xué)院學(xué)報(自然科學(xué)版),2 0 0 2年3月第23卷總第43期,33-37.   [3] 蔣安平,循環(huán)冗余校驗碼(CRC)的硬件并行實現(xiàn)[J]. 微電子學(xué)與計算機,2007年第24卷第2期,107-109,112.

標(biāo)簽:

點贊

分享到:

上一篇:基于虛擬儀器的手機自動測試...

下一篇:微能WIN-V63矢量控制變頻器在...

中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(www.treenowplaneincome.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權(quán)法律責(zé)任。

網(wǎng)站簡介|會員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

中國傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號