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

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

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

3天內不再提示

CRC校驗碼的多種Verilog實現方式

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

Verilog實現CRC-8的串行計算,G(D)=D8+D2+D+1,計算流程如下圖所示:

e23a76ca-8077-11ee-939d-92fbcf53809c.png

一、分析

CRC循環冗余校驗碼(Cyclic Redundancy Check),檢錯碼。

1)該題目所述為CRC-8,即輸出8CRC校驗值,給定一段長為N-bit的有效輸入序列,輸出(N+8)-bit的數據,其中前N-bit數據為輸入的原始數據,添加的8-bit數據為CRC校驗數據;

2)該CRC-8的生成多項式為G(D)=D8+D2+D+1,對CRC進行簡化表示時可以忽略最高位的D8,結合圖示中三個異或運算的位置更容易理解生成多項式,8CRC8寄存器C0~C7,根據多項式,C0C1C2的輸入是由異或運算而來;

e25d3494-8077-11ee-939d-92fbcf53809c.png

二、Verilog編程

1. 并行計算,串行輸出

對于輸入位寬為1的輸入,這種方法的計算非常簡單,直接根據生成多項式運算

注意!如果輸入位寬不為1,則需要根據多項式進行化簡,可以使用http://outputlogic.com/?page_id=321生成運算邏輯和代碼)

1.1 自己一步一步寫

1)先定義8個寄存器reg [7:0]

reg [7:0] crc_reg_q;// 寄存器 Q 輸出端
reg [7:0] crc_reg_d;// 寄存器 D 輸入端

(對crc_reg_d,使用always賦值就定義成reg,使用assign就定義成wire

2)異或計算

寄存器0的輸入crc_reg_d[0],來自寄存器7的輸出crc_reg_q[7]和數據輸入data_in異或運算,即:

crc_reg_d [0] = crc_reg_q[7] ^ data_in;

同理可得:

always @ (*)
begin
       crc_reg_d[0] = crc_reg_q[7] ^ data_in;
crc_reg_d[1] = crc_reg_q[7] ^ data_in ^ crc_reg_q[0];
crc_reg_d[2] = crc_reg_q[7] ^ data_in ^ crc_reg_q[1];
crc_reg_d[3] = crc_reg_q[2];
crc_reg_d[4] = crc_reg_q[3];
crc_reg_d[5] = crc_reg_q[4];
crc_reg_d[6] = crc_reg_q[5];
crc_reg_d[7] = crc_reg_q[6];
end

上述使用組合邏輯實現異或運算和數據的傳遞,另外,對于每個寄存器的輸入到輸出(D端到Q端),使用時序邏輯,并且按照題目要求,設置初始值為全1,將數據有效標志作為控制邏輯:

always @ (posedge clk)
begin
if(rst)
              crc_reg_q <= 8’hff;
       elsebegin
              if(data_valid )
                     crc_reg_q<= crc_reg_d;// 輸入數據有效就更新值
else
                     crc_reg_q<= crc_reg_q;// 輸入數據無效就等待
       end
end

3)串行輸出

上述已經實現了并行的 CRC,計算出的 CRC 結果就是直接的 8 CRC,按照題目要求,需要串行輸出 CRC 結果。

思路:寫一個計數器,當需要輸出 CRC 時,串行計數輸出,實現并串轉換。這里,由于題目給了一個信號 crc_start,我把這個信號作為 CRC 的標志,當 data_valid 有效時表示輸入的是數據,當 data_valid 無效且crc_start 有效表示數據輸入完畢,該輸出 CRC 了。

reg [2:0] count;
always @ (posedge clk)
begin
    if(rst)begin
       crc_out <= 0;
        count<= 0;
    end
    elsebegin
       if(data_valid) begin
           crc_out <= data_in;
           crc_valid <= 1'b0;
        end
        elseif(crc_start)begin
           count <= count + 1'b1;
           crc_out <= crc_reg_q [7-count];
           crc_valid <= 1'b1;
        end
        elsebegin
           crc_valid <= 1'b0;
        end
    end
end

1.2 CRC Generator自動生成

Step1中,根據要求,1處表示輸入數據位寬為12CRC輸出8位,3處選擇自定義CRC的多項式,4處點擊運用設定,然后進入Step2

e2746ef2-8077-11ee-939d-92fbcf53809c.png

根據生成多項式,勾選1X1X2即可(對應1+D1+D2,最高位的D8不用管)。

e2a0cd1c-8077-11ee-939d-92fbcf53809c.png

//-----------------------------------------------------------------------------
// Copyright (C) 2009 OutputLogic.com 
// This source file may be used and distributedwithout restriction 
// provided that this copyright statement is notremoved from the file 
// and that any derivative work contains theoriginal copyright notice 
// and the associated disclaimer. 
// 
// THIS SOURCE FILE IS PROVIDED "ASIS" AND WITHOUT ANY EXPRESS 
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUTLIMITATION, THE IMPLIED 
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FORA PARTICULAR PURPOSE. 
//-----------------------------------------------------------------------------
// CRC module for data[0:0] ,  crc[7:0]=1+x^1+x^2+x^8;
//-----------------------------------------------------------------------------
module crc(
  input [0:0] data_in,
  input crc_en,
  output [7:0] crc_out,
  input rst,
  input clk);


  reg [7:0] lfsr_q,lfsr_c;


  assign crc_out = lfsr_q;


  always @(*) begin
    lfsr_c[0] = lfsr_q[7] ^ data_in[0];
    lfsr_c[1] = lfsr_q[0] ^ lfsr_q[7]^ data_in[0];
    lfsr_c[2] = lfsr_q[1] ^ lfsr_q[7]^ data_in[0];
    lfsr_c[3] = lfsr_q[2];
    lfsr_c[4] = lfsr_q[3];
    lfsr_c[5] = lfsr_q[4];
    lfsr_c[6] = lfsr_q[5];
    lfsr_c[7] = lfsr_q[6];


  end // always


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

將上述代碼按照題目要求改變輸入輸出的名稱,并進行串并轉換(并->串)即可。

e2baf9b2-8077-11ee-939d-92fbcf53809c.png

1.3 easics自動生成

https://www.easics.com/crctool

11處選擇CRC的生成多項式,這里與1.2的不同在于,要把最高位的D8選上,easics能識別的CRC協議更多;

22處自動識別出這個CRC多項式其實是CRC8 ATM HEC協議使用的 CRC

33處設置輸入數據位寬為1

4)選擇生成Verilog代碼;

5)下載代碼。

e337dedc-8077-11ee-939d-92fbcf53809c.png

仔細閱讀代碼注釋,注意!

convention: the first serial bit is D[0]

數據的最低位先輸出,此代碼將會把低位作為異或移出位,而上面已經提到的兩種方法均是將最高位作為移出位去異或,所以,代碼中需要稍作修改,將d[0]改成d[7]d[1]改成d[6],以此類推,c[0]- c[7]不要變。

有興趣的可以去看看【大小端問題】,在不同處理器、不同協議中非常常見。

///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1999-2008 Easics NV.
// This source file may be used and distributedwithout restriction
// provided that this copyright statement is notremoved from the file
// and that any derivative work contains theoriginal copyright notice
// and the associated disclaimer.
//
// THIS SOURCE FILE IS PROVIDED "AS IS"AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUTLIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR APARTICULAR PURPOSE.
//
// Purpose : synthesizable CRC function
//   *polynomial: x^8 + x^2 + x^1 + 1
//   * datawidth: 1
//
// Info : tools@easics.be
//       http://www.easics.com
///////////////////////////////////////////////////////////////////////////////
module CRC8_D1;


  //polynomial: x^8 + x^2 + x^1 + 1
  // datawidth: 1
  //convention: the first serial bit is D[0]
  function[7:0] nextCRC8_D1;


    inputData;
    input[7:0] crc;
    reg [0:0]d;
    reg [7:0]c;
    reg [7:0]newcrc;
  begin
    d[0] =Data;
    c = crc;


    newcrc[0]= d[0] ^ c[7];
    newcrc[1]= d[0] ^ c[0] ^ c[7];
    newcrc[2]= d[0] ^ c[1] ^ c[7];
    newcrc[3]= c[2];
    newcrc[4]= c[3];
    newcrc[5]= c[4];
    newcrc[6]= c[5];
    newcrc[7]= c[6];
   nextCRC8_D1 = newcrc;
  end
  endfunction
endmodule

2. 串行計算,串行輸出(函數function用法)

CRC計算的重要思想是不斷的消除最高位。

(1) 新建函數function

Verilog函數名為next_crc,輸入信號為 data_in current_crc,輸出信號為8位的新 crc

函數功能為:根據輸入信號data_in,跳轉CRC的狀態;

函數的設計邏輯為:

(a)將CRC寄存器的數據左移1位,低位補零,得到

{current_crc[6:0],1'b0}     (其中{ }為位拼接符);

(b)新輸入的數據data_in和移出的CRC最高位做異或得到

current_crc[7]^data_in;

(c)使用位拼接符對異或結果進行位擴展,CRC-8進行8位的擴展,得到

{8{current_crc[7]^data_in}};

(d)擴展后的數據和生成多項式進行與運算,得到

{8{current_crc[7]^data_in}}&(8'h07); 

(e)將(a)的數據和(d)的數據進行異或運算,得到CRC結果;

next_crc = {current_crc[6:0],1'b0} ^({8{current_crc[7]^data_in}} & (8'h07));

上述,(a)是對CRC低位的處理,(b)-(d)是對CRC最高位的處理。

8’h07從何而來?

因為生成多項式G(D) = D8+D2+D1+D0,前面提到了最高位的D8不用管,那么使用8位去表示為 0000_0111,即低3位為1,其余為0,即8’h07

function [7:0] next_crc;
    inputdata_in;
    input[7:0] current_crc;


    begin
       next_crc = {current_crc[6:0],1'b0} ^ ({8{current_crc[7]^data_in}} &(8'h07));
    end


endfunction

(2) 調用function函數

初始化時給寄存器賦值全為1,當數據有效時,進行CRC計算。

reg [7:0] crc_reg;
always @ (posedge clk)
begin
    if(rst)begin
       crc_reg <= 8'hff;
    end
    elsebegin
       if(data_valid) begin
           crc_reg <= next_crc(data_in, crc_reg);
        end
    end
end

(3) 串行輸出(串并轉換)

按照上面的老方法,串并轉換(并->串)。

輸入321,先輸出輸入的321,緊跟著輸出321CRC校驗值8’b00001111

e34f3ee2-8077-11ee-939d-92fbcf53809c.png

三、原理圖設計

使用Quartus原理圖設計,調用DFF觸發器和XOR異或門搭建題目所示的CRC邏輯。

e365515a-8077-11ee-939d-92fbcf53809c.png

這里沒有做data_valid的控制,輸入數據是連續的321,輸入完成后的CRC值是8’h0f,串行輸出8位二進制數據 8’b00001111

e37144d8-8077-11ee-939d-92fbcf53809c.png

四、擴展

1. 并行計算并行輸出

1)對于單bit輸入的序列,只要將并行計算串行輸出的串并轉換去掉,直接輸出8-bitCRC校驗值即可;

2)對于多bit同時輸入的序列,通過介紹的兩個在線平臺去生成運算邏輯(筆試肯定不會喪心病狂到考多bit并行);

2. 查表法

實際工程中,為了減少運算量,還經常使用一種查表法,將CRC的校驗表直接存儲在ROM中,進行索引查找,常見的CRC表可以自行去查找,這里只是拋磚引玉。


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

    關注

    31

    文章

    5396

    瀏覽量

    122470
  • crc
    crc
    +關注

    關注

    0

    文章

    201

    瀏覽量

    29858
  • Verilog
    +關注

    關注

    28

    文章

    1362

    瀏覽量

    111289

原文標題:手撕代碼 | CRC校驗碼的多種Verilog實現方式

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

收藏 1人收藏

    評論

    相關推薦

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

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

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

    CRC校驗碼算法的研究與實現
    發表于 08-06 11:09

    CRC16的計算校驗碼方式有哪幾種?

    CRC16的計算校驗碼方式有哪幾種?如何使用Delphi編寫Modbus RTU CRC16的校驗碼
    發表于 11-03 07:20

    電話網遠程通信中CRC校驗碼的設計及實現

    本文介紹了基于電話網遠距離分布式測控系統的通信方法,重點介紹了傳輸協議中CRC 循環校驗碼校驗原理,CRC 的生成、檢測方法及其在Deph
    發表于 08-12 10:24 ?18次下載

    循環冗余校驗碼---CRC

    循環冗余校驗碼---CRC   二進制信息位串沿一條信號線逐位在部件之間或計算機之間傳送稱為串行傳送。CRC(Cyclic Redundancy c
    發表于 10-13 16:52 ?7235次閱讀
    循環冗余<b class='flag-5'>校驗碼</b>---<b class='flag-5'>CRC</b><b class='flag-5'>碼</b>

    奇偶校驗碼,奇偶校驗碼原理是什么?

    奇偶校驗碼,奇偶校驗碼原理是什么? 奇偶校驗碼是奇校驗碼和偶校驗碼的統稱,是一種最基本的檢錯碼。它是由n-1位信息元和1位
    發表于 03-17 17:39 ?6.3w次閱讀

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

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

    CRC-16校驗碼生成

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

    crc循環冗余校驗碼算法

     循環冗余校驗(Cyclic Redundancy Check, CRC)是一種根據網絡數據包或電腦文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存后
    發表于 12-04 10:11 ?2.3w次閱讀
    <b class='flag-5'>crc</b>循環冗余<b class='flag-5'>校驗碼</b>算法

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

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

    CRC計算工具CRC校驗碼計算器應用程序免費下載

    本文檔的主要內容詳細介紹的是CRC計算工具CRC校驗碼計算器應用程序免費下載。
    發表于 07-01 08:00 ?136次下載
    <b class='flag-5'>CRC</b>計算工具<b class='flag-5'>CRC</b><b class='flag-5'>校驗碼</b>計算器應用程序免費下載

    CRC校驗碼的C語言程序免費下載

    本文檔的主要內容詳細介紹的是CRC校驗碼的C語言程序免費下載。
    發表于 04-22 08:00 ?28次下載
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗碼</b>的C語言程序免費下載

    CRC校驗碼并行計算的FPGA實現

    用軟件實現 CRC 校驗碼計算很難滿足高速數據通信的要求 ,基于硬件的實現方法中 ,有串行經典算法 LFSR 電路 以及由軟件算法推導出來的其它各種并行計算方法。以經典的LFSR 電路
    發表于 03-28 09:34 ?30次下載
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗碼</b>并行計算的FPGA<b class='flag-5'>實現</b>

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

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

    CRC校驗碼多種Verilog實現方式

    CRC循環冗余校驗碼(Cyclic Redundancy Check),檢錯碼。
    的頭像 發表于 06-21 15:03 ?3597次閱讀
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗碼</b>的<b class='flag-5'>多種</b><b class='flag-5'>Verilog</b><b class='flag-5'>實現</b><b class='flag-5'>方式</b>

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品
    主站蜘蛛池模板: 暖暖视频免费观看高清完整版 | 一本道色综合手机久久 | 精品无码一区二区三区不卡 | 亚洲欧美精品无码一区二在线 | 一个人日本的视频免费完整版 | 欧美雌雄双性人交xxxx | 全黄h全肉细节全文 | 人妻精品久久无码专区 | 九九久久国产精品大片 | 999视频精品全部免费观看 | 99草在线观看| 色妺妺免费影院 | 黑人巨大两根一起挤进欧美 | 5G在线观看免费年龄确认 | 九九热免费在线观看 | CHINESE老阿姨免费视频 | 日韩一区二区三区视频在线观看 | 精品久久免费视频 | 男人舔女人的阴部黄色骚虎视频 | 国产成人综合网在线观看 | 欧美色图14p | 国产精品第100页 | 国产婷婷午夜精品无码A片 国产婷婷色综合AV蜜臀AV | 极品少妇高潮啪啪AV无码 | 一级毛片直接看 | 美女夫妻内射潮视频 | 调教美丽的白丝袜麻麻视频 | 免费光看午夜请高视频 | 亚洲国产精品嫩草影院久久 | 久久艹伊人 | 国产91青青成人a在线 | 久久精品麻豆国产天美传媒果冻 | 毛片免费观看的视频在线 | 青柠在线观看免费播放电影 | x69老师x日本 | 亚洲欧美中文日韩视频 | 岳的奶大又白又胖 | 国内精品七七久久影院 | 校园女教师之禁区 | 一边吃奶一边啪啪真舒服 | 日本理论片和搜子同居的日子2 |