使用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
總結
創作不易,認爲文章有幫助的同學們可以關注、點贊、轉發支持。爲行業貢獻及其微小的一部分。或者對文章有什麼看法或者需要更近一步交流的同學,可以加入下面的羣: