您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > CRC循环冗余校验码(并行+串行)
课程报告设计课题:CRC循环冗余校验码姓名:陈舒凌,高冉专业:电子信息工程学号:11151080071115106012日期2013年11月20日—2013年12月1日指导教师:傅文渊老师华侨大学信息科学与工程学院电子工程系CRC循环冗余校验码实验目的:设计一个在数字传输中常用的校验、纠错模块:循环冗余校验CRC模块,学习使用FPGA器件完成数据传输中的差错控制实验内容:采用的CRC生成多项式为X5+X4+X2+1,校验码为5位,有效信息数据为12位。A、根据以上信息,编写硬件描述语言完成上述功能,给出仿真波形。B、CRC校验生成模块和CRC校验查错模块连接在一起,协调工作。引出必要的观察信号,锁定引脚,并在EDA实验系统上实现之。C、如果输入数据、输出CRC码都是串行的,设计该如何实现?给出你的方案,并通过硬件验证。模2运算的原理模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。模2除法运算定义为:0÷1=01÷1=1多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷1011=1110……110,列竖式计算:1110────────1011〕1100100-1011──────1111-1011──────1000-1011──────0110-0000──────11引言随着工业控制系统网络化的不断发展,建立可靠、稳定、高速的通信网络已成为控制系统的必然要求。然而,在数字通信中可靠与快速往往是一对矛盾。若要求快速,则必然使得每个数据码元所占地时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误的可能性增加,传送信息的可靠性下降。若是要求可靠,则使得传送消息的速率变慢。其中差错检测和纠错控制是保证高可靠性的一种切实方法。在各种通信领域,多项式编码循环冗余码CRC简单且误判概率很低,被普遍应用。---实现方法CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。它的编码规则是:1)、首先将原信息码(kbit)左移r位(k+r=n)2)、运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。程序设计的原理并行输入输出CRC校验生成模块:libraryIEEE;useieee.numeric_std.all;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycrcversion2isPort(sdata:inSTD_LOGIC_VECTOR(11downto0);---messagebitsclk:inSTD_LOGIC;redundant:outSTD_LOGIC_VECTOR(4downto0);---redundantbitsdataid:instd_logic;hsend:outstd_logic;datacrco:outSTD_LOGIC_VECTOR(16downto0));---messagewithredundantbitsendcrcversion2;architectureBehavioralofcrcversion2isbeginprocess(clk)variablev:std_logic_vector(16downto0);variableu:std_logic_vector(16downto0);variablei,j:integer:=0;variablew:std_logic_vector(16downto0);constantmulticoef:STD_LOGIC_VECTOR(5downto0):=110101;---crcpolynomialbeginifclk'eventandclk='1'thenif(dataid='1')thenw(16downto5):=sdata(11downto0);---v有m+(n-1)个位forjin4downto0loopw(j):='0';第1段endloop;elsif(dataid='0')thenw(16downto0):=(others='0');endif;v(16downto0):=w(16downto0);u(16downto11):=multicoef(5downto0);第2段u(10downto0):=(others='0');foriin11downto0loop---移位m次,为得到余数部分的n-1个位if(v(16)='1')thenv:=vxoru;elsenull;--什么也不做第3段endif;v:=to_stdlogicvector(to_bitvector(v)sll1);endloop;redundant=v(16downto12);----redundantbitsdatacrco(16downto5)=w(16downto5);第4段datacrco(4downto0)=v(16downto12);hsend='1';---totalmessageendif;endprocess;endBehavioral;思路段1.在时钟上升沿到来时,把输入sdata的12个位赋给w的前12个位,后5个位都置0,构成一个17位。要是dataid是0,那不把sdata赋值给w,w置0。段2.把w赋值给v,v便会参与我们的模2除法。要是w都为0,v模2运算后肯定也是0。到时第4段里分别把w前12位给datacrco前12位,v的前5给datacrco的后5个位。这时也把我们的multicoeff扩展到17个位的u,把后11个位也都赋0。(这个后来想想下还是可以把v和u用12个位异或就好,只要移位够12次,那v剩下的前5位就是余数)段3.根据模2除法,做异或时我们的被除项的第一位必须是1才能做。若v的第一个位是1,v和u异或再赋回给v[由于u(110101...)和v的第一个位是1,异或完v的第一个位一定变成0],然后再把v移前一位,后面补0便可。否则便不异或,v直接就移前一位。共要移位12次才能获得我们5个位的余数。因此我们使用12次循环的loop语句。在每一次上升沿到,做12次的异或移位,不异或也移位,就会移了12个位。这里使用的移位方法是向左位移的语句sll,由于这个语句只能是给bit类型用,而我们的v是一个vector,那先强制转换成bit再转换去vector。当然这里可以用移位寄存器法来实现,v(17downto1):=v(16downto0);v(0):=’0’;段4.最后,段3loop语句做完后,v的前5个位是余数,赋给redundant,分别把w前12位的原信息数据给datacrco前12位,v的前5给datacrco的个位,datacrco便是我们的crc码了。Hsend=’1’。并联CRC校验生成模块仿真波形dataid=1时,信号sdata才能输入进行运算,将余数redundant接在datacrco的后面,作为输出;dataid=0时,信号sdata不能输入,不能进行运算,给输出datacrc0,redundant都赋值成零。并行输入输出的校验模块:libraryIEEE;useieee.numeric_std.all;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycrc0version2isPort(rdata:outSTD_LOGIC_VECTOR(11downto0);---messagebitsclk:inSTD_LOGIC;datacrci:inSTD_LOGIC_VECTOR(16downto0);datafini:outSTD_LOGIC;hrecv:instd_logic;error:outbit);---messagewithredundantbitsendcrc0version2;architectureBehavioralofcrc0version2isbeginprocess(clk)variablev:std_logic_vector(16downto0);variableu:std_logic_vector(16downto0);variablei:integer:=0;variablew:std_logic_vector(16downto0);constantmulticoef:STD_LOGIC_VECTOR(5downto0):=110101;---crcpolynomialbeginifclk'eventandclk='1'thenif(hrecv='1')thenw(16downto0):=datacrci(16downto0);---v有m+(n-1)个位第1段elsif(hrecv='0')thenw(16downto0):=(others='0');endif;v(16downto0):=w(16downto0);u(16downto11):=multicoef(5downto0);第2段u(10downto0):=(others='0');foriin16downto0loop---移位17次,为得到看是否能被整除if(v(16)='1')thenv:=vxoru;elsenull;第3段endif;v:=to_stdlogicvector(to_bitvector(v)sll1);endloop;if(v(16downto0)=00000000000000000)thenerror='0';rdata=w(16downto5);datafini='1';elseerror='1';第4段rdata=(others='0');datafini='0';endif;endif;endprocess;endBehavioral;思路校验这模块基本上是在接收模块的基础上改过来而已。这时的输入是一个17个位的crc码,输出会是crc吗的前12个位,即是我们的原信息数据。所以只说段3和段4。段3.在loop语句里,若第一位是1,输入的17个位v便和我们扩展成17位的multicoeff(110101)做异或,然后向左移位,否则便不做异或,直接向左移位。要是能整除,v没有余数,都为0。要是不能整除,v就不会都是0.段4.要是能整除,v没有余数,v都为0,error便输出0,把原先还没参与模2除法的w的前12个位赋给输出rdata。要是不能整除,v就不会都是0,那error便输出1,把rdata都赋0。并行CRC校验检错模块仿真波形当hrecv=1时,接收输入信号datacrci进行除法运算,datacrci能被110101整除时,error为0。完成标志位datafini为1,输出信号rdata为原来要校验的信号;datacrci不能被110101整除时error为1,完成标志位0,输出信号rdat
本文标题:CRC循环冗余校验码(并行+串行)
链接地址:https://www.777doc.com/doc-5281821 .html