基于FPGA的CRC校验码生成器设计

时间:2025-06-15  作者:Diven  阅读:0

1.概述

基于FPGA的CRC校验码生成器设计

CRC即CyclIC Redundancy Check,循环冗余校验,是数字通信中的常用信道编码技术。其特征是信息段和校验字段的长度可以任意选定。

2.CRC校验的基本原理:

CRC码是由两部分组成的,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码长共n bit,信息码长k bit,就称为(n,k)码,剩余的r bit即为校验位。如:(7,3)码:110 1001,前三位110为信息码,1001为校验码。

3.校验码的生成规则:

1)将原信息码左移r bit,右侧补零,如 110--> 110 0000;

2)用110 0000除以g(x)  (注意,使用的是模2除法,见下文),得到的余数即为CRC校验码;

3)将校验码续接到信息码的尾部,形成CRC码。

4.关于生成多项式g(x)

在产生CRC校验码时,要用到除法运算,这是比较麻烦的,把二进制信息预先转换成一定的格式,这就是CRC的多项式表示。二进制数表示为生成多项式的系数,如下:所有二进制数均被表示为一个多项式,x仅是码元位置的标记,因此我们并不关心x的取值,称之为码多项式。(我没研究过CRC代数推理过程,没体会到用多项式计算的方便之处,这里要学会的就是给出生成多项式g(x),能写出对应的二进制即可)

常见的生成多项式如下:

   

5.关于模2除法

模2运算就是加法不考虑进位,减法不考虑借位,

1)加法运算:

  0+0=0        0+1=1        1+0=1        1+1=0

  例如0101+0011=0110,列竖式计算:

           0 1 0 1

       + 0 0 1 1

    ──────

           0 1 1 0

2)减法运算:

  0-0=0        0-1=1        1-0=1        1-1=0

  例如0110-0011=0101,列竖式计算:

          0 1 1 0

   -  0 0 1 1

     ──────

          0 1 0 1

3)乘法运算

  0×0=0        0×1=0        1×0=0        1×1=1

  多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。例如1011×101=100111,列竖式计算:

  

4)除法运算:

  0÷1=0        1÷1=1

  多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根 据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义 的。
             实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷1011=1110……110,列竖式计算:

    

掌握了上面的运算规则,您可以尝试计算一个复杂一点的,如下:

  

如果您得到的余数结果正确,您掌握的东西就够用了。

6.CRC-CCITT的硬件实现

CRC-CCITT的生成多项式为:

                

对应的二进制数就是上面复杂运算中那个除数。由刚才的计算可知,对于8 bit的数据 0xaa,CRC校验码为0001 0100 1010 0000,下面用verilog来实现,看能否得到这个结果:

要实现这一过程,仍然需要LFSR电路,参看《FPGA产生基于LFSR的伪随机数》中关于该电路特性的介绍,如果您不需要了解原理,直接略过即可;有所改进的地方就是,可以将伪随机数发生器看作一个Moore型状态机,输出只与当前的状态有关;而此时利用LFSR电路,需要引入数据输入端,输出不仅取决于当前的状态,还取决于输入信号,相当于Mealy型状态机,如下图:注意对比与伪随机数产生器中该反馈支路的区别!

反馈项gr+1gr……g0为生成多项式的系数,依然是1代表存在反馈,0代表不存在反馈;此电路可以完成上述的模2除法操作,若我们要求0xaa的CRC校验码,则从高位到低位顺序输入0xaa共8 bit后,D15……D0中的数据即为所要求的余数,即CRC校验位。

7.verilog描述

如果用时序电路串行实现,则8 bit数据要移位8次,就需要8个clk,效率低下,为了能在一个时钟周期输出结果,必须采用组合电路,当然,这是以空间换时间的方法,由于使用了for循环8次,直观的讲电路规模将扩大8倍。。。

 

Module CRC_GEN( input rst, input clk, input [7:0] data_in, input d_valid, output reg[15:0] crc);integer i;reg feedback;reg [15:0] crc_tmp;always @(posedge clk or negedge rst)begin if(!rst) crc <= 16'b0; else if(d_valid==1'b0) crc <= 16'b0; else crc <= crc_tmp;endalways@( data_in or crc)begin    crc_tmp = crc;    for(i=7; i>=0; i=i-1) begin feedback = crc_tmp[15] ^ data_in[i]; crc_tmp[15] = crc_tmp[14]; crc_tmp[14] = crc_tmp[13]; crc_tmp[13] = crc_tmp[12]; crc_tmp[12] = crc_tmp[11] ^ feedback; crc_tmp[11] = crc_tmp[10] ; crc_tmp[10] = crc_tmp[9]; crc_tmp[9] = crc_tmp[8]; crc_tmp[8] = crc_tmp[7]; crc_tmp[7] = crc_tmp[6]; crc_tmp[6] = crc_tmp[5]; crc_tmp[5] = crc_tmp[4] ^ feedback; crc_tmp[4] = crc_tmp[3]; crc_tmp[3] = crc_tmp[2]; crc_tmp[2] = crc_tmp[1]; crc_tmp[1] = crc_tmp[0]; crc_tmp[0] = feedback; endendendModule

 

 仿真结果如下:得到的是数据0xaa和0xf0的CRC校验码,为验证结果的正确性,您可以按照模2法则手工计算一下^.^8.同样给出一个4 bit信息位,5 bitCRC码的(9,4)码的程序和仿真结果,程序的流程与上述流程完全一样:

  

 

module CRC5_GEN( input rst, input clk, input [3:0] data_in, input d_valid, output reg[4:0] crc);integer i;reg feedback;reg [4:0] crc_tmp;always @(posedge clk or negedge rst)begin if(!rst) crc <= 5'b0; else if(d_valid==1'b0) crc <= 5'b0; else crc <= crc_tmp;endalways@( data_in or crc)begin    crc_tmp = crc;    for(i=3; i>=0; i=i-1) begin feedback = crc_tmp[4] ^ data_in[i]; crc_tmp[4] = crc_tmp[3]; crc_tmp[3] = crc_tmp[2]; crc_tmp[2] = crc_tmp[1] ^ feedback; crc_tmp[1] = crc_tmp[0]; crc_tmp[0] = feedback; end endendmodule

 


审核编辑:刘清

猜您喜欢

现代SoC软件通常包括多种应用,从汽车发动机控制等硬件实时应用,到HD视频流等大吞吐量应用。随着现代SoC向大吞吐量系统的快速发展,处理器内核数量不断增加,宽带...
2019-01-12 10:18:00


桌面吸尘器是现代办公和家庭清洁的得力助手,种类繁多,满足不同需求。根据电源类型,桌面吸尘器可分为有线和无线两种。有线吸尘器功率强劲,适合大面积清洁;而无线吸尘器...
2009-05-14 00:00:00

光敏电阻,又称光电导体,是对光线敏感的电阻器件,其阻值会随入射光强度的变化而变化。光敏电阻应用于光线探测、自动照明、安防系统等领域。本文将探讨光敏电阻的阻值与光...
2025-04-19 04:01:41


贴片电阻上的E22并非直接代表电阻值,而是代表电阻值代码。表示该电阻的阻值为2.2欧姆。贴片电阻通常使用数字字母组合来标记阻值,这种标记方式更加简洁,方便印刷在...
2024-11-29 10:25:29

热敏电阻作为温度检测与保护的重要元件,应用于各种电路设计中。AVX作为知名的电子元器件制造商,其PTC(正温度系数)热敏电阻因性能稳定、品质优良而受到市场青睐。...
2012-04-28 01:59:30

发热芯是电热设备中的关键组件,其参数直接影响到加热效率和使用寿命。发热芯的功率是一个重要参数,通常以瓦特(W)为单位,决定了其加热能力。发热芯的材料类型也是不可...
2015-03-17 00:00:00

贴片排阻作为重要的电阻元件,应用于各种电子设备中。冠佐(SUSCON)作为知名的贴片排阻品牌,很好的品质和稳定的性能赢得了众多客户的青睐。本文将围绕冠佐(SUS...
2016-09-21 04:45:30

贴片电阻是电子电路中常见的元件,其材质决定了电阻的性能和应用范围。常见的贴片电阻材质主要有以下几种:厚膜电阻:这是最常见的类型,采用丝网印刷技术将电阻浆料印在陶...
2024-11-29 10:26:05