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