CAN協(xié)議中CRC編碼的硬件實(shí)現(xiàn)
關(guān)鍵詞 CAN協(xié)議;CRC檢驗(yàn);串行;并行
1 引言
通信系統(tǒng)總線在傳輸信息時(shí),不可避免要受到各種干擾的影響,使得傳輸信息出錯(cuò)。CAN協(xié)議中,為了保證幀傳輸?shù)目煽啃院洼^高的檢錯(cuò)效率,其采用了以下幾種檢錯(cuò)方式:位錯(cuò)誤、填充錯(cuò)誤、CRC錯(cuò)誤、格式錯(cuò)誤及應(yīng)答錯(cuò)誤檢測(cè)。通過以上檢錯(cuò)方式,它對(duì)于受損報(bào)文檢測(cè)不到其受損的概率為:報(bào)文受損率*4.7*10-11,因而CAN總線極高的檢錯(cuò)率使得它目前被廣泛應(yīng)用到工業(yè)控制、通信、汽車甚至軍事等多個(gè)領(lǐng)域。CRC檢驗(yàn)作為CAN協(xié)議中一種重要的且行之有效的檢錯(cuò)方式,它的生成多項(xiàng)式可以檢驗(yàn)7級(jí),具有編碼簡(jiǎn)單且誤判率低的優(yōu)點(diǎn)。
2 CRC檢驗(yàn)原理
CAN協(xié)議中規(guī)定,需要對(duì)幀起始、仲裁場(chǎng)、控制場(chǎng)和數(shù)據(jù)場(chǎng)(若存在的話)組成的未經(jīng)填充的位流進(jìn)行CRC編碼。具體實(shí)現(xiàn)方法為:被除多項(xiàng)式的系數(shù)由幀起始、仲裁場(chǎng)、控制場(chǎng)、數(shù)據(jù)場(chǎng)(若存在的話)及15位(最低系數(shù))0組成的未經(jīng)填充的位流給定,而生成多項(xiàng)式為X15+X14+X10+X8+X7+X4+X3+1,被除多項(xiàng)式被生成多項(xiàng)式除(系數(shù)按模-2計(jì)算),余數(shù)即為將要發(fā)至總線的CRC序列。發(fā)送節(jié)點(diǎn)和接收接點(diǎn)的CAN控制器均采用相同的方法生成CRC檢驗(yàn)碼,并與發(fā)送節(jié)點(diǎn)送出的CRC檢驗(yàn)碼進(jìn)行比較,以判斷報(bào)文是否出錯(cuò),若出錯(cuò),CAN控制器會(huì)依據(jù)總線仲裁原則及受損報(bào)文優(yōu)先發(fā)送原則對(duì)已損壞報(bào)文自動(dòng)進(jìn)行重發(fā)。
3 CRC檢驗(yàn)碼電路的硬件實(shí)現(xiàn)
CRC檢驗(yàn)碼硬件上的實(shí)現(xiàn),可以采用串行和并行兩種實(shí)現(xiàn)方式。在串行方式中,需編碼的位流按位逐位輸入,位流輸入完成后生成檢驗(yàn)碼,檢驗(yàn)碼緊隨需檢驗(yàn)的位流發(fā)出或接收到。并行方式中需檢驗(yàn)的位流每k位輸入到檢驗(yàn)碼生成電路中,因而檢驗(yàn)碼的生成效率大大高于串行方式。以下針對(duì)CAN 協(xié)議中CRC檢驗(yàn)的生成多項(xiàng)式進(jìn)行闡述。
3.1 CRC檢驗(yàn)碼的串行實(shí)現(xiàn)
CAN協(xié)議中CRC碼為15位,需要15位的移位寄存器來實(shí)現(xiàn),移位寄存器c0c1c2……c12c13c14在CRC檢驗(yàn)碼生成過程中寄存CRC檢驗(yàn)碼的中間值,計(jì)算完成后其值即為最終的CRC檢驗(yàn)碼。設(shè)c(t)=[c0c1c2……c12c13c14]為t時(shí)刻移位寄存器的狀態(tài),復(fù)位時(shí)初始狀態(tài)時(shí)c(0)=[ 000……000]。移位寄存器的狀態(tài)轉(zhuǎn)換方程為:
c(t+1)= [c0c1c2……c12c13]*[0|I14](c14dst)*g
= [c0c1c2……c12c13]*[0|I14]c14*gdst*g
= [c0c1c2……c12c13 c14]*Adst*g
= c(t) *Adst*g
上式中,I14為14階單位陣,dst為串行輸入數(shù)據(jù),表示異或,g=[g0g1……g13g14]為生成多項(xiàng)式的系數(shù)行矩陣,而A為n階方陣。
依據(jù)以上的CRC檢驗(yàn)碼的狀態(tài)轉(zhuǎn)換方程實(shí)現(xiàn)的RTL級(jí)的VHDL代碼如下:
c=ds xor c(14);
if(rst='0')then
c=(others=>'0');
elsif(rising_edge(clk))then
if(en_transmit='0')then
c=(others=>'0');
elsif(en_crc_code='1' and f_ds='1' and f_ds_sync='0')then
if(c ='1')then
c(14 downto 1)=c(13 downto 0) xor "10001011001100";
c(0)='1';
else
c(14 downto 1)=c(13 downto 0);
c(0)='0';
end if;
end if;
end if;
在以上代碼中,rst 為外部復(fù)位信號(hào),en_transmit 為幀發(fā)送使能信號(hào),en_crc_code 為CRC代碼編碼使能信號(hào),ds為輸入的串行數(shù)據(jù),f_ds與ds同時(shí)有效,f_ds='1' and f_ds_sync='0'代表f_ds的上升沿,c為15位移位寄存器,用于寄存CRC檢驗(yàn)碼的中間結(jié)果并輸出其最終結(jié)果。
需注意的是:信號(hào)en_crc_code在發(fā)送支路中和接收支路中應(yīng)包含需編碼位流的填充和解除填充信息(即填充位不進(jìn)行編碼)。
3.2 CRC檢驗(yàn)碼的并行實(shí)現(xiàn)
CRC檢驗(yàn)碼的并行實(shí)現(xiàn)方式,CAN協(xié)議中未給出,但并行實(shí)現(xiàn)方式具有很高的檢驗(yàn)碼生成效率,很有必要采用,以下給出其實(shí)現(xiàn)方法。其狀態(tài)轉(zhuǎn)移方程可表示為:
式中,c為15位移位寄存器,復(fù)位時(shí)各位均為0,在檢驗(yàn)碼生成過程中,寄存CRC檢驗(yàn)碼的中間值,其值每輸入k位數(shù)據(jù)變化一次,編碼完成后輸出最終的檢驗(yàn)碼,c(t)和c(t+k)分別為c在t時(shí)刻及t+k時(shí)刻的狀態(tài),實(shí)際應(yīng)用中c(t+k)表示緊隨c(t)狀態(tài)的并行k位數(shù)據(jù)輸入后的狀態(tài),k 為并行寬度,此處取8,dp為k位并行輸入數(shù)據(jù),A即為3.1節(jié)所述方陣,
,其中的G亦為3.1節(jié)所述的生成多項(xiàng)式的系數(shù)行矩陣。矩陣運(yùn)算過程中, 需注意的是:矩陣乘積的結(jié)果需進(jìn)行模2處理,即奇數(shù)用1代替,偶數(shù)以0代替。由此得到基于CAN協(xié)議中生成多項(xiàng)式的8位并行CRC檢驗(yàn)碼邏輯表,如表1所示。寄存器每位的表示如c6= c9c13dp2dp6。在實(shí)際編碼中,需添加一些控制信號(hào),如異步復(fù)位信號(hào)、編碼同步清零信號(hào)、編碼同步使能信號(hào)等。
表1 8位并行CRC檢驗(yàn)碼邏輯表
c(t+k) | c(t)、dp |
c0 | c7 c8 c9 c10 c11 c13 c14 dp 0 dp1 dp2 dp3 dp4 dp6 dp7 |
c1 | c8 c9 c10 c11 c12 c14 dp1 dp2 dp3 dp4 dp5 dp7 |
c2 | c9 c10 c11 c12 c13 dp2 dp3 dp4 dp5 dp6 |
c3 | c7 c8 c9 c12 dp0 dp1 dp2 dp4 |
c4 | c7 c11 c14 dp4 dp7 dp10 |
c5 | c8 c12 dp1 dp5 |
c6 | c9 c13 dp2 dp6 |
c7 | c7 c8 c9 c11 c13 dp0 dp1 dp2 dp4 dp5 |
c8 | c0 c7 c11 c12 c13 dp0 dp4 dp5 dp6 |
c9 | c1 c8 c12 c13 c14 dp1 dp5 dp6 dp7 |
c10 | c2 c7 c8 c10 c11 dp0 dp1 dp3 dp4 |
c11 | c3 c8 c9 c11 c12 dp1 dp2 dp4 dp5 |
c12 | c4 c9 c10 c12 c13 dp6 dp2 dp3 dp5 |
c13 | c5 c10 c11 c13 c14 dp3 dp4 dp6 dp7 |
c14 | c6 c7 c8 c9 c10 c12 c13 dp0 dp1 dp2 dp3 dp5 dp7 |
3.3 性能對(duì)比
用VHDL語言對(duì)兩種CRC檢驗(yàn)碼生成方法實(shí)現(xiàn)編碼后,利用Model Technology公司的仿真軟件ModelSim SE PLUS 5.6a進(jìn)行了功能仿真以驗(yàn)證原理及編碼的正確性。又利用Exemplar Logic公司的綜合工具LeonardoSpectrum對(duì)兩種代碼分別進(jìn)行了綜合,綜合過程中FPGA芯片選取Xinlinx公司的 2s200pq208,速度等級(jí)為5級(jí),優(yōu)化采取自動(dòng)優(yōu)化方式,結(jié)果如表2所示:
表2 串行和并行CRC編碼性能對(duì)比
Area (LUTs) | Delay (ns) | DFFs | Clock (MHz) | |
并行方式 | 35 | 8 | 15 | 119.6 |
串行方式 | 8 | 6 | 15 | 160.9 |
由上表可以計(jì)算出,兩種實(shí)現(xiàn)方式的速度比為119.6*k/160.9=119.6*8/160.9=5.95,消耗硬件資源比為4.375,時(shí)間延遲比為1.33,因而二者性能有很大的差異。
4 結(jié)論
由以上討論可以看出:采用串行實(shí)現(xiàn)方法、原理和電路結(jié)構(gòu)簡(jiǎn)單,消耗硬件資源少,可以工作在較高的時(shí)鐘頻率下;采用并行實(shí)現(xiàn)方法、原理和實(shí)現(xiàn)電路復(fù)雜,消耗硬件資源多,工作頻率雖然低于串行方式,但生成CRC檢驗(yàn)碼的速度(指效率)大大高于串行方式。因而,串行實(shí)現(xiàn)方法適合于硬件資源緊缺,檢驗(yàn)碼生成速度要求不高的場(chǎng)合;而并行實(shí)現(xiàn)方法適用于硬件資源豐富,檢驗(yàn)碼生成速度要求較高的場(chǎng)合。
在實(shí)際設(shè)計(jì)中,采用哪一種CRC檢驗(yàn)方式,還需要考慮收發(fā)幀的需填充位流的結(jié)構(gòu)。為了滿足CAN協(xié)議的規(guī)定要求(即需檢驗(yàn)幀起始位,仲裁場(chǎng)、控制場(chǎng)和數(shù)據(jù)場(chǎng)(若存在的話)組成的未經(jīng)填充的位流,位流總長(zhǎng)度為整數(shù)字節(jié)多一位),發(fā)送支路采用串行方式,可完全按照協(xié)議要求生成CRC檢驗(yàn)碼,接收支路由于多了 15位CRC檢驗(yàn)碼(外加幀起始位恰好為2個(gè)字節(jié)),可采用8位并行方式實(shí)現(xiàn)CRC檢驗(yàn)。
參考文獻(xiàn):
1BOSCH CAN Specification version 2.0
2賈麗媛,戴光明. ATM協(xié)議處理中CRC的并行實(shí)現(xiàn). 湖南城市學(xué)院學(xué)報(bào),(自然科學(xué)版)
第13卷,第4期 2004年12月:68~69
3 侯伯亨, 顧新 .VHDL硬件描述語言與數(shù)字邏輯電路設(shè)計(jì). 西安電子科技大學(xué)出版社
評(píng)論