0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

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

CRC校驗verilog代碼如何生成?

sanyue7758 ? 來源:處芯積律 ? 2023-04-11 09:28 ? 次閱讀

循環(huán)冗余校驗碼(CRC),簡稱循環(huán)碼,是一種常用的、具有檢錯、糾錯能力的校驗碼,在早期的通信中運用廣泛。循環(huán)冗余校驗碼常用于外存儲器和計算機同步通信的數(shù)據(jù)校驗。

CRC碼存儲或傳送后,在接收方進行校驗過程,以判斷數(shù)據(jù)是否有錯,若有錯則進行糾錯。一個CRC碼一定能被生成多項式整除,所以在接收方對碼字用同樣的生成多項式相除,如果余數(shù)為0,則碼字沒有錯誤;若余數(shù)不為0,則說明某位出錯,不同的出錯位置余數(shù)不同。對(n,k)碼制,在生成多項式確定時,出錯位置和余數(shù)的對應關系是確定的。

在通信系統(tǒng)中,載荷在進行信道編碼前,首先進行CRC編碼。在不同的標準中,CRC多項式可能會有不同。

當我們應用FPGA進行通信系統(tǒng)設計時,發(fā)射端數(shù)據(jù)需進行CRC校驗、信道編碼、加擾、調(diào)制等一系列處理,生成OFDM符號映射到天線端口,再進行模擬調(diào)制到中頻或射頻發(fā)射出去。

通常對于CRC校驗,需考慮兩個因素:一是輸入數(shù)據(jù)位寬;二是CRC生成多項式。

數(shù)據(jù)位寬,根據(jù)系統(tǒng)設計需要確定,CRC生成多項式根據(jù)相關協(xié)議或標準確定。

例如,在5G NR中,CRC生成多項式有以下幾種:

d02499ea-d805-11ed-bfe3-dac502259ad0.png

那么,我們怎么用verilog HDL或VHDL代碼去實現(xiàn)呢?

首先,我們得明白CRC校驗的原理,剩下的就是搬磚的事了。

人總是喜歡偷懶,“拿來主義”總是存在,并且甚囂塵上。

于是,熱心的碼農(nóng)們,一邊寫代碼,一邊維護著各種開源網(wǎng)站,各種技術(shù)博客,各種“號”。

于是,總有人在默默地為我們付出。

一個是easics,一個是outputlogic

在easics的CRC Generation Tool中,我們選擇好多項式,確定好位寬和輸出語言,于是一個crc功能的verilog代碼就生成了。

d0396df2-d805-11ed-bfe3-dac502259ad0.png

代碼如下:

////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1999-2008 Easics NV.
// This source file may be used and distributed without restriction
// provided that this copyright statement is not removed from the file
// and that any derivative work contains the original copyright notice
// and the associated disclaimer.
//
// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// Purpose : synthesizable CRC function
//   * polynomial: x^24 + x^23 + x^18 + x^17 + x^14 + x^11 + x^10 + x^7 + x^6 + x^5 + x^4 + x^3 + x^1 + 1
//   * data width: 32
//
// Info : tools@easics.be
//        http://www.easics.com
////////////////////////////////////////////////////////////////////////////////
module CRC24_D32;


  // polynomial: x^24 + x^23 + x^18 + x^17 + x^14 + x^11 + x^10 + x^7 + x^6 + x^5 + x^4 + x^3 + x^1 + 1
  // data width: 32
  // convention: the first serial bit is D[31]
  function [23:0] nextCRC24_D32;


    input [31:0] Data;
    input [23:0] crc;
    reg [31:0] d;
    reg [23:0] c;
    reg [23:0] newcrc;
  begin
    d = Data;
    c = crc;


    newcrc[0] = d[30] ^ d[27] ^ d[23] ^ d[22] ^ d[21] ^ d[20] ^ d[19] ^ d[18] ^ d[17] ^ d[16] ^ d[14] ^ d[10] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[2] ^ c[6] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15] ^ c[19] ^ c[22];
    newcrc[1] = d[31] ^ d[30] ^ d[28] ^ d[27] ^ d[24] ^ d[16] ^ d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ d[0] ^ c[2] ^ c[3] ^ c[6] ^ c[7] ^ c[8] ^ c[16] ^ c[19] ^ c[20] ^ c[22] ^ c[23];
    newcrc[2] = d[31] ^ d[29] ^ d[28] ^ d[25] ^ d[17] ^ d[16] ^ d[15] ^ d[12] ^ d[11] ^ d[7] ^ d[1] ^ c[3] ^ c[4] ^ c[7] ^ c[8] ^ c[9] ^ c[17] ^ c[20] ^ c[21] ^ c[23];
    newcrc[3] = d[29] ^ d[27] ^ d[26] ^ d[23] ^ d[22] ^ d[21] ^ d[20] ^ d[19] ^ d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[8] ^ d[5] ^ d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[2] ^ c[4] ^ c[5] ^ c[6] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15] ^ c[18] ^ c[19] ^ c[21];
    newcrc[4] = d[28] ^ d[24] ^ d[19] ^ d[18] ^ d[17] ^ d[16] ^ d[15] ^ d[13] ^ d[11] ^ d[10] ^ d[9] ^ d[6] ^ d[3] ^ d[0] ^ c[1] ^ c[2] ^ c[3] ^ c[5] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[16] ^ c[20];
    newcrc[5] = d[30] ^ d[29] ^ d[27] ^ d[25] ^ d[23] ^ d[22] ^ d[21] ^ d[12] ^ d[11] ^ d[7] ^ d[5] ^ d[3] ^ d[2] ^ d[0] ^ c[3] ^ c[4] ^ c[13] ^ c[14] ^ c[15] ^ c[17] ^ c[19] ^ c[21] ^ c[22];
    newcrc[6] = d[31] ^ d[28] ^ d[27] ^ d[26] ^ d[24] ^ d[21] ^ d[20] ^ d[19] ^ d[18] ^ d[17] ^ d[16] ^ d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[8] ^ d[6] ^ d[5] ^ d[2] ^ d[0] ^ c[0] ^ c[2] ^ c[4] ^ c[5] ^ c[6] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[16] ^ c[18] ^ c[19] ^ c[20] ^ c[23];
    newcrc[7] = d[30] ^ d[29] ^ d[28] ^ d[25] ^ d[23] ^ d[16] ^ d[15] ^ d[13] ^ d[11] ^ d[10] ^ d[9] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[2] ^ d[0] ^ c[1] ^ c[2] ^ c[3] ^ c[5] ^ c[7] ^ c[8] ^ c[15] ^ c[17] ^ c[20] ^ c[21] ^ c[22];
    newcrc[8] = d[31] ^ d[30] ^ d[29] ^ d[26] ^ d[24] ^ d[17] ^ d[16] ^ d[14] ^ d[12] ^ d[11] ^ d[10] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[3] ^ d[1] ^ c[0] ^ c[2] ^ c[3] ^ c[4] ^ c[6] ^ c[8] ^ c[9] ^ c[16] ^ c[18] ^ c[21] ^ c[22] ^ c[23];
    newcrc[9] = d[31] ^ d[30] ^ d[27] ^ d[25] ^ d[18] ^ d[17] ^ d[15] ^ d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[4] ^ d[2] ^ c[0] ^ c[1] ^ c[3] ^ c[4] ^ c[5] ^ c[7] ^ c[9] ^ c[10] ^ c[17] ^ c[19] ^ c[22] ^ c[23];
    newcrc[10] = d[31] ^ d[30] ^ d[28] ^ d[27] ^ d[26] ^ d[23] ^ d[22] ^ d[21] ^ d[20] ^ d[17] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[7] ^ d[4] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[4] ^ c[5] ^ c[9] ^ c[12] ^ c[13] ^ c[14] ^ c[15] ^ c[18] ^ c[19] ^ c[20] ^ c[22] ^ c[23];
    newcrc[11] = d[31] ^ d[30] ^ d[29] ^ d[28] ^ d[24] ^ d[20] ^ d[19] ^ d[17] ^ d[16] ^ d[13] ^ d[9] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[1] ^ c[5] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[16] ^ c[20] ^ c[21] ^ c[22] ^ c[23];
    newcrc[12] = d[31] ^ d[30] ^ d[29] ^ d[25] ^ d[21] ^ d[20] ^ d[18] ^ d[17] ^ d[14] ^ d[10] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[2] ^ c[6] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[17] ^ c[21] ^ c[22] ^ c[23];
    newcrc[13] = d[31] ^ d[30] ^ d[26] ^ d[22] ^ d[21] ^ d[19] ^ d[18] ^ d[15] ^ d[11] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[3] ^ c[7] ^ c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[18] ^ c[22] ^ c[23];
    newcrc[14] = d[31] ^ d[30] ^ d[21] ^ d[18] ^ d[17] ^ d[14] ^ d[12] ^ d[11] ^ d[10] ^ d[7] ^ d[5] ^ d[4] ^ d[2] ^ d[1] ^ d[0] ^ c[2] ^ c[3] ^ c[4] ^ c[6] ^ c[9] ^ c[10] ^ c[13] ^ c[22] ^ c[23];
    newcrc[15] = d[31] ^ d[22] ^ d[19] ^ d[18] ^ d[15] ^ d[13] ^ d[12] ^ d[11] ^ d[8] ^ d[6] ^ d[5] ^ d[3] ^ d[2] ^ d[1] ^ c[0] ^ c[3] ^ c[4] ^ c[5] ^ c[7] ^ c[10] ^ c[11] ^ c[14] ^ c[23];
    newcrc[16] = d[23] ^ d[20] ^ d[19] ^ d[16] ^ d[14] ^ d[13] ^ d[12] ^ d[9] ^ d[7] ^ d[6] ^ d[4] ^ d[3] ^ d[2] ^ c[1] ^ c[4] ^ c[5] ^ c[6] ^ c[8] ^ c[11] ^ c[12] ^ c[15];
    newcrc[17] = d[30] ^ d[27] ^ d[24] ^ d[23] ^ d[22] ^ d[19] ^ d[18] ^ d[16] ^ d[15] ^ d[13] ^ d[8] ^ d[7] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[5] ^ c[7] ^ c[8] ^ c[10] ^ c[11] ^ c[14] ^ c[15] ^ c[16] ^ c[19] ^ c[22];
    newcrc[18] = d[31] ^ d[30] ^ d[28] ^ d[27] ^ d[25] ^ d[24] ^ d[22] ^ d[21] ^ d[18] ^ d[10] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[10] ^ c[13] ^ c[14] ^ c[16] ^ c[17] ^ c[19] ^ c[20] ^ c[22] ^ c[23];
    newcrc[19] = d[31] ^ d[29] ^ d[28] ^ d[26] ^ d[25] ^ d[23] ^ d[22] ^ d[19] ^ d[11] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[11] ^ c[14] ^ c[15] ^ c[17] ^ c[18] ^ c[20] ^ c[21] ^ c[23];
    newcrc[20] = d[30] ^ d[29] ^ d[27] ^ d[26] ^ d[24] ^ d[23] ^ d[20] ^ d[12] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[3] ^ c[4] ^ c[12] ^ c[15] ^ c[16] ^ c[18] ^ c[19] ^ c[21] ^ c[22];
    newcrc[21] = d[31] ^ d[30] ^ d[28] ^ d[27] ^ d[25] ^ d[24] ^ d[21] ^ d[13] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[0] ^ c[3] ^ c[4] ^ c[5] ^ c[13] ^ c[16] ^ c[17] ^ c[19] ^ c[20] ^ c[22] ^ c[23];
    newcrc[22] = d[31] ^ d[29] ^ d[28] ^ d[26] ^ d[25] ^ d[22] ^ d[14] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[0] ^ c[1] ^ c[4] ^ c[5] ^ c[6] ^ c[14] ^ c[17] ^ c[18] ^ c[20] ^ c[21] ^ c[23];
    newcrc[23] = d[29] ^ d[26] ^ d[22] ^ d[21] ^ d[20] ^ d[19] ^ d[18] ^ d[17] ^ d[16] ^ d[15] ^ d[13] ^ d[9] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[1] ^ c[5] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[18] ^ c[21];
    nextCRC24_D32 = newcrc;
  end
  endfunction
endmodule

當然,這不是一個可以直接使用的模塊,還需手動改一下格式。

有沒有更完整的CRC生成器呢?

于是outputlogic出場了。只需要兩步,就可以完成。

設定數(shù)據(jù)位寬,多項式位寬,若針對特定協(xié)議,例如USB、PCIe等,可直接選好協(xié)議。然后點擊“Apply”,進入step2,選擇多項式,生成verilog代碼,完畢!

源代碼如下:

//-----------------------------------------------------------------------------
// Copyright (C) 2009 OutputLogic.com
// This source file may be used and distributed without restriction
// provided that this copyright statement is not removed from the file
// and that any derivative work contains the original copyright notice
// and the associated disclaimer.
//
// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//-----------------------------------------------------------------------------
// CRC module for data[31:0] ,   crc[23:0]=1+x^1+x^3+x^4+x^5+x^6+x^7+x^10+x^11+x^14+x^17+x^18+x^23+x^24;
//-----------------------------------------------------------------------------
module crc(
  input [31:0] data_in,
  input crc_en,
  output [23:0] crc_out,
  input rst,
  input clk);


  reg [23:0] lfsr_q,lfsr_c;


  assign crc_out = lfsr_q;


  always @(*) begin
    lfsr_c[0] = lfsr_q[2] ^ lfsr_q[6] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15] ^ lfsr_q[19] ^ lfsr_q[22] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[10] ^ data_in[14] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[20] ^ data_in[21] ^ data_in[22] ^ data_in[23] ^ data_in[27] ^ data_in[30];
    lfsr_c[1] = lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[6] ^ lfsr_q[7] ^ lfsr_q[8] ^ lfsr_q[16] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[0] ^ data_in[6] ^ data_in[10] ^ data_in[11] ^ data_in[14] ^ data_in[15] ^ data_in[16] ^ data_in[24] ^ data_in[27] ^ data_in[28] ^ data_in[30] ^ data_in[31];
    lfsr_c[2] = lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[7] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[17] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[23] ^ data_in[1] ^ data_in[7] ^ data_in[11] ^ data_in[12] ^ data_in[15] ^ data_in[16] ^ data_in[17] ^ data_in[25] ^ data_in[28] ^ data_in[29] ^ data_in[31];
    lfsr_c[3] = lfsr_q[0] ^ lfsr_q[2] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[6] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15] ^ lfsr_q[18] ^ lfsr_q[19] ^ lfsr_q[21] ^ data_in[0] ^ data_in[1] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[8] ^ data_in[10] ^ data_in[12] ^ data_in[13] ^ data_in[14] ^ data_in[19] ^ data_in[20] ^ data_in[21] ^ data_in[22] ^ data_in[23] ^ data_in[26] ^ data_in[27] ^ data_in[29];
    lfsr_c[4] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[5] ^ lfsr_q[7] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[16] ^ lfsr_q[20] ^ data_in[0] ^ data_in[3] ^ data_in[6] ^ data_in[9] ^ data_in[10] ^ data_in[11] ^ data_in[13] ^ data_in[15] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[24] ^ data_in[28];
    lfsr_c[5] = lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15] ^ lfsr_q[17] ^ lfsr_q[19] ^ lfsr_q[21] ^ lfsr_q[22] ^ data_in[0] ^ data_in[2] ^ data_in[3] ^ data_in[5] ^ data_in[7] ^ data_in[11] ^ data_in[12] ^ data_in[21] ^ data_in[22] ^ data_in[23] ^ data_in[25] ^ data_in[27] ^ data_in[29] ^ data_in[30];
    lfsr_c[6] = lfsr_q[0] ^ lfsr_q[2] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[6] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[16] ^ lfsr_q[18] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[23] ^ data_in[0] ^ data_in[2] ^ data_in[5] ^ data_in[6] ^ data_in[8] ^ data_in[10] ^ data_in[12] ^ data_in[13] ^ data_in[14] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[20] ^ data_in[21] ^ data_in[24] ^ data_in[26] ^ data_in[27] ^ data_in[28] ^ data_in[31];
    lfsr_c[7] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[5] ^ lfsr_q[7] ^ lfsr_q[8] ^ lfsr_q[15] ^ lfsr_q[17] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[22] ^ data_in[0] ^ data_in[2] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7] ^ data_in[9] ^ data_in[10] ^ data_in[11] ^ data_in[13] ^ data_in[15] ^ data_in[16] ^ data_in[23] ^ data_in[25] ^ data_in[28] ^ data_in[29] ^ data_in[30];
    lfsr_c[8] = lfsr_q[0] ^ lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[6] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[16] ^ lfsr_q[18] ^ lfsr_q[21] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[1] ^ data_in[3] ^ data_in[5] ^ data_in[6] ^ data_in[7] ^ data_in[8] ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[14] ^ data_in[16] ^ data_in[17] ^ data_in[24] ^ data_in[26] ^ data_in[29] ^ data_in[30] ^ data_in[31];
    lfsr_c[9] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[7] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[17] ^ lfsr_q[19] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[2] ^ data_in[4] ^ data_in[6] ^ data_in[7] ^ data_in[8] ^ data_in[9] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[15] ^ data_in[17] ^ data_in[18] ^ data_in[25] ^ data_in[27] ^ data_in[30] ^ data_in[31];
    lfsr_c[10] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[9] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15] ^ lfsr_q[18] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[4] ^ data_in[7] ^ data_in[8] ^ data_in[9] ^ data_in[12] ^ data_in[13] ^ data_in[17] ^ data_in[20] ^ data_in[21] ^ data_in[22] ^ data_in[23] ^ data_in[26] ^ data_in[27] ^ data_in[28] ^ data_in[30] ^ data_in[31];
    lfsr_c[11] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[5] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[16] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[0] ^ data_in[4] ^ data_in[8] ^ data_in[9] ^ data_in[13] ^ data_in[16] ^ data_in[17] ^ data_in[19] ^ data_in[20] ^ data_in[24] ^ data_in[28] ^ data_in[29] ^ data_in[30] ^ data_in[31];
    lfsr_c[12] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[6] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[17] ^ lfsr_q[21] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[1] ^ data_in[5] ^ data_in[9] ^ data_in[10] ^ data_in[14] ^ data_in[17] ^ data_in[18] ^ data_in[20] ^ data_in[21] ^ data_in[25] ^ data_in[29] ^ data_in[30] ^ data_in[31];
    lfsr_c[13] = lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[7] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[18] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[2] ^ data_in[6] ^ data_in[10] ^ data_in[11] ^ data_in[15] ^ data_in[18] ^ data_in[19] ^ data_in[21] ^ data_in[22] ^ data_in[26] ^ data_in[30] ^ data_in[31];
    lfsr_c[14] = lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[6] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[13] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[4] ^ data_in[5] ^ data_in[7] ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[14] ^ data_in[17] ^ data_in[18] ^ data_in[21] ^ data_in[30] ^ data_in[31];
    lfsr_c[15] = lfsr_q[0] ^ lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[7] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[14] ^ lfsr_q[23] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[5] ^ data_in[6] ^ data_in[8] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[15] ^ data_in[18] ^ data_in[19] ^ data_in[22] ^ data_in[31];
    lfsr_c[16] = lfsr_q[1] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[6] ^ lfsr_q[8] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[15] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[6] ^ data_in[7] ^ data_in[9] ^ data_in[12] ^ data_in[13] ^ data_in[14] ^ data_in[16] ^ data_in[19] ^ data_in[20] ^ data_in[23];
    lfsr_c[17] = lfsr_q[0] ^ lfsr_q[5] ^ lfsr_q[7] ^ lfsr_q[8] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[14] ^ lfsr_q[15] ^ lfsr_q[16] ^ lfsr_q[19] ^ lfsr_q[22] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[7] ^ data_in[8] ^ data_in[13] ^ data_in[15] ^ data_in[16] ^ data_in[18] ^ data_in[19] ^ data_in[22] ^ data_in[23] ^ data_in[24] ^ data_in[27] ^ data_in[30];
    lfsr_c[18] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[10] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[16] ^ lfsr_q[17] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[0] ^ data_in[4] ^ data_in[5] ^ data_in[8] ^ data_in[9] ^ data_in[10] ^ data_in[18] ^ data_in[21] ^ data_in[22] ^ data_in[24] ^ data_in[25] ^ data_in[27] ^ data_in[28] ^ data_in[30] ^ data_in[31];
    lfsr_c[19] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[11] ^ lfsr_q[14] ^ lfsr_q[15] ^ lfsr_q[17] ^ lfsr_q[18] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[23] ^ data_in[1] ^ data_in[5] ^ data_in[6] ^ data_in[9] ^ data_in[10] ^ data_in[11] ^ data_in[19] ^ data_in[22] ^ data_in[23] ^ data_in[25] ^ data_in[26] ^ data_in[28] ^ data_in[29] ^ data_in[31];
    lfsr_c[20] = lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[12] ^ lfsr_q[15] ^ lfsr_q[16] ^ lfsr_q[18] ^ lfsr_q[19] ^ lfsr_q[21] ^ lfsr_q[22] ^ data_in[2] ^ data_in[6] ^ data_in[7] ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[20] ^ data_in[23] ^ data_in[24] ^ data_in[26] ^ data_in[27] ^ data_in[29] ^ data_in[30];
    lfsr_c[21] = lfsr_q[0] ^ lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[13] ^ lfsr_q[16] ^ lfsr_q[17] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[3] ^ data_in[7] ^ data_in[8] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[21] ^ data_in[24] ^ data_in[25] ^ data_in[27] ^ data_in[28] ^ data_in[30] ^ data_in[31];
    lfsr_c[22] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[4] ^ lfsr_q[5] ^ lfsr_q[6] ^ lfsr_q[14] ^ lfsr_q[17] ^ lfsr_q[18] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[23] ^ data_in[4] ^ data_in[8] ^ data_in[9] ^ data_in[12] ^ data_in[13] ^ data_in[14] ^ data_in[22] ^ data_in[25] ^ data_in[26] ^ data_in[28] ^ data_in[29] ^ data_in[31];
    lfsr_c[23] = lfsr_q[1] ^ lfsr_q[5] ^ lfsr_q[7] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[18] ^ lfsr_q[21] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[9] ^ data_in[13] ^ data_in[15] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[20] ^ data_in[21] ^ data_in[22] ^ data_in[26] ^ data_in[29];


  end // always


  always @(posedge clk, posedge rst) begin
    if(rst) begin
      lfsr_q <= {24{1'b1}};
    end
    else begin
      lfsr_q <= crc_en ? lfsr_c : lfsr_q;
    end
  end // always
endmodule // crc

趕緊試試吧,三分鐘搞定CRC校驗模塊,效率直線上升,碼農(nóng)們。

Easics的CRC Generation Tool 的鏈接在這里

http://www.easics.com/webtools/crctool

outputlogic的CRC Generation Tool 的鏈接在這里

http://outputlogic.com/


審核編輯 :李倩


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

    關注

    38

    文章

    7430

    瀏覽量

    163514
  • crc
    crc
    +關注

    關注

    0

    文章

    199

    瀏覽量

    29420
  • Verilog
    +關注

    關注

    28

    文章

    1343

    瀏覽量

    109925

原文標題:CRC校驗verilog代碼如何生成?

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何在IAR Embedded Workbench中配置生成對應代碼區(qū)域的CRC校驗

    在“使用IAR Embedded Workbench和MCU的CRC模塊來檢查代碼的完整性”一文中,介紹了如何在IAR Embedded Workbench中配置生成對應代碼區(qū)域的
    的頭像 發(fā)表于 10-27 11:49 ?1471次閱讀
    如何在IAR Embedded Workbench中配置<b class='flag-5'>生成</b>對應<b class='flag-5'>代碼</b>區(qū)域的<b class='flag-5'>CRC</b><b class='flag-5'>校驗</b>碼

    Verilog并行CRC校驗

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

    FPGA實現(xiàn)CRC校驗

    最近在學習CRC校驗,根據(jù)生成多項式,通過編碼代碼實現(xiàn)CRC校驗,就是不知道怎么實現(xiàn),求實現(xiàn)
    發(fā)表于 01-05 16:17

    有關基于verilogCRC校驗的問題

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

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

    。CRC校驗,需要考慮兩個因素:一是輸入數(shù)據(jù)位寬;二是CRC生成校驗。數(shù)據(jù)位寬,根據(jù)系統(tǒ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><b class='flag-5'>代碼</b>自動<b class='flag-5'>生成</b>工具

    8位CRC校驗碼表格生成及高速校驗子程序

    8位CRC校驗碼表格生成及高速校驗子程序
    發(fā)表于 05-16 13:49 ?109次下載

    CRC校驗資料大全包括源代碼

    CRC校驗資料大全包括源代碼
    發(fā)表于 12-31 10:02 ?82次下載

    crc校驗基本原理

    本內(nèi)容介紹了crc校驗基本原理,CRC幾個基本概念,CRC碼的生成步驟.CRC即循環(huán)冗余
    發(fā)表于 12-21 16:55 ?4687次閱讀

    CRC校驗.vi

    實現(xiàn)labview與PLC通訊,消息幀CRC校驗生成程序
    發(fā)表于 02-25 14:59 ?91次下載

    CRC-16校驗生成

    C#編寫的CRC校驗生成小程序,簡潔明了,如果有需要的話,大家可以下載了。
    發(fā)表于 05-06 15:06 ?8次下載

    薦讀:基于FPGA 的CRC校驗生成

    大家好,又到了每日學習的時間了,今天我們來聊一聊基于FPGA 的CRC校驗生成器。下面咱們就來具體看看,歡迎大家一起交流學習。 1.概述 CRC即Cyclic Redundancy
    的頭像 發(fā)表于 06-13 11:18 ?6459次閱讀
    薦讀:基于FPGA 的<b class='flag-5'>CRC</b><b class='flag-5'>校驗</b>碼<b class='flag-5'>生成</b>器

    并行CRC電路HDL代碼的快速生成

    CRC校驗的實現(xiàn)基于串行位移寄存器,如果要處理并行數(shù)據(jù),需要對電路進行改進。本文介紹了一種并行CRC電路HDL代碼的快速生成鐘算法,只需要帶
    發(fā)表于 03-28 09:29 ?16次下載
    并行<b class='flag-5'>CRC</b>電路HDL<b class='flag-5'>代碼</b>的快速<b class='flag-5'>生成</b>

    工控常用LRC XOR累加和CRC校驗工具校驗碼自動生成軟件多計算方式

    CRC校驗工具 校驗碼自動生成軟件支持十幾種CRC計算方式,包括MODBUS協(xié)議的CRC-16
    的頭像 發(fā)表于 11-25 14:27 ?3327次閱讀
    工控常用LRC XOR累加和<b class='flag-5'>CRC</b><b class='flag-5'>校驗</b>工具<b class='flag-5'>校驗</b>碼自動<b class='flag-5'>生成</b>軟件多計算方式

    如何自動生成verilog代碼

    介紹幾種自動生成verilog代碼的方法。
    的頭像 發(fā)表于 11-05 11:45 ?150次閱讀
    如何自動<b class='flag-5'>生成</b><b class='flag-5'>verilog</b><b class='flag-5'>代碼</b>