王玉玲++王燕鋒



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