FPGA学习记录——CRC校验码

1.CRC校验码是什么:

循环冗余校验(Cyclic Redundancy Check, CRC)是一种数字通信中常用的信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

CRC码有两部分组成,前半部分是信息码,后半部分是校验码。若CRC码共长n bit,信息码长k bit,就称为(n,k)码,剩余的(n-k)bit为校验码。

2.CRC校验码生成步骤:

假设待传送的k位信息码为(m_{k-1},m_{k-2},...m_{2},m_{1}),其所对应的多项式为:

M(x)=m_{k-1}x^{k-1}+m_{k-2}x^{k-2}+...+m_{1}x^{1}+m_{0}

其中=0或1,x的幂数对应于各码元的位置,eg:

M(x)=x^{7}+x^{4}+x^{2}+x表示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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值