1.CRC校验码是什么:
循环冗余校验(Cyclic Redundancy Check, CRC)是一种数字通信中常用的信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
CRC码有两部分组成,前半部分是信息码,后半部分是校验码。若CRC码共长n bit,信息码长k bit,就称为(n,k)码,剩余的(n-k)bit为校验码。
2.CRC校验码生成步骤:
假设待传送的k位信息码为(),其所对应的多项式为:
其中=0或1,x的幂数对应于各码元的位置,eg:
表示100101101
第一步:将信息多项式左移r=n-k位,【注:校验码元r的位数比生成码最高位数少一位】
第二步:将左移后的信息多项式除以生成多项式g(x)【注:g(x)末项一定为1】,得到余式r(x),即为CRC校验码多项式,对应r位校验码元。此处用到的是模二除法——按位异或。
国际上比较通行的生成多项式
第三步:生成码字
3.CRC校验流程:
4.代码:
module v_crc(
input [7:0] data,//信息码8位
input clk,//时钟信号
input rst,//复位信号
output reg [15:0] crc//生成的CRC校验码元
);
wire [23:0] stemp;//信息码移位数据
reg [23:0] temp;//移位数据用于除法运算
parameter gx=17'b1_0001_0000_0010_0001;//生成码元g(x)采用CRC-CCITT
assign stemp={data,16'b0000000000000000};
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
crc<=0;
temp<=stemp;
end
else//实现模二除法
begin
if(temp[23])
temp[23:7]<=temp[23:7]^gx;
else if(temp[22])
temp[22:6]<=temp[22:6]^gx;
else if(temp[21])
temp[21:5]<=temp[21:5]^gx;
else if(temp[20])
temp[20:4]<=temp[20:4]^gx;
else if(temp[19])
temp[19:3]<=temp[19:3]^gx;
else if(temp[18])
temp[18:2]<=temp[18:2]^gx;
else if(temp[17])
temp[17:1]<=temp[17:1]^gx;
else if(temp[16])
temp[16:0]<=temp[16:0]^gx;
else
crc=temp[15:0];
end
end
endmodule
5.仿真:
module sim_crc(
);
reg [7:0] data;
reg clk;
reg rst;
wire [15:0] crc;
v_crc U1(
data,clk,rst,crc
);
initial
begin
clk=0;
rst=0;
data[7:0]=8'b10100010;//假设输入的信息码为10100010
end
always #10 clk=~clk;
always #10 rst=1;
endmodule