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