【IC设计】CRC(循环冗余校验)

理论解读

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 
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值