CRC24循环冗余校验码的FPGA实现

目录

一、CRC原理

二、CRC公式

三、CRC实现程序


      CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

        CRC24循环冗余校验码是一种用于检测数据传输错误的校验方法,其原理基于生成多项式对数据序列进行除法运算,得到余数作为校验码。这种校验方法具有较高的检错能力,同时具有较低的检测成本,因此在数据通信领域得到广泛应用。

一、CRC原理

       CRC24循环冗余校验码的原理基于生成多项式对数据序列进行除法运算,得到余数作为校验码。具体来说,将数据序列看作是一个24位的二进制数,用该数的各个位数乘以2的24次方再相加,得到的结果除以一个预先设定的24位二进制数,将余数作为该校验码。这个过程可以看作是对数据序列进行一次除法运算,得到余数作为校验码。

二、CRC公式

CRC24循环冗余校验码的公式可以表示为:

CRC24(Data)(X24Y) = Data * X24Y mod CRC24_Polynomial

其中,Data是待校验的数据序列,X24Y表示Data中每个位数乘以2的24次方(Y-1)再相加,CRC24_Polynomial是一个24位的二进制数多项式。该多项式由一些固定位数的二进制数组合而成,其系数不能随意指定,需要根据一定的规则选取。

具体实现步骤如下:

  1. 选取一个24位的二进制数多项式,如CRC24_Polynomial = x^24 + x^16 + x^8 + 1。该多项式也被称为生成多项式。
  2. 将数据序列看作是一个24位的二进制数。
  3. 将数据序列左移8位(相当于乘以x^8),然后除以生成多项式,取余数作为第1位校验码。
  4. 将余数序列右移8位(相当于除以x^8),然后除以生成多项式,取余数作为第2位校验码。
  5. 重复以上步骤,直到得到最后一位校验码。

      CRC24循环冗余校验码适用于大数据传输和存储,可以快速计算出校验码并检测错误。由于其检错能力极强,且检测成本较低,因此在数据通信领域得到广泛应用。在实际应用中,CRC24循环冗余校验码可以用于检测数据传输过程中的错误,保证数据的完整性。

        这样,通过将需要校验的数据与多项式进行循环异或(XOR)操作,得到一个24位的校验码。在接收端,接收到的数据同样进行这样的异或操作,得到新的校验码。如果新的校验码与发送端的校验码相同,则说明数据传输没有发生错误;否则,说明数据传输发生了错误。

        需要注意的是,CRC24循环冗余校验码在计算过程中使用了移位和异或等操作,这些操作看起来比较复杂,但其实并不难理解。只要掌握了这些操作的基本原理和步骤,就可以很容易地实现CRC24循环冗余校验码的计算。

三、CRC实现程序

//1+x^2+x^22+x^23+x^24;

module crc(
  input [7:0] data_in,
  input crc_en,
  output [23:0] crc_out,
  input rst,
  input clk);

  reg [23:0] lfsr_q,lfsr_c;

  assign crc_out = lfsr_q;

  always @(*) begin
    lfsr_c[0] = lfsr_q[16] ^ lfsr_q[17] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[0] ^ data_in[1] ^ data_in[3] ^ data_in[4] ^ data_in[6] ^ data_in[7];
    lfsr_c[1] = lfsr_q[17] ^ lfsr_q[18] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[23] ^ data_in[1] ^ data_in[2] ^ data_in[4] ^ data_in[5] ^ data_in[7];
    lfsr_c[2] = lfsr_q[16] ^ lfsr_q[17] ^ lfsr_q[18] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[23] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[4] ^ data_in[5] ^ data_in[7];
    lfsr_c[3] = lfsr_q[17] ^ lfsr_q[18] ^ lfsr_q[19] ^ lfsr_q[21] ^ lfsr_q[22] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[5] ^ data_in[6];
    lfsr_c[4] = lfsr_q[18] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[6] ^ data_in[7];
    lfsr_c[5] = lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[23] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[7];
    lfsr_c[6] = lfsr_q[20] ^ lfsr_q[21] ^ lfsr_q[22] ^ data_in[4] ^ data_in[5] ^ data_in[6];
    lfsr_c[7] = lfsr_q[21] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[5] ^ data_in[6] ^ data_in[7];
    lfsr_c[8] = lfsr_q[0] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[6] ^ data_in[7];
    lfsr_c[9] = lfsr_q[1] ^ lfsr_q[23] ^ data_in[7];
    lfsr_c[10] = lfsr_q[2];
    lfsr_c[11] = lfsr_q[3];
    lfsr_c[12] = lfsr_q[4];
    lfsr_c[13] = lfsr_q[5];
    lfsr_c[14] = lfsr_q[6];
    lfsr_c[15] = lfsr_q[7];
    lfsr_c[16] = lfsr_q[8];
    lfsr_c[17] = lfsr_q[9];
    lfsr_c[18] = lfsr_q[10];
    lfsr_c[19] = lfsr_q[11];
    lfsr_c[20] = lfsr_q[12];
    lfsr_c[21] = lfsr_q[13];
    lfsr_c[22] = lfsr_q[14] ^ lfsr_q[16] ^ lfsr_q[17] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[22] ^ lfsr_q[23] ^ data_in[0] ^ data_in[1] ^ data_in[3] ^ data_in[4] ^ data_in[6] ^ data_in[7];
    lfsr_c[23] = lfsr_q[15] ^ lfsr_q[16] ^ lfsr_q[18] ^ lfsr_q[19] ^ lfsr_q[21] ^ lfsr_q[22] ^ data_in[0] ^ data_in[2] ^ data_in[3] ^ data_in[5] ^ data_in[6];

  end // always

  always @(posedge clk, posedge rst) begin
    if(rst) begin
      lfsr_q <= {24{1'b1}};
    end
    else begin
      lfsr_q <= crc_en ? lfsr_c : lfsr_q;
    end
  end // always
endmodule // crc
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值