使用Verilog实现CRC-8的串行计算

使用Verilog实现CRC-8的串行计算

  • 项目简述
  • Verilog代码如下
  • 总结

项目简述

这也是一道乐鑫的笔试题,这道题题目中给写出了电路图所以会使得代码书写简单,如果没给出相应的电路图只给出生成多项式,那么会使这个题的难度大大增加。

题目:使用Verilog实现CRC-8的串行计算_第1张图片

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-cnt_out];

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

总结

创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。或者对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

你可能感兴趣的:(FPGA笔试题)