循环冗余(CRC)模块设计说明

合集下载

循环冗余校验(CRC)原理与实现

循环冗余校验(CRC)原理与实现

(1)
然而,上述公式仅适用于理论模型,而实际应用中,还需要考虑几个问题
首先要考虑 CRC 的数据位,不管 P(x)有多长的数据位,总是希望有一个固定
位数的 R(x),以便在实现时可以节省很多资源。同时考虑到 P(x)的数据位长度可能
比 CRC 位数短,为了得到一个 16 位(或 32 位)的数据长度,必须将原有数据扩 展到 16 位以上(表示为 P(x)*Xr),才能到一个 16 位的余数。通常的做法是在 P(x)
1.2 CRC 的分类
目前 CRC 的使用分为标准和非标准两种,非标准为用户自定义 CRC 的生成多 项式,而标准是已被国际标准化组织规定的标准生成多项式,这也是目前广泛使用 的几种。
1.2.1 标准的 CRC
在通信协议中常见并被广泛使用的标准列于表中。(本文中以 16 位的 CRC-16 为
例,除非另外说明)。
循环冗余校验(CRC)原理与实现
版本 最后更新 页号 文档号
1.1 2005.9.12 6 of 10
表 1-2,8 位数据 0x02 的 16 位 CRC 数据产生 在图中我们可以看到,这个 0x02 数据被扩充到 24 位(原数据 8 位+16 位 CRC, 不足的用零填充),然后再与 0x8005(CRC-16 生成多项式)做模 2 运算。在运算 过程中,第 17 位总是被舍去(图中红色的位)。第 16 位如果是零,那么,只与 0x0000 作异或运算,即数据左移一位。如果为一,那么,就要与 0x8005 做模 2(异或)运 算。每次运算完毕,丢弃最高位,然后,将数据下一位移入,再进行新的模 2(异 或)运算,直到所有的位移完为止。
00000 0 0 0 0 0 0 0 0 0 0 0 0

计算机通信中循环冗余校验码的设计

计算机通信中循环冗余校验码的设计

摘要通信的目的是要把信息及时可靠地传送给对方,因此要求一个通信系统传输消息必须可靠与快速,在数据通信系统中可靠与快速往往是一对矛盾。

为了解决可靠性,通信系统都采用了差错控制。

CRC(Cyclical Redundancy Checking)循环冗余校验码是一种重要的线性分组码,通过多项式除法检测错误,是在数据通信和数据检测中广泛应用的检错校验的循环码。

本设计研究了纠错码及循环冗余校验码的原理,以及利用MATLAB对其进行了编程和编译仿真,实现了CRC循环冗余校验码的编码及校验,在接收端收到通过校验的码,从而确定传输过程是否出错,得到的结论和理论上是一致的。

关键词:检错码;循环冗余校验码;matlab软件前言 (1)第一章计算机通信与纠错码 (1)1.1计算机通信技术的历史和发展 (1)1.1.1通信的概念 (1)1.1.2通信的发展史简介 (1)1.1.3计算机通信介绍 (2)1.2纠错码 (2)1.3纠错原理 (3)第二章 CRC原理与介绍 (5)2.1 CRC介绍 (5)2.2 CRC原理 (5)2.2.1编码规则 (5)2.2.2 CRC码生成和校验 (6)第三章MATLAB语言编程与运行 (7)3.1 MATLAB语言的介绍 (7)3.2 程序流程图 (9)3.3 MATLAB程序 (10)第四章结果分析 (13)参考文献 (14)总结与致谢 (15)随着科学技术的进步, 人们对信息传递的要求逐渐提高。

但在通信系统中, 可靠性与有效性是对矛盾, 要求有效性提高, 必然使每个码元所占的时间缩短, 从而受干扰和产生错误的可能性增大, 可靠性降低了; 要提高信息的可靠性,又使信息速率变慢有效性降低。

因此, 合理的解决有效性与可靠性这对矛盾, 是正确设计一个通信系统的关键问题之一, 为保证传输过程的可靠性, 就需要对通信过程进行差错控制。

循环冗余校验码CRC(cyclic redundancy check)是一种高效率且可靠的方法, 由线性分组码分支而来的, 是一种通过多项式除法检测错误的很不寻常而又巧妙的方法, 一方面它有很强的检测能力, 二是它的编码器电路及错误检测器电路都很容易实现, 它的优点使它在通信系统中得到了广泛的应用。

CRC循环冗余校验器

CRC循环冗余校验器

end component; signal elk,din,reset,en: STD_LOGIC; signal q: STD_LOGIC_VECTOR(15 downto 0); begin u0: crc_16 PORT MAP(elk=>elk,din=>din,reset=>reset,q=>q,en=>en);
Library IEEE; use IEEE.std_logic_1164.all; entity crc_16 is port(elk,din,reset,en:in STD_LOGIC; q:out STD_LOGIC_VECTOR(15 downto 0)); end crc_16; architecture crc_arch of crc_16 is signal D:STD_LOGIC_VECTOR(15 downto 0); begin process(elk,en,reset) begin
第五章 本设计的优点及缺点
优点:
设计的 VHDL 语言简单易读,可延伸性强,可以根据自己的需求任意设计出 一个检验函数为 g(x)的检验系统;
本设计对多种可能出现的错误举出了例子,并对此加以简单的分析; 本设计额外添加了一个 en 的控制端,可以控制其输入的数据长度,并能够 将生成的结果一直存放到寄存器中,便于观察。
第三章 实现方法
由结构图知主要由移位寄存器构成,寄存器主要用以由高位向低位的移动, 异或门则处理模2除法。对于任意一个想要处理的校验函数g(x),其实现步骤 为:
1. 由高到低,首先写出该校验函数的二进制表达式。 2. 选择比g(x)低一阶数量的移位存储器用以存放余数。 3. 对于校验函数各位不为0的部分,在不为相应位数的寄存器前方加一个异 或门即可,如对x^16,则在D15前方加异或门即可。 另外,考虑到数据输入输出的便捷性,在本次设计创作中,我又增添了复位 键和使能键端口,其中使能端口可以控制输入数据的长度,根据信息位 K 位的长 度来决定本系统运行的时间,而对于复位键来说,当要第二次余数计算时,则必 须先将寄存器中的数据清空,方能进行下一步操作。

循环冗余校验CR C 的算法分析及其实现方法

循环冗余校验CR C 的算法分析及其实现方法

CRC循环冗余校验CRC的算法分析及其实现方法摘要:循环冗余校验(Cyclic Redundancy Check)是一种编码简单,且高效、可靠的差错控制方法,广泛应用于测控及数据通信领域。

阐述用循环冗余校验码CRC进差错控制的原理、并介绍使用硬件和软件两种方式实现CRC码的方法。

关键词:循环冗余校验 CRC 软件实现查表法循环冗余校验(Cyclic Redundancy Check),简称循环码或CRC码,是一种高效、可靠的检错和纠错码。

由于检错能力强,误判概率很低,并且编、译码电路简单,因而在工业检测及数据通信领域应用甚广。

目前,循环码常用作检错码。

下面重点CRC的原理及其软件、硬件实现方法。

1、CRC校验的原理CRC码是一种线性,分组的系统码,通常前k位为信息码元,后r位为监督码元。

CRC校验的基本思想是利用线性编码理论,以一定的规则产生一个校验用的监督吗(即CRC码)r位,并附在信息后边,构成一个新的二进制码序数共n=k+r位,最后发送出去,其格式如图1所示。

在接收方,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

图1 CRC格式的生成r位的CRC码产生的规则是先将要发送的二进制序数左移r位(即乘以2r)后,再除以一个生成多项式,最后所得到的余数就是CRC吗,如(1)式所示。

其中,B(X)表示k 位的二进制序列数,G(X)为生成多项式,Q(X)位伤多项式,R(X)是余数多项式(即CRC码)。

多项式X"B(X)/G(X)=Q(X)+R(X)/G(X) (1)把(1)式移项得X"B(X)-R(X)=Q(X)G(X) (2)由于模2的加法、减法运算等价,所以(2)式可表示为:X"B(X)+R(X)=Q(X)G(X)=T(X) (3)T(X)就是发送方要发送的数据及其CRC码,与图1所示的格式一致。

另外,T(X)正好能被G(X)整除。

由(3)式可知,如果接收方收到的信息T"(X)没有发生错误,与T(X)相同,则T"(X)同样能被生成多项式G(X)整除,即余数为0.若余数不为0,则表示在通信过程中发生了错误,接收方应要求发送方重发。

组成原理课设-CRC循环冗余检验码生成与实现

组成原理课设-CRC循环冗余检验码生成与实现

课程设计报告课程设计名称:组成原理课程设计课程设计题目:循环冗余校验码生成电路的设计与实现院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:说明:结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。

报告和电子数据必须作为实验现象重复的关键依据。

学术诚信声明本人声明:所呈交的报告(含电子版及数据文件)是我个人在导师指导下独立进行设计工作及取得的研究结果。

尽我所知,除了文中特别加以标注或致谢中所罗列的内容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。

与我一同工作的同学对本研究所做的任何贡献均己在报告中做了明确的说明并表示了谢意。

报告资料及实验数据若有不实之处,本人愿意接受本教学环节“不及格”和“重修或重做”的评分结论并承担相关一切后果。

本人签名: 日期:年月日目录第1章总体设计方案 (1)1.1设计原理 (1)1.2设计思路 (2)1.3设计环境 (3)第2章详细设计方案 (4)2.1顶层方案图的设计与实现 (4)2.1.1创建顶层图形设计文件 (4)2.2功能模块的设计 (4)2.2.1移位寄存器的设计 (5)2.2.2模2除法器的设计 (6)2.3CRC码生成电路整体仿真 (9)第3章编程下载与硬件测试 (12)3.1器件的选择与引脚锁定 (12)3.2编程下载 (13)3.3硬件测试及结果分析 (13)参考文献 (16)附录(电路原理图) (17)第1章 总体设计方案1.1 设计原理循环冗余校验码(Cyclic Redundancy Check,CRC)简称为循环码或CRC 码。

此码可以发现并纠正信息在存储或传送过程中连续出现的多位错误代码。

计算机常用的二进制信息沿一条信号线逐位在设备之间传送称为串行传送,CRC 码常用于串行传送过程中的检错与纠错。

CRC 码一般是指n 位信息码之后拼接k 位校验码。

eda循环冗余crc校检模块实验

eda循环冗余crc校检模块实验

循环冗余校验CRC模块设计实验报告通信1001 毕卫欢1.1循环冗余校检crc模块代码(将书上的例子修改后例化的代码)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity crc_sd isport (clk,datald,rst:in std_logic;sdata:in std_logic_vector(11 downto 0);rdata:out std_logic_vector(11 downto 0);error0:out std_logic;datafini:out std_logic);end entity crc_sd;architecture one of crc_sd iscomponent crcssport(clk,datald,rst:in std_logic;--时钟信号,装载信号,复位信号sdata:in std_logic_vector(11 downto 0);--发送数据接受datacrco:out std_logic_vector(16 downto 0);--crc数据发送hsend:out std_logic ); --握手信号(发)end component;component crcdport( clk,hrecv,rst:in std_logic; --时钟信号,握手信号(收),复位信号datacrci:in std_logic_vector(16 downto 0); --crc数据接受rdata:out std_logic_vector(11 downto 0); --正确的数据验证后输出datafini:out std_logic; --数据验证完成信号error0:out std_logic ); --错误信号和握手信号(发)end component;signal datacrc_p:std_logic_vector(16 downto 0);signal hsen_p:std_logic;beginu1:crcss port map(clk=>clk,datald=>datald,rst=>rst,sdata=>sdata,datacrco=>datacrc_p,hsend=>hsen_p);u2:crcd port map(clk=>clk,rst=>rst,hrecv=>hsen_p,datacrci=>datacrc_p,rdata=>rdata,datafini=>datafini,error0=>erro r0);end architecture one;1.1.1循环冗余校检crc模块编译报告编译报告1.1.2循环冗余校检crc模块RTL视图1.1.3循环冗余校检crc模块仿真测试文件use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity tb_crc_sd isend tb_crc_sd;architecture com of tb_crc_sd iscomponent crc_sd isport (clk,datald,rst:in std_logic; sdata:in std_logic_vector(11 downto 0);rdata:out std_logic_vector(11 downto 0); error0:out std_logic;datafini:out std_logic);end component;signal clk,datald,rst:std_logic;signal sdata: std_logic_vector(11 downto 0):="010*********";signal rdata: std_logic_vector(11 downto 0);signal error0: std_logic; signal datafini:std_logic; constant ptime:time :=20 ns;beginlihua1:crc_sd port map(clk=>clk,datald=>datald,rst=>rst,sdata=>sdata,rdata=>rdata,error0=>error0,datafini=>datafini);process beginclk<='0';wait for ptime/2;clk<='1';wait for ptime/2;end process;rst<='1';wait for 5 ns;rst<='0';datald<='1';wait for 10 ns;datald<='0';wait;end process;end architecture com;1.1.4仿真结果分析:1.从仿真结果中可以看到,发送sdata信息码后,经过17个周期后从验错模块输出;2.由于时钟检测的延时影响,延时了一个周期;为了更加便于观察结果,下面就循环冗余校检两个模块单独给出代码和反正结果1.2Crc生成校检模块代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity crcs isport(clk,datald,rst:in std_logic;--时钟信号,装载信号,复位信号sdata:in std_logic_vector(11 downto 0);--发送数据接受datacrco:out std_logic_vector(16 downto 0);--crc数据发送hsend:out std_logic--握手信号(发));end entity crcs;architecture one of crcs isconstant multi_coef: std_logic_vector(5 downto 0) :="110101";--生成多项式signal cnt:std_logic_vector(4 downto 0);--计数信号signal dtemp,sdatam:std_logic_vector(11 downto 0);--两个用于传送,处理sdata的信号signal st:std_logic;--类似状态信号beginvariable crcvar :std_logic_vector(5 downto 0);--存放异或结果(摸2加)variable hs:std_logic;variable datao:std_logic_vector(16 downto 0);beginif rst ='1' then st<='0'; datao:=(others=>'0'); hs:='0'; --复位elsif(clk'event and clk ='1')thenif(st = '0' and datald ='1') thendtemp <= sdata; --用于对sdata的数据操作的信号sdatam <= sdata; --保存sdata的数据信息的信号cnt <= (others=>'0');--计数清零st<='1';--状态模式设置为‘1’,即进行crc码的产生elsif(st ='1' and cnt < 7) then --可以考虑cnt采用12cnt <= cnt + 1;if(dtemp(11)='1') thencrcvar :=dtemp(11 downto 6)xor multi_coef;--首位为‘1’时异或dtemp <= crcvar(4 downto 0) & dtemp(5 downto 0) & '0';elsedtemp <= dtemp(10 downto 0) & '0';--首位为‘0’则右移一位end if;elsif(st='1' and cnt=7)then --第‘8’个时钟的时候开始握手传数据datao:=sdatam & dtemp(11 downto 7);--发送crc的17位码hs :='1';--握手信号置位cnt <=cnt + 1;elsif(st='1' and cnt =8) then hs := '0';st <= '0';--第九个周期为回复初始化状态end if;end if;datacrco<=datao;hsend<=hs;end process;end architecture one;1.2.1 crc生成校检模块的编译结果crc生成校检模块的编译结果1.2.2 crc生成校检模块RTL视图1.2.3 crc生成校检模块的仿真结果1.3 Crc校检验错模块代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity crcd isport( clk,hrecv,rst:in std_logic; --时钟信号,握手信号(收),复位信号datacrci:in std_logic_vector(16 downto 0); --crc数据接受rdata:out std_logic_vector(11 downto 0); --正确的数据验证后输出datafini:out std_logic; --数据验证完成信号error0:out std_logic --错误信号和握手信号(发));end crcd;architecture one of crcd isconstant multi_coef: std_logic_vector(5 downto 0) :="110101";--生成多项式signal rcnt:std_logic_vector(4 downto 0);--计数信号signal rdtemp:std_logic_vector(11 downto 0);--用于存放12位有效数据信息信号signal rdatacrc:std_logic_vector(16 downto 0); --存放crc的17位信息信号signal rt:std_logic;--类似状态的信号beginprocess(rst,hrecv,clk)variable rcrcvar : std_logic_vector(5 downto 0);beginif rst ='1' then rt <='0';datafini<='0'; error0<='0'; rdata<=(others=>'0');--复位elsif(clk'event and clk ='1')thenif(rt = '0' and hrecv ='1')thenrdtemp <=datacrci(16 downto 5);rdatacrc <=datacrci;rcnt <=(others=>'0');error0<= '0';rt<='1';elsif(rt = '1' and rcnt<7)thenrcnt<=rcnt+1;if(rdtemp(11) = '1')thenrcrcvar := rdtemp(11 downto 6)xor multi_coef;rdtemp<= rcrcvar(4 downto 0) & rdtemp(5 downto 0) & '0';else rdtemp<= rdtemp(10 downto 0)&'0';end if;elsif(rt='1' and rcnt=7)thendatafini<='1';rdata<=rdatacrc(16 downto 5);rt<='0';if(rdatacrc(4 downto 0)/=rdtemp(11 downto 7))then--判断验错模块的冗余码和校检模块的冗余码是否相同,不相同为trueerror0<='1';--为真说明不相等,error0输出‘1’end if;end if;end if;end process;end architecture one;library ieee;1.3.1 Crc校检验错模块编译报告编译报告1.3.2 Crc校检验错模块RTL视图RTL视图1.3.4 Crc校检验错模块仿真结果分析:1.结合将两个程序例化的仿真结果与改验错模块的仿真结果,我们可以看到,在验错模块接收到数据和握手信号后,经过8个时钟周期完成一次验错过程,基于此,我们可以知道,最初的那个例化结果的仿真的17个周期确实是存在这延时的问题,即接受到的握手信号在时钟上升沿后置高,因此只能在下一个时钟上升沿时检测到我手信号;2.当然我们也可以看到,由于是经过8个周期的验错,所以其原理上是和crc循环冗余相似。

循环冗余校验算法的实现 (修订)

循环冗余校验算法的实现 (修订)
循2环冗0 余X 校X验 (CRC)算法的实


-
1 CRC算法概述
目录
CONTENTS
2 CRC-32算法实现
3 CRC-16算法实现
4 CRC算法的优化
5 CRC算法的应用
6 CRC算法的变体
7 CRC算法的未来发展
2
循环冗余校验(CRC)算法的实现
循环冗余校验(CRC,Cyclic Redundancy Check)是一 种广泛用于数据传输和存储的错误检测算法。CRC通 过在数据块后面添加校验码来检测数据传输或存储过 程中可能出现的错误。CRC算法简单、高效,且在许 多情况下能够检测出大部分的错误
NEXT
CRC算法的未来发展
自适应的CRC长度 为了满足不同数据包大小和传输速率的需求,未来可能会开发出自适应的CRC长度算法。 这些算法可以根据数据包的大小动态调整CRC长度,以提高检错能力和性能 8 与压缩技术的结合 CRC算法可以与数据压缩技术结合使用,以在压缩数据的同时进行错误检测。这将提高数 据的传输效率和可靠性,同时减少传输和存储所需的空间 9 智能错误修复 未来的CRC算法可能会引入智能错误修复机制。当检测到错误时,算法可以自动尝试修复 错误,而不是简单地要求重新传输或存储数据。这将提高系统的可用性和效率 10
CRC算法的未来发展
1 可配置的生成多项式:为了满足不同应用场 景的需求,可能会开发出可配置的CRC算法, 允许用户根据需要选择不同的生成多项式。 这将为用户提供更大的灵活性,以满足特定 的性能和检错要求
2 跨平台兼容性:随着云计算、物联网等技术 的普及,跨平台的数据传输和存储需求不断 增加。因此,未来可能会开发出跨平台的 CRC算法,以适应不同操作系统、硬件平台 和通信协议的需求

循环冗余校验CRC模块设计EDA实验报告

循环冗余校验CRC模块设计EDA实验报告

《EDA技术》实验报告实验名称:循环冗余校验(CRC)模块设计姓名:xxx班级:xxxx学号:xxxxx实验日期:指导教师:一、实验设计要求编译示例文件,给出仿真波形。

建立一个新的设计,调入crcm模块。

把其中的CRC校验生成模块和CRC校验查错模块连接在一起,协调工作。

引出必要的信号,锁定引脚,并在EDA 实验系统上实现。

二、设计原理电路结构图或原理图:Crcm:Crcma:电路功能描述:把crcm模块的datacrco和datacrci连接起来,hrecv和hsend连接起来,输入有效数据后CRC校验生成模块对数据进行特殊运算,产生5位校验码,并和原数据并接成17位传输数据,CRC校验查错模块取出传输数据后12位并对它进行同样的特殊运算,得到5位校验码,于传输数据钱5位比较,如果一样那么传输无误,不一样说明数据在传输途中错误了。

三、实验程序程序一:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity crcm isport(clk,hrecv,datald,rst:in std_logic;sdata:in std_logic_vector(11 downto 0);datacrco:out std_logic_vector(16 downto 0);datacrci:in std_logic_vector(16 downto 0);rdata:out std_logic_vector(11 downto 0);datafini:out std_logic;error0,hsend:out std_logic);end crcm;architecture comm of crcm isconstant multi_coef: std_logic_vector(5 downto 0) :="110101";signal cnt,rcnt:std_logic_vector(4 downto 0);signal dtemp,sdatam,rdtemp:std_logic_vector(11 downto 0);signal rdatacrc:std_logic_vector(16 downto 0);signal st,rt:std_logic;beginprocess(rst,clk)variable crcvar :std_logic_vector(5 downto 0);beginif rst ='1' then st <='0' ;elsif(clk'event and clk ='1')thenif(st = '0' and datald ='1') then dtemp <= sdata;sdatam <= sdata;cnt <= (others=>'0'); hsend<='0'; st<='1';elsif(st ='1' and cnt < 7) then cnt <= cnt + 1;if(dtemp(11)='1') then crcvar :=dtemp(11 downto 6)xor multi_coef;dtemp <= crcvar(4 downto 0) & dtemp(5 downto 0) & '0';else dtemp <= dtemp(10 downto 0) & '0';end if;elsif(st='1' and cnt=7)then datacrco<=sdatam & dtemp(11 downto 7);hsend <='1';cnt <=cnt + 1;elsif(st='1' and cnt =8) then hsend <= '0';st <= '0';end if;end if;end process;process(rst,hrecv,clk)variable rcrcvar : std_logic_vector(5 downto 0);beginif rst ='1' then rt <='0';elsif(clk'event and clk ='1')thenif(rt = '0' and hrecv ='1')then rdtemp <=datacrci(16 downto 5);rdatacrc <=datacrci;rcnt <=(others=>'0');error0<= '0';rt<='1';elsif(rt = '1' and rcnt<7)then datafini<='0';rcnt<=rcnt+1;if(rdtemp(11) = '1')then rcrcvar := rdtemp(11 downto 6)xor multi_coef;rdtemp<= rcrcvar(4 downto 0) & rdtemp(5 downto 0) & '0';else rdtemp<= rdtemp(10 downto 0)&'0';end if;elsif(rt='1' and rcnt=7)then datafini<='1';rdata<=rdatacrc(16 downto 5); rt<='0';if(rdatacrc(4 downto 0)/=rdtemp(11 downto 7))thenerror0<='1';end if;end if;end if;end process;end comm;程序二:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity crcma isport (clk,datald,rst:in std_logic;sdata:in std_logic_vector(11 downto 0);rdata:out std_logic_vector(11 downto 0);error0:out std_logic;datafini:out std_logic);end crcma;architecture comm of crcma iscomponent crcmport (clk,hrecv,datald,rst:in std_logic;sdata:in std_logic_vector(11 downto 0);datacrco:out std_logic_vector(16 downto 0);datacrci:in std_logic_vector(16 downto 0);rdata:out std_logic_vector(11 downto 0);datafini:out std_logic;error0,hsend:out std_logic);end component;signal datacrcp:std_logic_vector(16 downto 0);signal hsenp:std_logic;beginu1: crcm port map(rst=>rst,clk=>clk,sdata=>sdata,datald=>datald,datacrco=>datacrcp,hrecv=>hsenp,hsend=>hsenp,datacrci=>datacrcp,rdata=>rdata,error0=>error0,datafini=>datafini);end architecture comm;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附表1:
大学学生实验报告
开课学院及实验室:物理与电子工程学院-电子楼317室2016年 5 月 26 日
.学习帮手.
.学习帮手. 图10-1 CRC模块
sdata:12位的待发送信息
datald:sdata的装载信号
datacrc:附加上5位CRC校验码的17位CRC码,在生成模块被发送,在接收模块被接收。

clk:时钟信号
rdata:接收模块(检错模块)接收的12位有效信息数据
hsend、hrecv:生成、检错模块的握手信号,协调相互之间关系
error:误码警告信号
datafini:数据接收校验完成
采用的CRC生成多项式为X5+X4+X2+1,校验码为5位,有效信息数据为12位。

2、实验步骤:
(1)编译以上示例文件,给出仿真波形。

(2)建立一个新的设计,调入crcm模块,把其中的CRC校验生成模块和CRC校验查错模块连接在一起,协调工作。

引出必要的观察信号,锁定引脚,并在EDA实验系统上的FPGA目标器件中实现。

三、实验HDL描述:
module sender(clk,sdata,datald,datacrc,hsend);
input[11:0] sdata;
input clk,datald;
output[16:0] datacrc;
output hsend;
.学习帮手.
.学习帮手.
.学习帮手.
.学习帮手.
.学习帮手. 电路原理图的顶层设计
四、仿真结果:
仿真时序图
运行流程:datald为0时,生成、接收模块最终保持在s9、s8状态;当datald在一个时钟上升沿为1时,生成模块从s0运行至保持s9;其中生成模块s8状态的操作使联络信号置1,接收模块也将因此从s0运行至保持s9。

上图初始时运行流程为:
.学习帮手.
六、硬件测试结果:.学习帮手.
.学习帮手. 下载程序到目标机
图1
.学习帮手. 图2 图3
注:采用模式1。

由键4-键2设置待发送的数据并由数码管4-数码管2显示;数码管7-数码管5显示接收到的数据;LED-D8为error信号;LED-D7为datafini信号;键7控制datald信号,由硬件测试可以清晰的看到,当datald信号经过一次高低电平切换后,在数码管7-数码管5显示出接收到的数据和输入的数据一致。

七、实验心得:
通过本次实验使我明白了循环冗余(CRC)校验实现的原理,同时也掌握了其Verilog HDL代码编写及原理图设计的方法。

八、思考题:
1.如果输入数据、输出CRC码都是串行的,设计该如何实现(提示:采用LFSR)。

答:通过线性反馈移位寄存器(LFSR)实现。

通过CRC的生成原理知道CRC的检验码生成是通过除法得到,由此联想到可以通过LFSR来产生校验码。

假设原信息码子多项式为
生成多项式为
那么CRC的码字为,使用用LFSR电路来进行实现,将M(x)向左移r位在电路中的意义即为输入完信息码后再输入r个0,所以在电路上的表现就如图所示。

.学习帮手.
目名称”栏以上部分统一。

.学习帮手.。

相关文档
最新文档