以下以CRC8x8+x5+x4+1为例说明,其它可以以此类推
校验码生成算法
一个简单的RTL解释,是上文“生成方法”的Verilog描述
module CRC8(EN,data,crc);
parameter WIDTH=12;
input EN;
output[7:0]crc;
input[WIDTH-1:0]data;
reg[7:0]crc;
wire[7:0]poly=8'h31;
//x8+x5+x4+1-->0x131,ignore MSB
reg[WIDTH-1+8:0]crc_reg;
integer len;
always@(EN)
begin
if(!EN)
begin
crc=8'h00;
crc_reg={data,8'h00};
end
else
begin
for(len=WIDTH;len>0;len=len-1'b1)
begin
if(crc_reg[WIDTH-1+8])
begin
crc_reg=crc_reg<<1'b1;
crc_reg[WIDTH-1+8:WIDTH]=crc_reg[WIDTH-1+8:WIDTH]^poly;
end
else
crc_reg=crc_reg<<1'b1;
end
crc=crc_reg[WIDTH-1+8:WIDTH];
$display("Convertion done! CRC is: 0x%2x",crc);
end
end
endmodule
校验码检测电路
CRC-8的电路框图
module crc(dataout,datain,clk,rst);
input clk,rst,datain;
output dataout;
DFF a1(clk,dataout,Q7,rst),
a2(clk,Q7,Q6,rst),
a3(clk,Q6,Q5,rst),
a4(clk,Q5,Q4,rst);
xor a5(temp5,Q4,dataout);
DFF a6(clk,temp5,Q3,rst);
xor a7(temp4,Q3,dataout);
DFF a8(clk,temp4,Q2,rst),
a9(clk,Q2,Q1,rst),
a10(clk,Q1,Q0,rst);
xor a11(dataout,Q0,datain);
endmodule
////////////////////////////////////////
module DFF(clk,D,Q,rst);
input clk,D,rst;
output Q;
reg Q;
always@(posedge clk or posedge rst)
begin
if(rst)
Q<=0;
else
Q<=D;
end
endmodule
Verilog简单测试