在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Verilog語言實現(xiàn)CRC校驗

FPGA設(shè)計論壇 ? 來源:博客園 ? 2025-03-24 10:36 ? 次閱讀

1 前言

(1) 什么是CRC校驗?

CRC即循環(huán)冗余校驗碼:是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯功能,對數(shù)據(jù)進行多項式計算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。

LFSR計算CRC,可以用多項式G(x)表示,G(x) = X16+X12+X5+1模型可如下圖所示。

d3faadae-062d-11f0-9310-92fbcf53809c.png

(2) 校驗原理

其根本思想就是先在要發(fā)送的幀后面附加一個數(shù)(這個就是用來校驗的校驗碼,但要注意,這里的數(shù)也是二進制序列的,下同),生成一個新幀發(fā)送給接收端。當(dāng)然,這個附加的數(shù)不是隨意的,它要使所生成的新幀能與發(fā)送端和接收端共同選定的某個特定數(shù)整除(注意,這里不是直接采用二進制除法,而是采用一種稱之為“模2除法”)。到達接收端后,再把接收到的新幀除以(同樣采用“模2除法”)這個選定的除數(shù)。因為在發(fā)送端發(fā)送數(shù)據(jù)幀之前就已通過附加一個數(shù),做了“去余”處理(也就已經(jīng)能整除了),所以結(jié)果應(yīng)該是沒有余數(shù)。如果有余數(shù),則表明該幀在傳輸過程中出現(xiàn)了差錯。

要校驗的數(shù)據(jù)加上此數(shù)據(jù)計算出來的crc組成新的數(shù)據(jù)幀,如下圖所示。

d41a5ad2-062d-11f0-9310-92fbcf53809c.png

模2除法:

模2除法與算術(shù)除法類似,但每一位除的結(jié)果不影響其它位,即不向上一位借位,所以實際上就是異或。在循環(huán)冗余校驗碼(CRC)的計算中有應(yīng)用到模2除法。

(3) 步驟

CRC校驗中有兩個關(guān)鍵點,一是預(yù)先確定一個發(fā)送送端和接收端都用來作為除數(shù)的二進制比特串(或多項式),可以隨機選擇,也可以使用國際標準,但是最高位和最低位必須為1;二是把原始幀與上面計算出的除數(shù)進行模2除法運算,計算出CRC碼。

1. 選擇合適的除數(shù)

2. 看選定除數(shù)的二進制位數(shù),然后再要發(fā)送的數(shù)據(jù)幀上面加上這個位數(shù)-1位的0,然后用新生成的幀以模2除法的方式除上面的除數(shù),得到的余數(shù)就是該幀的CRC校驗碼。注意,余數(shù)的位數(shù)一定只比除數(shù)位數(shù)少一位,也就是CRC校驗碼位數(shù)比除數(shù)位數(shù)少一位,如果前面位是0也不能省略。

3. 將計算出來的CRC校驗碼附加在原數(shù)據(jù)幀后面,構(gòu)建成一個新的數(shù)據(jù)幀進行發(fā)送;最后接收端在以模2除法方式除以前面選擇的除數(shù),如果沒有余數(shù),則說明數(shù)據(jù)幀在傳輸?shù)倪^程中沒有出錯。

(4) 計算實例

現(xiàn)假設(shè)選擇的CRC生成多項式為G(X) = X4+ X3+ 1,要求出二進制序列10110011的CRC校驗碼。下面是具體的計算過程:

①將多項式轉(zhuǎn)化為二進制序列,由G(X) = X4+ X3+ 1可知二進制一種有五位,第4位、第三位和第零位分別為1,則序列為11001

②多項式的位數(shù)位5,則在數(shù)據(jù)幀的后面加上5-1位0,數(shù)據(jù)幀變?yōu)?01100110000,然后使用模2除法除以除數(shù)11001,得到余數(shù)。

③將計算出來的CRC校驗碼添加在原始幀的后面,真正的數(shù)據(jù)幀為101100110100,再把這個數(shù)據(jù)幀發(fā)送到接收端。

④接收端收到數(shù)據(jù)幀后,用上面選定的除數(shù),用模2除法除去,驗證余數(shù)是否為0,如果為0,則說明數(shù)據(jù)幀沒有出錯。

2 流程

(1)并行計算crc用verilog語言描述是復(fù)雜繁瑣的,所以可以使用在線工具生成verilog或者VHDL模板:http://www.easics.com/webtools/crctool,模板生成的代碼稍加修改即可使用。

(2)本次校驗?zāi)P蜑镚(x) = X16+X12+X5+1。在在線工具中操作相關(guān)選項生成模板。

d42c6b0a-062d-11f0-9310-92fbcf53809c.png

模板v文件如下:

 1 ////////////////////////////////////////////////////////////////////////////////
 2 // Copyright (C) 1999-2008 Easics NV.
 3 // This source file may be used and distributed without restriction
 4 // provided that this copyright statement is not removed from the file
 5 // and that any derivative work contains the original copyright notice
 6 // and the associated disclaimer.
 7 //
 8 // THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
 9 // OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
10 // WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
11 //
12 // Purpose : synthesizable CRC function
13 //   * polynomial: x^16 + x^12 + x^5 + 1
14 //   * data width: 16
15 //
16 // Info : tools@easics.be
17 //        http://www.easics.com
18 ////////////////////////////////////////////////////////////////////////////////
19 module CRC16_D16;
20 
21   // polynomial: x^16 + x^12 + x^5 + 1
22   // data width: 16
23   // convention: the first serial bit is D[15]
24   function [15:0] nextCRC16_D16;
25 
26     input [15:0] Data;
27     input [15:0] crc;
28     reg [15:0] d;
29     reg [15:0] c;
30     reg [15:0] newcrc;
31   begin
32     d = Data;
33     c = crc;
34 
35     newcrc[0] = d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[8] ^ c[11] ^ c[12];
36     newcrc[1] = d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[9] ^ c[12] ^ c[13];
37     newcrc[2] = d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[10] ^ c[13] ^ c[14];
38     newcrc[3] = d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[11] ^ c[14] ^ c[15];
39     newcrc[4] = d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[12] ^ c[15];
40     newcrc[5] = d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[13];
41     newcrc[6] = d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[14];
42     newcrc[7] = d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[7] ^ c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[15];
43     newcrc[8] = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[8] ^ c[11] ^ c[12] ^ c[14] ^ c[15];
44     newcrc[9] = d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[9] ^ c[12] ^ c[13] ^ c[15];
45     newcrc[10] = d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[5] ^ c[9] ^ c[10] ^ c[13] ^ c[14];
46     newcrc[11] = d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[6] ^ c[10] ^ c[11] ^ c[14] ^ c[15];
47     newcrc[12] = d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[7] ^ c[8] ^ c[15];
48     newcrc[13] = d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[8] ^ c[9];
49     newcrc[14] = d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[9] ^ c[10];
50     newcrc[15] = d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[10] ^ c[11];
51     nextCRC16_D16 = newcrc;
52   end
53   endfunction
54 endmodule

(3)修改模板最終如下:

 1 `timescale 1ns/1ps
 2 module crc16_test (
 3     input     wire              i_clk                 , //時鐘;
 4     input     wire              i_rst_n               , //同步復(fù)位;
 5     input     wire              i_din_valid           , //輸入數(shù)據(jù)有效;
 6     input     wire    [15:0]    i_din                 , //輸入數(shù)據(jù);
 7     output    wire              o_dout_valid          , //輸出CRC值有效;
 8     output    wire    [15:0]    o_dout                  //輸出CRC;         
 9 );
10 reg [15:0] r_dout;
11 wire [15:0] d;
12 wire [15:0] c;
13 assign d = i_din;
14 assign c = r_dout;
15 always @(posedge i_clk) begin
16     if (~i_rst_n) 
17         r_dout <= 16'hffff; //初始值為ffff;
18     else if (i_din_valid) 
19     begin //計算邏輯;
20         r_dout[0]  = d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[8] ^ c[11] ^ c[12];
21         r_dout[1]  = d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[9] ^ c[12] ^ c[13];
22         r_dout[2]  = d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[10] ^ c[13] ^ c[14];
23         r_dout[3]  = d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[11] ^ c[14] ^ c[15];
24         r_dout[4]  = d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[12] ^ c[15];
25         r_dout[5]  = d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[13];
26         r_dout[6]  = d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[14];
27         r_dout[7]  = d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[7] ^ c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[15];
28         r_dout[8]  = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[8] ^ c[11] ^ c[12] ^ c[14] ^ c[15];
29         r_dout[9]  = d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[9] ^ c[12] ^ c[13] ^ c[15];
30         r_dout[10] = d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[5] ^ c[9] ^ c[10] ^ c[13] ^ c[14];
31         r_dout[11] = d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[6] ^ c[10] ^ c[11] ^ c[14] ^ c[15];
32         r_dout[12] = d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[7] ^ c[8] ^ c[15];
33         r_dout[13] = d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[8] ^ c[9];
34         r_dout[14] = d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[9] ^ c[10];
35         r_dout[15] = d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[10] ^ c[11];
36     end
37 end 
38 reg r_dout_valid = 0; 
39 always @(posedge i_clk) //輸入數(shù)據(jù)在一個時鐘內(nèi)完成CRC計算,下一個時鐘輸出;
40 begin
41     r_dout_valid <= i_din_valid;
42 end
43 
44 assign o_dout_valid = r_dout_valid;
45 assign o_dout = r_dout ;
46 
47 endmodule // end the crc16_test model;

3 仿真

仿真結(jié)果和在線工具計算結(jié)果進行比較,在線工具地址:http://www.ip33.com/crc.html。

(1)編寫tb文件,對代碼進行測試,測試結(jié)果如下圖所示:

d44e47b6-062d-11f0-9310-92fbcf53809c.png

(2)在線校驗。輸入需要校驗的數(shù)據(jù),選擇參數(shù)模型,輸入初始值(此次crc結(jié)果的前一個crc值,代碼中初始化為ffff)。可以對比發(fā)現(xiàn)計算無誤。

第一次計算0011(初始值為ffff),結(jié)果為1f1f。

第二次計算0013(初始值為1f1f),結(jié)果為d2c1。

d46b2020-062d-11f0-9310-92fbcf53809c.png

4 綜合

本次綜合參考芯片為:xc7k325tffg676-2

(1) 資源使用量如下圖所示。

d48a1d36-062d-11f0-9310-92fbcf53809c.png

(2) 模塊時鐘約束為100M,裕量如下圖所示,滿足時序要求。

d4981ddc-062d-11f0-9310-92fbcf53809c.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • crc
    crc
    +關(guān)注

    關(guān)注

    0

    文章

    201

    瀏覽量

    29762
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1358

    瀏覽量

    111036
  • 校驗碼
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    7665
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3433

    瀏覽量

    49548

原文標題:4 綜合

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦

    CRC算法和c語言實現(xiàn)

    CRC算法和c語言實現(xiàn)
    發(fā)表于 08-20 19:21

    Verilog并行CRC校驗

    Verilog并行CRC校驗
    發(fā)表于 08-20 21:52

    verilog語言實現(xiàn)電子鐘

    各位大神求救啊用verilog語言實現(xiàn)電子鐘
    發(fā)表于 05-04 16:37

    有關(guān)基于verilogCRC校驗的問題

    近期在做一個數(shù)據(jù)采集傳輸模塊,采集6000多個數(shù)據(jù)打包,使用CRC校驗。網(wǎng)上查找的相關(guān)verilog程序均是對單一數(shù)據(jù)處理的程序,沒有對一個完整數(shù)據(jù)包的處理。c倒是有之前使用過的程序,但語言
    發(fā)表于 03-11 15:34

    怎么用verilog HDL或VHDL去實現(xiàn)CRC校驗

    verilog HDL或VHDL去實現(xiàn)呢?首先了解CRC校驗的原理,我們剩下的事情就是搬磚的了。人并且總是喜歡偷懶,“拿來主義”的存在,甚囂塵上。熱心農(nóng)家們,一邊寫代碼,一邊維護各種開
    發(fā)表于 06-24 17:11

    CRC校驗代碼自動生成工具

    CRC校驗代碼自動生成工具根據(jù)輸入條件自動產(chǎn)生各種CRC的VHDL或verilog源程序
    發(fā)表于 05-20 11:16 ?294次下載
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗</b>代碼自動生成工具

    CRC算法原理及C語言實現(xiàn)

    CRC算法原理及C語言實現(xiàn):本文從理論上推導(dǎo)出CRC 算法實現(xiàn)原理,給出三種分別適應(yīng)不同計算機或微控制器硬件環(huán)境的C 語言程序。讀者更能根據(jù)
    發(fā)表于 09-23 23:38 ?31次下載

    Verilog HDL語言實現(xiàn)時序邏輯電路

    Verilog HDL語言實現(xiàn)時序邏輯電路 在Verilog HDL語言中,時序邏輯電路使用always語句塊來實現(xiàn)。例如,
    發(fā)表于 02-08 11:46 ?4788次閱讀

    CRC校驗碼算法的研究與實現(xiàn)

    為了提高實際通信中檢查信號傳輸錯誤的能力,提高和推廣CRC校驗技術(shù),本論文用邏輯代數(shù)知識、按模運算、代數(shù)知識和C語言編程工具設(shè)計了幾種具體實用的CRC
    發(fā)表于 05-28 15:41 ?0次下載

    CRC算法原理和CRC編碼的實現(xiàn)方式與使用VerilogCRC編碼進行描述

    泛的是CRC-32 標準。本文將以CRC-32 為例,說明CRC 編碼的實現(xiàn)方式以及如何用verilog
    發(fā)表于 08-06 16:39 ?36次下載
    <b class='flag-5'>CRC</b>算法原理和<b class='flag-5'>CRC</b>編碼的<b class='flag-5'>實現(xiàn)</b>方式與使用<b class='flag-5'>Verilog</b>對<b class='flag-5'>CRC</b>編碼進行描述

    使用verilog語言實現(xiàn)數(shù)字鐘的工程文件合集免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用verilog語言實現(xiàn)數(shù)字鐘的工程文件合集免費下載。
    發(fā)表于 03-02 08:00 ?10次下載
    使用<b class='flag-5'>verilog</b><b class='flag-5'>語言實現(xiàn)</b>數(shù)字鐘的工程文件合集免費下載

    CRC校驗算法原理及c語言實現(xiàn)

    CRC校驗算法原理及c語言實現(xiàn)
    發(fā)表于 11-30 10:04 ?9次下載

    累加校驗和C語言實現(xiàn)

    累加校驗和C語言實現(xiàn)
    發(fā)表于 11-29 18:06 ?10次下載
    累加<b class='flag-5'>校驗</b>和C<b class='flag-5'>語言實現(xiàn)</b>

    CRC校驗原理及實現(xiàn)

    作者:王超首發(fā):電子電路開發(fā)學(xué)習(xí)目錄前言CRC算法簡介CRC計算CRC校驗CRC計算的C語言實現(xiàn)
    發(fā)表于 01-26 17:37 ?30次下載
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗</b>原理及<b class='flag-5'>實現(xiàn)</b>

    使用C語言實現(xiàn)CRC計算單元的例子

    使用C語言實現(xiàn)CRC計算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?1235次閱讀
    主站蜘蛛池模板: 好紧好爽的午夜寂寞视频 | 天天操天天谢 | 天堂网传媒 | 濑亚美莉vs黑人欧美视频 | 性欧美1819hd| 色香蕉色香蕉在线视频 | 97色在线视频| 2017天天操| 四虎影视地址 | 小雪被撑暴黑人黑人与亚洲女人 | 黄色在线免费看 | 免费a网址| 久久亚洲一级毛片 | 五月婷婷久 | 亚洲高清国产一线久久 | 精品精品国产理论在线观看 | 日日碰狠狠添天天爽五月婷 | 国产黄色在线 | 91成人免费在线视频 | 小说老卫陈红张敏陈法蓉 | sss华人在线play | 特级做a爰片毛片免费看 | 欧美成人免费观看bbb | 婷婷影院在线综合免费视频 | 日韩在线影院 | 免费网站成人亚洲 | 国产情侣草莓视频在线 | 欧美激情xxxx性bbbb | 奇米一区二区三区四区久久 | 高清视频免费观看 | 伊人久久大香线焦在观看 | 亚洲男同tv | 久久亚洲综合中文字幕 | 欧洲色妇 | 麻豆国产三级在线观看 | 亚洲午夜影视 | 天天艹天天 | 亚洲大色 | 三级在线免费 | 三级网址在线播放 | 国产精品美女久久久久网 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品