使用Verilog實現CRC-8的串行計算

使用Verilog實現CRC-8的串行計算

項目簡述

這也是一道樂鑫的筆試題,這道題題目中給寫出了電路圖所以會使得代碼書寫簡單,如果沒給出相應的電路圖只給出生成多項式,那麼會使這個題的難度大大增加。

題目:在這裏插入圖片描述

Verilog代碼如下

我們只需要根據電路圖書寫對應電路圖的代碼即可,代碼如下,
crc_test模塊:

`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// Website      : https://blog.csdn.net/zhangningning1996
// Module Name  : text.v
// Create Time  : 2020-06-16 20:59:24
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

module crc_test(
    input                   clk             ,
    input                   rst_n           ,
    input                   data            ,
    input                   data_valid      ,
    input                   crc_start       ,
    output  wire            crc_out         ,
    output  reg             crc_valid
);
 
//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================/
reg                 [ 7:0]  shift_reg       ;
reg                 [ 4:0]  cnt             ;
reg                 [ 2:0]  cnt_out         ;
reg                         flag            ;

 
//========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
assign          crc_out     =           shift_reg[7];

always @(posedge clk or negedge rst_n)
    if(rst_n == 1'b0)
        shift_reg           <=          8'hff;
    else if(crc_start == 1'b1) 
        shift_reg           <=          8'hff;
    else if(data_valid == 1'b1)begin
        shift_reg[0]        <=          shift_reg[7] ^ data;
        shift_reg[1]        <=          shift_reg[7] ^ shift_reg[0] ^ data;
        shift_reg[2]        <=          shift_reg[7] ^ shift_reg[1] ^ data;
        shift_reg[3]        <=          shift_reg[2];         
        shift_reg[4]        <=          shift_reg[3];         
        shift_reg[5]        <=          shift_reg[4];         
        shift_reg[6]        <=          shift_reg[5];         
        shift_reg[7]        <=          shift_reg[6];         
    end

always @(posedge clk or negedge rst_n)
    if(rst_n == 1'b0)
        cnt                 <=          5'd0;
    else if(cnt == 5'd31 && data_valid == 1'b1)
        cnt                 <=          5'd0;
    else if(data_valid == 1'b1) 
        cnt                 <=          cnt + 1'b1;
    else
        cnt                 <=          cnt;

always @(posedge clk or negedge rst_n)
    if(rst_n == 1'b0)
        flag                <=          1'b0;
    else if(cnt == 5'd31 && data_valid == 1'b1)
        flag                <=          1'b1;
    else
        flag                <=          1'b0;
          

always @(posedge clk or negedge rst_n)
    if(rst_n == 1'b0)
        cnt_out             <=          3'd0;
    else if(flag == 1'b1) 
        cnt_out             <=          3'd1;
    else if(cnt_out > 3'd0)
        cnt_out             <=          cnt_out + 1'b1;
    else
        cnt_out             <=          cnt_out;

always @(posedge clk or negedge rst_n)
    if(rst_n == 1'b0)
        crc_valid           <=          1'b0;
    else if(flag == 1'b1 && cnt_out > 3'd0)
        crc_valid           <=          1'b1;
    else
        crc_valid           <=          1'b0;
        
    
endmodule

總結

創作不易,認爲文章有幫助的同學們可以關注、點贊、轉發支持。爲行業貢獻及其微小的一部分。或者對文章有什麼看法或者需要更近一步交流的同學,可以加入下面的羣:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章