色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

基于Verilog語言實現CRC校驗

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

1 前言

(1) 什么是CRC校驗?

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

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

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

(2) 校驗原理

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

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

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

模2除法:

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

(3) 步驟

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

1. 選擇合適的除數

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

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

(4) 計算實例

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

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

②多項式的位數位5,則在數據幀的后面加上5-1位0,數據幀變為101100110000,然后使用模2除法除以除數11001,得到余數。

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

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

2 流程

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

(2)本次校驗模型為G(x) = X16+X12+X5+1。在在線工具中操作相關選項生成模板。

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               , //同步復位;
 5     input     wire              i_din_valid           , //輸入數據有效;
 6     input     wire    [15:0]    i_din                 , //輸入數據;
 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) //輸入數據在一個時鐘內完成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 仿真

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

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

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

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

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

第二次計算0013(初始值為1f1f),結果為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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • crc
    crc
    +關注

    關注

    0

    文章

    201

    瀏覽量

    29762
  • Verilog
    +關注

    關注

    28

    文章

    1358

    瀏覽量

    111035
  • 校驗碼
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7665
  • 模型
    +關注

    關注

    1

    文章

    3433

    瀏覽量

    49548

原文標題:4 綜合

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦

    CRC算法和c語言實現

    CRC算法和c語言實現
    發表于 08-20 19:21

    Verilog并行CRC校驗

    Verilog并行CRC校驗
    發表于 08-20 21:52

    verilog語言實現電子鐘

    各位大神求救啊用verilog語言實現電子鐘
    發表于 05-04 16:37

    有關基于verilogCRC校驗的問題

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

    怎么用verilog HDL或VHDL去實現CRC校驗

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

    CRC校驗代碼自動生成工具

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

    CRC算法原理及C語言實現

    CRC算法原理及C語言實現:本文從理論上推導出CRC 算法實現原理,給出三種分別適應不同計算機或微控制器硬件環境的C 語言程序。讀者更能根據
    發表于 09-23 23:38 ?31次下載

    Verilog HDL語言實現時序邏輯電路

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

    CRC校驗碼算法的研究與實現

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

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

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

    使用verilog語言實現數字鐘的工程文件合集免費下載

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

    CRC校驗算法原理及c語言實現

    CRC校驗算法原理及c語言實現
    發表于 11-30 10:04 ?9次下載

    累加校驗和C語言實現

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

    CRC校驗原理及實現

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

    使用C語言實現CRC計算單元的例子

    使用C語言實現CRC計算單元的例子
    的頭像 發表于 05-16 16:16 ?1235次閱讀
    主站蜘蛛池模板: 色狼亚洲色图 | 麻豆精品一卡2卡三卡4卡免费观看 | 古代又黄又肉到湿的爽文 | 99麻豆精品国产人妻无码 | 中文字幕视频在线免费观看 | 国产精品99亚发布 | 一本道久久综合久久88 | 午夜影院费试看黄 | 亚瑟天堂久久一区二区影院 | 暖暖视频在线观看高清... | 午夜福利小视频400 午夜福利网国产A | 中文在线观看永久免费 | 高清无码色大片中文 | 国产久爱青草视频在线观看 | 国产精品久久久久久久久久影院 | 2017欧美狠狠色 | 精品免费久久久久久影院 | 亚洲国产精品VA在线看黑人 | 极品网红液液酱粉嫩福利照子凌酱 | 北岛玲手机在线观看视频观看 | qvod 韩国| 久久中文字幕人妻熟AV女蜜柚M | 99精品免费观看 | 欧美ZC0O人与善交的最新章节 | 少女开女包www | 亚洲一区高清 | free性欧美xxx狂欢 | 亚洲人成无码久久久AAA片 | 婚后被调教当众高潮H喷水 回复术士勇者免费观看全集 | 加勒比一本之道高清视频在线观看 | 久久妇女高潮几次MBA | 国产69精品久久久久乱码免费 | 中文字幕精品在线视频 | 欧美牲交视频免费观看K8经典 | 最新国产av.在线视频 | 中字幕视频在线永久在线观看免费 | 国产Av影片麻豆精品传媒 | 一级毛片西西人体44rt高清 | 国产成人免费视频 | 久久中文字幕无线观看 | 亚洲免费va在线观看 |