目录
理论解读
CRC应用
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC算法参数解读
- NAME:参数模型名称。
- WIDTH:宽度,即CRC比特数。
- POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
- INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
- REFIN:待测数据的每个字节是否按位反转,True或False。
- REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
- XOROUT:计算结果与此参数异或后得到最终的CRC值。
常见CRC参数模型
设计实战
校招编程题
(2021乐鑫科技数字IC提前批代码编程)
- 用Verilog实现CRC-8的串行计算,G(D)=D8+D2+D+1,计算流程如下图所示:
分类
串行输入、并行计算、串行输出**
-
手算
CRC校验码就是两个数相除的余数,而且余数位数要正好比除数少一位,即使MSB为0。
对于数据11’0100’10 01,指定多项式为x8+x2+x+1,则除数为1_0000_0111。首先要将数据左移8bit(校验码的位数)
-
计算器
-
代码
module crc_8(
input clk,
input rst,
input data_in,
input data_valid,
input crc_start,
output reg crc_out,
output reg crc_valid
);
reg [7:0] lfsr_q;
reg [7:0] lfsr_c;
always @(*)begin
lfsr_c[0] = lfsr_q[7] ^ data_in;
lfsr_c[1] = lfsr_q[0] ^ lfsr_q[7] ^ data_in;
lfsr_c[2] = lfsr_q[1] ^ lfsr_q[7] ^ data_in;
lfsr_c[3] = lfsr_q[2];
lfsr_c[4] = lfsr_q[3];
lfsr_c[5] = lfsr_q[4];
lfsr_c[6] = lfsr_q[5];
lfsr_c[7] = lfsr_q[6];
end
always @ (posedge clk)begin
if(rst) begin
lfsr_q <= {
8{
1'b0}};
end else begin
lfsr_q <= data_valid ? lfsr_c : lfsr_q;
end
end
reg [2:0] count;
always @ (posedge clk) begin
if(rst) begin
crc_out <= 0;
count <= 0;
end else begin
if(data_valid) begin