ZHANG Yan,REN Yongfeng,QI Lei,YAO Zong
(Science and Dynamic Testing of Ministry and Education Key Laboratory Instrument of North University of China,Taiyuan 030051,China)
The Implementation of CRC Algorithm Based on FPGA
ZHANG Yan,REN Yongfeng*,QI Lei,YAO Zong
(Science and Dynamic Testing of Ministry and Education Key Laboratory Instrument of North University of China,Taiyuan 030051,China)
As FPGA is high speed,high efficiency,flexible and stable,high integration,etc.,so the use of FPGA in serial communications to achieve serial communication is essential.Due to the uncertainty in communication transmission and interference,serial communication often appears abnormal situation.Thus,adding the CRC in serial communication,can greatly improve the reliability of communication.On the basis of the discussion about the principles of the CRC,we present with the principle of hardware achievement and uses VHDL hardware description language to achieve CRC check,to verify the feasibility of the program.
electron;FPGA;CRC check;serial communication;VHDL
信息在傳遞過程中,可能因某種原因使傳輸?shù)臄?shù)據(jù)發(fā)生錯誤。為減少和避免這類錯誤的發(fā)生,除提高硬件的可靠性外,在數(shù)據(jù)的編碼上也應提供檢錯和糾錯的支持。具體做法是:在要傳送的數(shù)據(jù)代碼中加入若干個校驗位,使之在傳送過程中若發(fā)生錯誤則會生成非法代碼而被發(fā)現(xiàn),甚至能根據(jù)非法代碼確定錯誤的位置而給予糾正,這種具有檢錯或糾錯能力的編碼即校驗碼[2]。CRC碼也叫循環(huán)冗余校驗碼,它是一種高效能的檢錯和糾錯碼,它可以把99.997%以上的各種錯誤都檢查出來,是數(shù)據(jù)通信領域中最常用的一種差錯校驗碼;其特征是信息字段和校驗字段的長度可以任意選定[3]。
CRC校驗碼是一種典型的分組碼,碼組的構成如圖1所示,由k個信息碼元和n-k個檢驗碼元構成,CRC碼也稱為('n,k)碼。
圖1 CRC校驗碼
現(xiàn)以圖2為例說明CRC校驗原理:CRC校驗原理類似于算數(shù)中的除法運算,其中用到的減運算相當于CRC校驗中的XOR(異或)運算;在本例中,原始數(shù)據(jù)為1111,“除數(shù)”1001為生成多項式,也稱為POLY,常用G(x)表示;得到的“余數(shù)”110即為CRC校驗碼[4]。
圖2 CRC校驗原理框圖
校驗步驟為:
(1)首先將發(fā)送端要發(fā)送的數(shù)據(jù)進行擴展(擴展位數(shù)=生成多項式的位數(shù)-1);數(shù)據(jù)位進行擴展,是為了所有的數(shù)據(jù)位都可以處理到;
(2)按圖2中(a)所示的步驟,計算CRC碼;
(3)發(fā)送端將CRC碼加到原始數(shù)據(jù)之后,一起發(fā)送出去;
(4)接收端用接收到的數(shù)據(jù),除以與發(fā)送端相同的POLY值,如果計算得到的余數(shù)為0,說明接收到的數(shù)據(jù)正確,如圖2(b)所示;反之則不正確[5]。
在數(shù)據(jù)通信中,采用CRC校驗方法,可使通信的誤碼率大為降低,確保了數(shù)據(jù)通信的可靠性。其原理圖框圖如圖3所示。
圖3 CRC校驗硬件實現(xiàn)原理框圖
本設計采用Xilinx公司Spartan-3系列XC3S400 FPGA作為主控制器,使用36.864 MHz晶振,通過VHDL語言對FPGA編程;采用的ADC轉換芯片為16 bit精度的AD7621,為了節(jié)省FPGA的I/O口資源,AD7621采用8 bit并行口工作模式,模擬量轉換成數(shù)字量后,由BYTE信號控制AD7621向FPGA輸出高8 bit和低8 bit?;诖?,設計思想總結為:先將模擬量數(shù)據(jù)高8 bit鎖存,同時將高8 bit數(shù)據(jù)作為CRC校驗模塊的輸入并計算其CRC校驗碼,并將CRC校驗碼轉存入下一級的FIFO中,低8 bit模擬量數(shù)據(jù)同理,詳見表1。
表1 發(fā)送端原始數(shù)據(jù)及CRC校驗碼的鎖存與計算
因此,發(fā)送模塊、接收模塊的FPGA內(nèi)部原理圖分別如圖4、圖5所示,Analog_cha_ctr模塊主要用于數(shù)據(jù)幀的接收,實現(xiàn)模擬量數(shù)據(jù)流的控制并分別計算高8 bit CRC碼、低8 bit CRC碼,然后將接收到的數(shù)據(jù)幀轉存到下一級FIFO中。Interface_ctrl模塊用于接收數(shù)據(jù),并將接收到的數(shù)據(jù)與接收到的CRC碼進行異或運算,如果運算結果為“0000000”,則說明接收到的數(shù)據(jù)正確,反之,則反饋給接收端一個信號,接收端重新發(fā)送數(shù)據(jù)[6]。
圖4 發(fā)送端FPGA實現(xiàn)CRC校驗原理圖
圖5 接收端FPGA實現(xiàn)CRC校驗原理圖
CRC校驗原理對應算法的實現(xiàn)主要由一個r bit的移位寄存器和一些可控異或單元組成,其硬件實現(xiàn)示意框圖如圖6所示。
圖6中由R0、R1、…、Rr-1構成的CRC寄存器是一個r bit移位寄存器組,用來存儲r bit的CRC校驗碼R(x)。運算控制開關g1、g2、…、gr-1的位置與生成多項式G(x)的系數(shù)相關,對應系數(shù)1的開關接通反饋支路(上端),否則接地(右側)。
這種算法簡單,容易實現(xiàn),對任意長度生成多項式的g(x)都適用。因為這種算法一次只能處理一位數(shù)據(jù),故主要用于串行通信中。
具體算法如下:
圖6 VHDL邏輯設計實現(xiàn)原理圖
(1)初始化寄存器;
(2)將寄存器中的數(shù)據(jù)左移一位,讀入1個新的數(shù)據(jù)位并置于寄存器的最低位;如果移出的數(shù)據(jù)位為0,不做處理,如果為1,則將寄存器中的數(shù)據(jù)與POLY項進行異或運算;
(3)重復步驟2,直至將所有的數(shù)據(jù)位處理完;
(5)寄存器的內(nèi)容即為CRC校驗碼[7];
邏輯如下:
首先利用Xilinx ISE 13.1對計算CRC校驗碼的模塊進行了仿真,利用軟件提供的VHDL Test Bench模塊,可以對代碼進行動態(tài)的全面測試。因Xilinx ISE 13不支持使用波形生成仿真向量的方法,須使用HDL語言建立測試向量進行仿真向量行為的描述。測試向量文件如下:
其仿真結果如圖7所示,圖中data_in即為程序設定的原始數(shù)據(jù),crc_out為計算出的對應的CRC碼,Poly項為:11010101。例如:原始數(shù)據(jù)11111111的CRC碼即為0001110。
圖7 CRC校驗碼生成模塊仿真
圖8為將CRC模塊加入到源程序中的時序仿真圖,其中fosc為時鐘信號,glrn為復位信號,flag_cj為采集信號,byte1、byte0用于控制數(shù)據(jù)的高8 bit、低8 bit切換,poly為選定的生成多項式,div_cnt為計數(shù)器,ad0_din即為采集到的16 bit模擬量數(shù)據(jù),ad_data用于鎖存數(shù)據(jù)的高8 bit、低8 bit,kzdata為將原始數(shù)據(jù)進行擴展后的數(shù)據(jù),crc_out即為計算出的CRC校驗碼。
圖8(a)所示為:當計數(shù)器div_cnt為16時,ad0 _din為采集到的原始數(shù)據(jù)的高8 bit,首先將數(shù)據(jù)鎖存到ad_data,ad_data為1111111000000000;當計數(shù)器為17時,將ad_data的高8 bit數(shù)據(jù)進行擴展,并計算其CRC碼,計算結果為1011011。
圖8(b)所示為:當計數(shù)器div_cnt為20時,ad0 _din為采集到的原始數(shù)據(jù)的低8 bit,首先將數(shù)據(jù)鎖存到ad_data,ad_data為1111111010101001;當計數(shù)器為21時,將ad_data的高8 bit數(shù)據(jù)進行擴展,得到擴展后的數(shù)據(jù)為:101010010000000,再計算其CRC碼,計算結果為1101101。
圖8 發(fā)送端CRC時序仿真
本文基于CRC校驗原理,詳細介紹了CRC校驗的硬件實現(xiàn)原理;在實現(xiàn)了串口通信數(shù)據(jù)的采集、處理與發(fā)送的基礎上,加入了CRC檢驗碼的生成過程及具體校驗過程,在接收端將數(shù)據(jù)存儲到FLASH中之前,總是先判斷接收到的數(shù)據(jù)是否正常,若有誤碼,可通過CRC校驗及時發(fā)現(xiàn),接收端通過收到的反饋信號重新發(fā)送數(shù)據(jù),使得誤碼的概率得到大幅度的降低[8];通過Xilinx ISE 13.1自帶的仿真軟件進行了仿真,從而驗證了該設計的可行性。該方案的特點是實現(xiàn)容易,速度快,效率高,實用性強。
[1]姚七棟,張春玉.CRC校驗及其軟件實現(xiàn)[J].現(xiàn)代電子技術,2006,29(13):67-68.
[2]張樹剛,張遂南,黃士坦.CRC校驗碼并行計算的FPGA實現(xiàn)[J].計算機技術與發(fā)展,2007,17(2):56-58.
[3]同曉榮.基于FPGA的PCM基群設備串行通訊CRC校驗的實現(xiàn)[J].河南科學,2012,30(2):231-234.
[4]季鵬輝,孟丁,任勇峰.基于FPGA的16 bit CRC校驗查表法設計[J].電子器件,2013,36(4):580-584.
[5]金志超,張磊,黃莉莉.遠程地面測發(fā)控系統(tǒng)在PLC中嵌入CRC代碼校驗[J].航天控制,2009,27(2):81-83.
[6]周泰莢,王新梅,葛嫦.在CRC校驗中擴展縮短碼的設計與性能分析[J].西北工業(yè)大學學報,2001,22(5):640-642.
[7]林凱宏,游林儒,王立松.CRC校驗算法在I/O擴展上的應用[J].控制與檢測,2009(12):69-77.
[8]張增波,陳仲林,肖劉.基于FPGA的內(nèi)置并行CRC校驗的UART[J].總線與網(wǎng)絡,2013,28(2):30-32.
張焱(1989-),女,漢族,山西平遙人,中北大學電路與系統(tǒng)專業(yè)在讀研究生,研究方向為電路與系統(tǒng),1039224079@ qq.com;
任勇峰(1968-),男,漢族,山西中陽人,博士,教授,現(xiàn)從事動態(tài)測試、高速數(shù)據(jù)采集等領域的研究。
EEACC:621010.3969/j.issn.1005-9490.2015.01.047
基于FPGA的CRC校驗算法的實現(xiàn)
張焱,任勇峰*,齊蕾*,姚宗
(中北大學儀器科學與動態(tài)測試教育部重點實驗室,太原030051)
由于FPGA具有速度快、效率高、靈活穩(wěn)定、集成度高等優(yōu)點,所以在串行通信中采用FPGA來實現(xiàn)串口通信是十分必要的。由于通信傳輸?shù)牟淮_定性以及干擾等原因,串行通信經(jīng)常會出現(xiàn)異常情況[1]。因此,在串行通信中添加CRC校驗,可大幅度提高通信的可靠性。在論述了CRC校驗原理的基礎上,提出了硬件實現(xiàn)原理,并用VHDL硬件描述語言實現(xiàn)CRC校驗,驗證了方案的可行性。
電子;FPGA;CRC校驗;串行通信;VHDL
TN919.3
A文獻標識碼:1005-9490(2015)01-0222-05
2014-03-17修改日期:2014-04-30