FCS/CRC代码实现:
原文链接:https://blog.csdn.net/qq_34070723/article/details/89736772
/*************************LFSR实现方法**************************/
module CRC_Gen(
input rst_n, /*async reset,active low*/
input clk, /*clock input*/
input [7:0] data, /*parallel data input pins */
input data_valid, /* data valid,start to generate CRC, active high*/
output reg[15:0] crc
);
integer i;
reg feedback;
reg [15:0] crc_tmp;
/*
* sequential process
*/
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
crc <= 16'b0; /*触发器中的初始值十分重要 */
else if(data_valid==1'b0)
crc <= 16'b0;
else
crc <= crc_tmp;
end
/*
* combination process
*/
always@( data or crc)
begin
crc_tmp = crc;
for(i=7; i>=0; i=i-1)
begin
feedback = crc_tmp[15] ^ data[i];
crc_tmp[15] = crc_tmp[14];
crc_tmp[14] = crc_tmp[13];
crc_tmp[13] = crc_tmp[12];
crc_tmp[12] = crc_tmp[11] ^ feedback;
crc_tmp[11] = crc_tmp[10] ;
crc_tmp[10] = crc_tmp[9];
crc_tmp[9] = crc_tmp[8];
crc_tmp[8] = crc_tmp[7];
crc_tmp[7] = crc_tmp[6];
crc_tmp[6] = crc_tmp[5];
crc_tmp[5] = crc_tmp[4] ^ feedback;
crc_tmp[4] = crc_tmp[3];
crc_tmp[3] = crc_tmp[2];
crc_tmp[2] = crc_tmp[1];
crc_tmp[1] = crc_tmp[0];
crc_tmp[0] = feedback;
end
end
endmodule
/************************testbench**************************/
initial
begin
clk=0;
rst_n=0;
data=8'b0;
data_valid=0;
#100 rst_n=1;
data =8'b10110110; data_valid=1;#10 data_valid=0;
#100 data =8'b01001100; data_valid=1;#10 data_valid=0;
#100 data =8'b10110011; data_valid=1;#10 data_valid=0;
#100 data =8'b01001001; data_valid=1;#10 data_valid=0;
#100 data =8'b10101010; data_valid=1;#10 data_valid=0;
end
always #5 clk=~clk;
CRC_Gen U0(
.clk(clk),
.rst_n(rst_n),
.data(data),
.data_valid(data_valid),
.crc(crc)
);
endmodule
————————————————
版权声明:本文为CSDN博主「king阿金」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34070723/article/details/89736772