这里使用下面的参数设计CRC校验:
INIT = 0000
POLY = X 4 + X + 1 X^4+X+1 X4+X+1
WIDTH = 4
使用LFSR实现,如图表示的是多项式为POLY=
X
8
+
X
2
+
X
+
1
X^8+X^2+X+1
X8+X2+X+1的CRC校验原理,POLY可以表示为9‘b100000111,CRC校验码宽度为8(即POLY的最高次幂),POLY9‘b100000111除最高位外,其余位中表示为1的位需要异或操作,C7位作为feedback与新数据异或

// 本模块实现CRC校验码串行输入输出
module CRC_LFSR (
input logic clk,
input logic rstn,
input logic i_valid,
input logic din,
output logic o_valid,
output logic [3:0]dout
);
parameter [3:0] INIT_CRC = 4'b0000; // CRC初始值
logic [3:0] CRC_reg , CRC_reg_next;
logic valid_reg;
logic fb; // 反馈
assign fb = CRC_reg[3] ^ din;
always_ff @( posedge clk or negedge rstn) begin
if(!rstn)begin
CRC_reg <= INIT_CRC;
end
else if(i_valid == 1'b1) begin
CRC_reg <= {CRC_reg[2] , CRC_reg[1] , CRC_reg[0]^fb , fb};
end
else begin
CRC_reg <= INIT_CRC;
end
end
always_ff @( posedge clk or negedge rstn ) begin
if(!rstn)begin
valid_reg <= 1'b0;
end
else begin
valid_reg <= i_valid;
end
end
always_ff@(posedge clk or negedge rstn)begin
if(!rstn)begin
o_valid <= 1'b1;
end
else begin
o_valid <= (i_valid == 1'b0)&&(valid_reg == 1'b1);
end
end
always_ff@(posedge clk or negedge rstn)begin
if(!rstn)begin
dout <= 0;
end
else begin
dout <= CRC_reg;
end
end
// assign o_valid = (i_valid == 1'b0)&&(valid_reg == 1'b1);
// assign dout = CRC_reg;
endmodule
`timescale 1ns/1ps
module tb();
initial begin
$dumpfile("wave.vcd"); // 指定VCD文件的名字为wave.vcd,仿真信息将记录到此文件
$dumpvars(0, tb ); // 指定层次数为0,则tb模块及其下面各层次的所有信号将被记录
#300 $finish;
end
logic clk;
initial begin
clk = 1'b0;
forever #10 clk = ~clk;
end
logic rstn;
initial begin
rstn = 1'b1;
#15 rstn = 1'b0;
#10 rstn = 1'b1;
end
logic i_valid;
initial begin
i_valid = 1'b0;
#45 i_valid = 1'b1;
#90 i_valid = 1'b0;
end
logic din;
initial begin
din = 1'b0;
#45 din = 1'b1;
#20 din = ~din;
#20 din = ~din;
#20 din = ~din;
#20 din = ~din;
#20 din = ~din;
#20 din = ~din;
end
logic o_valid;
logic [3:0] dout;
CLC_LFSR crc1(
.clk(clk),
.rstn(rstn),
.i_valid(i_valid),
.din(din),
.o_valid(o_valid),
.dout(dout)
);
endmodule

该博客详细介绍了如何使用LFSR(有限状态移位寄存器)实现CRC(循环冗余校验)校验,具体展示了CRC校验码的计算过程,并提供了CRC_LFSR模块的Verilog代码实现。内容涵盖CRC初始值、多项式表示、反馈机制以及串行输入输出的处理。
4701

被折叠的 条评论
为什么被折叠?



