CRC校验的verilog实现

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里使用下面的参数设计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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值