使用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
总结
创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。或者对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群: