预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共16页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

课程报告 设计课题: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; entitycrcversion2is Port(sdata:inSTD_LOGIC_VECTOR(11downto0);---messagebits clk:inSTD_LOGIC; redundant:outSTD_LOGIC_VECTOR(4downto0);---redundantbits dataid:instd_logic; hsend:outstd_logic; datacrco:outSTD_LOGIC_VECTOR(16downto0));---messagewithredundantbits endcrcversion2; architectureBehavioralofcrcversion2is beginprocess(clk) variablev:std_logic_vector(16downto0); variableu:std_logic_vector(16downto0); variablei,j:integer:=0; variablew:std_logic_vector(16downto0); constantmulticoef