王玉玲++王燕鋒
摘 要 在數(shù)據(jù)輸出過(guò)程中,為保證數(shù)據(jù)的可靠性,通常會(huì)在數(shù)據(jù)的末尾加上校驗(yàn)信息。CRC校驗(yàn)技術(shù)編碼和解碼過(guò)程簡(jiǎn)單,糾錯(cuò)能力強(qiáng),被廣泛應(yīng)用于通信領(lǐng)域。本文介紹一種移位產(chǎn)生CRC校驗(yàn)碼的方法,并給出了其VHDL實(shí)現(xiàn)及仿真分析。
【關(guān)鍵詞】CRC 校驗(yàn)移位 CRC16 VHDL
在數(shù)據(jù)傳輸過(guò)程中,由于信道干擾,往往使得發(fā)送和接收的數(shù)據(jù)不一致。為了降低誤碼率,保證傳輸數(shù)據(jù)的可靠性,通常會(huì)改進(jìn)信道的傳輸質(zhì)量或在傳輸?shù)臄?shù)據(jù)中加入校驗(yàn)信息。在各種校驗(yàn)方法中,循環(huán)冗余校驗(yàn)CRC(CyclicRedundancy Check)是一種最常用的方法。CRC校驗(yàn)技術(shù)是一種十分有效的數(shù)據(jù)傳輸錯(cuò)誤檢測(cè)技術(shù),由于其編碼和解碼過(guò)程簡(jiǎn)單,檢錯(cuò)和糾錯(cuò)能力強(qiáng),廣泛應(yīng)用于通信領(lǐng)域用于實(shí)現(xiàn)差錯(cuò)控制。串行通信普遍應(yīng)用于工業(yè)通信控制領(lǐng)域,如何提高數(shù)據(jù)的傳輸可靠性尤為重要,現(xiàn)有的串口在數(shù)據(jù)傳輸過(guò)程中加入CRC校驗(yàn)可提高數(shù)據(jù)傳輸?shù)目煽啃浴F胀ù锌诓蛔詭RC校驗(yàn)功能,大多數(shù)應(yīng)用中都是通過(guò)軟件編程計(jì)算CRC碼后再附加在數(shù)據(jù)末尾傳輸?shù)模捎谲浖?zhí)行耗費(fèi)時(shí)間長(zhǎng),影響數(shù)據(jù)的傳輸速度。現(xiàn)場(chǎng)可編程門(mén)陣列FPGA (Field-Programmable Gate Array)在數(shù)字系統(tǒng)設(shè)計(jì)中已被廣泛使用。用硬件描述語(yǔ)言(VHDL)實(shí)現(xiàn)CRC校驗(yàn)碼的計(jì)算,然后下載到FPGA芯片中,硬件實(shí)現(xiàn)CRC校驗(yàn),與軟件實(shí)現(xiàn)相比,對(duì)數(shù)據(jù)的傳輸速度影響較小。本文介紹一種CRC16校驗(yàn)碼串行產(chǎn)生的方法,并給出了其VHDL實(shí)現(xiàn)及仿真分析。
1 CRC校驗(yàn)原理
在發(fā)送方要發(fā)送的K位數(shù)據(jù)碼后,以一定的規(guī)則產(chǎn)生一個(gè)r位用于校驗(yàn)的監(jiān)督碼,附加在原數(shù)據(jù)后面,構(gòu)成的信息碼為n=k+r位,因此,這種編碼又叫(n,k)碼。接收方根據(jù)通信雙方約定的規(guī)則進(jìn)行校驗(yàn),確定數(shù)據(jù)是否出錯(cuò)。這個(gè)規(guī)則即“生成多項(xiàng)式”。K位數(shù)據(jù)碼表示為M(x),選擇合適的CRC生成多項(xiàng)式G(x),G(x)的最高次冪為r。把M(x)左移r位,即M(x)*xr對(duì)G(x)做不借位除法(即異或運(yùn)算),所得余數(shù)為CRC校驗(yàn)碼,即:
其中R(x)為CRC校驗(yàn)碼。發(fā)送方以上述原理生成校驗(yàn)碼附加在數(shù)據(jù)末尾發(fā)送出去,接收方接收到的數(shù)據(jù)也對(duì)同樣的G(x)做除法,如果余數(shù)為0,則認(rèn)為數(shù)據(jù)傳送無(wú)誤,否則按出錯(cuò)處理。
2 CRC16校驗(yàn)實(shí)現(xiàn)原理圖
常用的生成多項(xiàng)式有多種,如CRC4、CRC8、CRC16和CRC32等。計(jì)算CRC校驗(yàn)碼可以用串行和并行的方法實(shí)現(xiàn)。串行實(shí)現(xiàn)電路結(jié)構(gòu)簡(jiǎn)單,但比較耗時(shí),位數(shù)越多越費(fèi)時(shí)。并行實(shí)現(xiàn)電路結(jié)構(gòu)復(fù)雜,但節(jié)省時(shí)間。本文介紹一種采用CRC16生成多項(xiàng)式串行移位產(chǎn)生校驗(yàn)碼的計(jì)算過(guò)程。生成多項(xiàng)式為G(x)=g16x16+g15x15+……+g1x+g0,在實(shí)際使用中,并不需要考慮最高位,它總是被舍棄的,因此只要考慮余下16個(gè)數(shù)據(jù)位。在串行通信中實(shí)現(xiàn)移位計(jì)算CRC16校驗(yàn)碼的原理如圖1所示。
圖1中為乘法,⊕為異或。
圖1所示為CRC16校驗(yàn)原理圖由D觸發(fā)器、與門(mén)和異或門(mén)構(gòu)成。
實(shí)現(xiàn)原理:發(fā)送一個(gè)字節(jié)數(shù)據(jù),末尾加入16位校驗(yàn)碼。CRC16寄存器初始化為0,串行移入數(shù)據(jù),CRC16寄存器左移1位,檢查移除位,如果為1,CRC16寄存器與生成多項(xiàng)式異或,結(jié)果存入CRC16寄存器,如果不為0,則僅僅移位,不做異或。循環(huán)進(jìn)行24次后,C15……C0為所求校驗(yàn)碼。用Cik表示上一次移位后CRC的值,Cik+1表示本次移位CRC的值,其關(guān)系如式2所示。式2中i=1,2,3,4,……,15。
用CRC16產(chǎn)生校驗(yàn)碼由于G(x)并不是所有位都為1,因此其具體實(shí)現(xiàn)要簡(jiǎn)單得多。G(x)=x16+x15+x2+1是CRC16生成多項(xiàng)式中最常用形式,舍棄掉最高位,編碼為1000 0000 0000 0011,由式2可知,Cik和Cik+1的關(guān)系如式3所示。式3中i=2,15,j=1,3,4……14。
用該生成多項(xiàng)式產(chǎn)生校驗(yàn)碼,由于只有第15、2和0位為1,因此每次移位產(chǎn)生的CRC值中只要C15、C2及C0位和移出的位和對(duì)應(yīng)的g值有關(guān),CRC的其它位值都等于上次移位的CRC值中對(duì)應(yīng)低一位的值。其產(chǎn)生校驗(yàn)碼的原理圖只要在圖1中保留D寄存器及C15、C2和C0對(duì)應(yīng)的異或門(mén),其它位對(duì)應(yīng)的乘法和異或可以全部省去,大大簡(jiǎn)化了電路。
3 CRC校驗(yàn)在FPGA中的實(shí)現(xiàn)和仿真
在FPGA中進(jìn)行系統(tǒng)設(shè)計(jì),可采用硬件描述語(yǔ)言(HDL)設(shè)計(jì)也可以采用原理圖的設(shè)計(jì)方法。本文采用兩者結(jié)合形式進(jìn)行,采用自下而上的設(shè)計(jì)方法,先模塊化設(shè)計(jì)產(chǎn)生1位數(shù)據(jù)的CRC16校驗(yàn)碼,然后頂層文件調(diào)用以上的模塊產(chǎn)生8位數(shù)據(jù)的CRC16校驗(yàn)碼。頂層文件的實(shí)體定義為:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY work;
ENTITY CRC16 IS
port(CLK : IN STD_LOGIC;
d : IN STD_LOGIC_VECTOR(7 downto0);
c:OUT STD_LOGIC_VECTOR(15 downto 0));END CRC16;
設(shè)計(jì)采用的編程環(huán)境為QUARTUS II。由實(shí)體的定義可知,輸入信號(hào)有8位數(shù)據(jù)(D) 和時(shí)鐘信號(hào)(CLK),輸出信號(hào)為16位CRC校驗(yàn)碼。結(jié)構(gòu)體的實(shí)現(xiàn)流程圖如圖2所示。
在編程基礎(chǔ)上,建立仿真文件,對(duì)以上VHDL實(shí)現(xiàn)CRC16校驗(yàn)碼的程序進(jìn)行仿真測(cè)試,結(jié)果如圖3所示,與手工計(jì)算的結(jié)構(gòu)完全一致。如待傳送數(shù)據(jù)位00001110,采用G(x)=x16+x15+x2+1產(chǎn)生校驗(yàn)碼,校驗(yàn)碼碼為1000000000100111,與結(jié)果完全一致。
4 結(jié)束語(yǔ)
由以上VHDL設(shè)計(jì)的CRC校驗(yàn)碼產(chǎn)生模塊,仿真分析后,在實(shí)驗(yàn)室環(huán)境下,通過(guò)引腳配置,把程序下載到FPGA上進(jìn)行測(cè)試,結(jié)果與預(yù)期的相一致,因此證明本設(shè)計(jì)思路及方法是可用的。但要在實(shí)際串口通信中使用,還需要進(jìn)一步的分析和測(cè)試。
參考文獻(xiàn)
[1]梁海華,盤(pán)麗娜等.CRC查詢(xún)表及其并行矩陣生成方法[J].計(jì)算機(jī)科學(xué),2012,39(6A):154-156.
[2]王良俊,馬琪.USB3.0中的CRC校驗(yàn)原理與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù):2011,34(18):170-171.
[3]任勇峰,莊新敏.VHDL與硬件實(shí)現(xiàn)速成[M].北京:國(guó)防工業(yè)出版社,2005.
[4]王月琴,楊恒新.CRC碼串并結(jié)合算法的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2014,24(06):103-105.
[5]趙鴻圖,李衛(wèi)彬等.CRC編解碼算法及在通信規(guī)約DNP3.0中的應(yīng)用[J].河南理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2009.28(05):596-598.
作者簡(jiǎn)介
王玉玲(1979-),女,江西省景德鎮(zhèn)市人.工學(xué)碩士學(xué)位。畢業(yè)于東華理工大學(xué)?,F(xiàn)為湖州師范學(xué)院講師。研究方向?yàn)榍度胧较到y(tǒng)、集成電路設(shè)計(jì)。
作者單位
湖州師范學(xué)院 浙江省湖州市 313000