CRC编码器的设计_第1页
CRC编码器的设计_第2页
CRC编码器的设计_第3页
CRC编码器的设计_第4页
CRC编码器的设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一、设计目的:3二、设计要求3三、CRC循环冗余校验简介3四、CRC的编码原理3五、CRC校验原理6(1)CRC码的检错方法6(2)模2除法器6(3)校验位的生成7(4)CRC码的纠错8(5)生成多项式的选取8六、设计方案8(1)采用标准8(2)系统结构设计9(3)模块代码11七、波形结果25八、心得及体会25(1)关于CRC的了解25(2)关于期待的改进26(3)课程设计总结26九、参考文献:26CRC编码器的设计一、 设计目的:掌握CRC的编码原理及作用, 并进行设计。二、设计要求1、阐述CRC的编码原理及作用2、基于VHDL语言实现CRC的编码 3、写出详细的设计报告(不少于5000

2、字)三、 CRC循环冗余校验简介循环冗余校验(CRC)是一种根据网络数据封包或电脑档案等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。而且CRC码是目前通信系统中最常用的一种差错控制编码,利用其进行检错的过程可简单描述为:在发送端根据要传送的二进制码序列,以一定的规则产生一个校验用的监督码,附在原始信息后边,构成一个新的二进制码序列数,然后发送出去。在接收端根据信息码和CRC 码之间所遵循的规则进行检验,一旦传输过程中发生差错,则信息码元与监督码元之间

3、的关系遭到破坏,从而可以发现错误,乃至纠正错误。四、 CRC的编码原理循环冗余校验码(cyclic redundancy check,CRC)简称为循环码或CRC码。二进制信息沿一条信号线逐位在设备之间传送称为串行传送,CRC码常用于串行传送过程中的检错与纠错。CRC码由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码。其中任意一个二进制位码都可以和一个系数仅为0和1取值的多项式一一对应。例如:代码1010111对应的多项式为,而多项式为对应的代码101111。由上可以看出,CRC 多项式是线性结构,可以非常容易地故意改变量据而维持 CRC 不变。所以尽管在错误检测中非常有用,C

4、RC 并不能可靠地校验数据完整性。CRC码的编码格式如图4.1所示,是在k位有效数据之后添加r位校验码,形成总长度为n的CRC码,简写作C(n,k)码。CRC编码的关键技术在于如何从k位信息简便的得到r位校验码,并根据总长度为n的CRC码进行纠错。图4.1设被校验的数据是一个k位的二进制代码,将它表示为一个(k-1)阶的多项式 (1-1)多项式(1-1)中的系数D的取值为0或1,与被校验的数据M一一对应;式中的x是一个伪变量,用指明各位的位置。设校验码P长度为r,将被校验数据D左移r位后的结果为将D左移r位的目的是给D右边添加r个0,形成(k+r)位长度二进制代码,其多项式形式为M(x)

5、15;。如图4.1所示,CRC码由k位数据D和r位校验码P组成,求校验码P的多项式R(X)的方法如下:  (4-2)Q(x)是商,R(x)是余数,R(x)所对应的二进制代码是校验码P。可以证明存在一个最高次幂为n- k=r 的多项式G(x) ,即式(4-2)中G(x),称为生成多项式。 由式(4-2)可以推导出 (4-3)由式(4-3)可知,CRC码可被G(x)整除,余数必然为0.。根据这一特性,接收方将收到的CRC码被G(x)除,若余数为0,则表明传送过程中没有错误发生,若出现一位错,根据余数与出错位一一对应的关系,可利用余数对错误码进行定位。因此,接收方可根据表4.1发现并纠正1

6、位错。 Q6Q5Q4Q3Q2Q1Q0余数出错位正确1100010000无错误1100011001Q01100000010Q11100110100Q21101010011Q31110010110Q41000010111Q50100010101Q6表4.1 循环校验码的出错模式对于其验证码,它的编码规则是,如果CRC码共长个bit,信息码长个bit,就称为码:1、首先将原信息码( bit)左移位();2、运用一个生成多项式(也可看成二进制数)用模2除上面的式子,得到的余数就是利用生成多项式生成CRC校验码。而在构建一个新的 CRC 多项式或者改进现有的 CRC 时,一个通用的数学原则是使用满足所有

7、模运算不可分解多项式约束条件的多项式。这种情况下的不可分解是指多项式除了与它自身之外不能被任何其它的多项式整除。如果 CRC 有多于一个的非零系数,那么 CRC 能够检查出输入消息中的所有单数据位错误。同时其也可以用于检测短于的输入消息中的所有双位错误,其中是多项式的最长的不可分解部分的长度。另外,如果多项式可以被整除,那么不存在可以被它整除的有奇数个非零系数的多项式。因此,它可以用来检测输入消息中的奇数个错误,就像奇偶校验函数那样。五、 CRC校验原理 (1)CRC码的检错方法 假设要进行校验的数据信息为一个位的二进制数据,将左移位后,用一个约定的生成多项式相除,将所得校验位拼接到的位数据后

8、面,形成一个位的代码,称这个代码为循环冗余校验(CRC)码,也称()码。 图5.1 CRC码结构 (2)模2除法器模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。它是CRC校验中的一个十分重要的部分,用于得到校验码。图5.2 模2除法器示例如图所示,用10011来除,大致方法与二进制除法相同,但是相比之下,模2除法没有进位与借位,所以在相减的时候,则做异或运算。前面为0的可以直接省略,从第一位为1开始计数。(3)校验位的生成 假设:要传送的数据信息为:100011,即报文多项式为:约定的生成多项式为:则数据信息位数,生成多项式位数为4位,所以校验位位

9、数。生成校验位时,用去除以,相除时采用“模2运算”的多项式除法。 利用“模2”多项式除法计算的过程。则有:校验位为111,CRC码为100011111。说明:如果要校验CRC码,则可将CRC码用同一个多项式相除,若余数为0,则说明无错;若余数不为0,则说明有错。 图5.3 校验位生成示例(4)CRC码的纠错在接收方将收到的CRC码用约定的生成多项式去除,如果码字没有错误,则余数为0,若有一位出错,则余数不为0,而且不同的出错位置其余数不同。更换不同的码字,余数和出错位的关系不变。只和码制与生成多项式有关。 如果CRC码中有一位出错,用特定的作模2除,则会得到一个不为0的余数。若对余数补0后继续

10、除下去,则会出现一个有趣的现象:各次余数将会按照一个特定的顺序循环。(5)生成多项式的选取 从查错和纠错的要求来看,选取的一个生成多项式应满足以下几个条件:1、 任何一位发生错误时,都应使余数不为0。2、不同位发生错误时,余数应该不同。3、对余数作模2 除时,应使余数循环。六、设计方案(1)采用标准根据应用环境与习惯的不同,CRC又可分为以下几种标准: 1、CRC-12码;2、CRC-16码;3、CRC-CCITT码;4、CRC-32码;它们都是较为常用的CRC码,生成多项式分别为:CRC-CCITT:CRC-16:CRC-12:CRC-32: 标准的CRC码是CRC-CCITT和CRC-16

11、,其中CRC-16-CCITT的应用最广泛,在蓝牙、X25和PPP协议中等都有应用。故本实验使用CRC-CCITT标准进行仿真,其生成多项式为:本实验采用如图6.1所示的结构实现CRC的编解码。(2)系统结构设计图6.1 CRC校验系统结构CRC编码采用如图6.2所示的结构实现:图6.2 CRC编码实现结构CRC校验采用多项式除法实现,若能除尽,则传输正确,否则错误。实现结构上,在发送端进行CRC-CCITT标准编码,在接收端将信源数据与编码字串行输入与发送端相同的CRC编码器,若编码字为全零,则无传输错误,否则,传输出错。发送端CRC编码器设计时序如图6.3所示。接收端CRC校验时序与发送端

12、相同,区别只在于无需顺序移出CRC编码字,只需判断是否为全零即可。引入噪声的结构如图7所示,其中噪声来源为随机产生的比特序列,与帧解析的数据输出进行异或,其原理为dout与0异或仍为dout,dout与1异或为dout,因此噪声序列只需随机引入几个1即可实现传输错误的模拟。图6.3 发送端CRC编码时序图图6.4 引入噪声仿真结构图6.4中frame模块实现的是组帧功能,根据RS-232的组帧格式,在有效数据前加一比特起始位0,数据结束后加一比特停止位1,其时序图如图6.5所示。图6.5 frame模块端口时序图6.4中frame receive模块实现帧解析功能,它根据发送端发送的数据,检测

13、到一个起始位零,即生成计数使能信号,生成数据有效信号data_dv,其时序图如图6.6所示。图6.6 receive模块时序(3)模块代码(1)toplibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc_ans is port( clk:in std_logic; reset:in std_logic; din:in std_logic; din_dv:in std_logic; noise:in std_logic; er

14、ror_right:out std_logic; error_noise:out std_logic );end crc_ans;architecture behavioral of crc_ans iscomponent crc_codeport( clk:in std_logic; reset:in std_logic; din:in std_logic; din_dv:in std_logic; dout_dv:out std_logic; dout:out std_logic);end component;component crc_frame port( clk:in std_log

15、ic; reset:in std_logic; din:in std_logic; din_dv:in std_logic; dout:out std_logic);end component;component crc_frame_receiveport( clk:in std_logic; reset:in std_logic; din:in std_logic; dout_dv:out std_logic; dout:out std_logic);end component;component crc_checkport( clk:in std_logic; reset:in std_l

16、ogic; din:in std_logic; din_dv:in std_logic; error:out std_logic);end component;signal code_dout,code_dout_dv:std_logic;signal frame_dout:std_logic;signal frame_receive_dout,frame_receive_dout_noise,frame_receive_dout_dv:std_logic;beginpart1:crc_codeport map ( clk=>clk,reset=>reset,din=>din

17、,din_dv=>din_dv, dout=>code_dout,dout_dv=>code_dout_dv );part2:crc_frameport map ( clk=>clk,reset=>reset,din=>code_dout,din_dv=>code_dout_dv, dout=>frame_dout );part3:crc_frame_receiveport map ( clk=>clk,reset=>reset,din=>frame_dout, dout=>frame_receive_dout,dout_

18、dv=>frame_receive_dout_dv );part4_no_noise:crc_checkport map ( clk=>clk,reset=>reset,din=>frame_receive_dout,din_dv=>frame_receive_dout_dv, error=>error_right); frame_receive_dout_noise<=frame_receive_dout xor noise );part5_noise:crc_checkport map (clk=>clk,reset=>reset,di

19、n=>frame_receive_dout_noise,din_dv=>frame_receive_dout_dv, error=>error_noise );end behavioral;(2)codelibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc_code is port( clk:in std_logic; reset:in std_logic; din:in std_logic; din_dv

20、:in std_logic; dout_dv:out std_logic; dout:out std_logic );end crc_code;architecture behavioral of crc_code issignal cnt:std_logic_vector(6 downto 0);signal cnt_en:std_logic;signal d1:std_logic_vector(15 downto 0);beginprocess(clk,reset)begin if reset='0' then cnt_en<='0' elsif cl

21、k'event and clk='1' then if cnt="1001111" then cnt_en<='0' elsif din_dv='1' then cnt_en<='1' end if; end if;end process;process(clk,reset)begin if reset='0' then cnt<="0000000" elsif clk'event and clk='1' then if cn

22、t_en='1' then cnt<=cnt+'1' end if; end if;end process;process(clk,reset)begin if reset='0' then dout_dv<='0' elsif clk'event and clk='1' then if din_dv='1' then dout_dv<='1' elsif cnt="1001111" then dout_dv<='0'

23、; end if; end if;end process; process(clk,reset)begin if reset='0' then d1<=(others=>'0'); elsif clk'event and clk='1' then if din_dv='1' then d1(0)<=din xor d1(15); d1(1)<=d1(0); d1(2)<=d1(1); d1(3)<=d1(2); d1(4)<=d1(3); d1(5)<=d1(4) xor (

24、din xor d1(15); d1(6)<=d1(5); d1(7)<=d1(6); d1(8)<=d1(7); d1(9)<=d1(8); d1(10)<=d1(9); d1(11)<=d1(10); d1(12)<=d1(11) xor (din xor d1(15); d1(13)<=d1(12); d1(14)<=d1(13); d1(15)<=d1(14);else d1(0)<='0' d1(1)<=d1(0); d1(2)<=d1(1); d1(3)<=d1(2); d1(4)&

25、lt;=d1(3); d1(5)<=d1(4); d1(6)<=d1(5); d1(7)<=d1(6); d1(8)<=d1(7); d1(9)<=d1(8); d1(10)<=d1(9); d1(11)<=d1(10); d1(12)<=d1(11); d1(13)<=d1(12); d1(14)<=d1(13); d1(15)<=d1(14); end if; end if;end process;process(clk,reset)begin if reset='0' then dout<='

26、0' elsif clk'event and clk='1' then if din_dv='1' then dout<=din; else dout<=d1(15); end if; end if;end process;end behavioral;(3)crclibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc is port( clk:in std_logi

27、c; rst:in std_logic; din:in std_logic; data:out std_logic; error:out std_logic );end crc;architecture behavioral of crc issignal d1,d2 :std_logic_vector(15 downto 0):=(others=>'0');signal din_dv,cnt1_en,dout1_dv:std_logic;signal cnt1,cnt2:std_logic_vector(6 downto 0):=(others=>'0&#

28、39;);signal dout1:std_logic;signal cnt3:std_logic_vector(6 downto 0);signal cnt2_en,flag,dout2:std_logic;beginprocess(clk,rst)begin if rst='0' then dout1_dv<='0' din_dv<='0'elsif clk'event and clk='1' then if cnt2<="1001111" then dout1_dv<=&#

29、39;1' cnt2<=cnt2+'1' if cnt1<="0111111" then din_dv<='1' cnt1<=cnt1+'1' else din_dv<='0' end if;else dout1_dv<='0'end if;end if;end process;process(clk,rst)begin if rst='0' then dout1<='0'elsif clk'event a

30、nd clk='1' then if dout1_dv='1' then if din_dv='1' then dout1<=din; d1(0)<=din xor d1(15); d1(1)<=d1(0); d1(2)<=d1(1); d1(3)<=d1(2); d1(4)<=d1(3); d1(5)<=d1(4) xor (din xor d1(15); d1(6)<=d1(5); d1(7)<=d1(6); d1(8)<=d1(7); d1(9)<=d1(8); d1(10)

31、<=d1(9); d1(11)<=d1(10); d1(12)<=d1(11) xor (din xor d1(15); d1(13)<=d1(12); d1(14)<=d1(13); d1(15)<=d1(14); elsif din_dv<='0' then dout1<=d1(15); d1(0)<='0' d1(1)<=d1(0); d1(2)<=d1(1); d1(3)<=d1(2); d1(4)<=d1(3); d1(5)<=d1(4); d1(6)<=d1(5

32、); d1(7)<=d1(6); d1(8)<=d1(7); d1(9)<=d1(8); d1(10)<=d1(9); d1(11)<=d1(10); d1(12)<=d1(11); d1(13)<=d1(12); d1(14)<=d1(13); d1(15)<=d1(14);end if;end if;end if;end process;process(clk,rst)beginif rst='0' then dout1<='0'elsif clk'event and clk='1&

33、#39; then if dout1_dv'event and dout1_dv='0' then dout1<='1'end if;end if;end process;flag<=dout1;process(clk,rst)begin if rst='0' then flag<='1'cnt3<=(others=>'0');elsif clk'event and clk='1' then if cnt3<"1010000"

34、then cnt3<=cnt3+'1'end if;end if;end process;process(clk,rst)begin if rst='0' then data<='0' elsif clk'event and clk='1' then if cnt3<="1010000" then d2(0)<=dout1 xor d2(15); d2(1)<=d2(0); d2(2)<=d2(1); d2(3)<=d2(2); d2(4)<=d2(3);

35、 d2(5)<=d2(4) xor (dout1 xor d2(15); d2(6)<=d2(5); d2(7)<=d2(6); d2(8)<=d2(7); d2(9)<=d2(8); d2(10)<=d2(9); d2(11)<=d2(10); d2(12)<=d2(11) xor (dout1 xor d2(15); d2(13)<=d2(12); d2(14)<=d2(13); d2(15)<=d2(14); if cnt2<="1000000" then data<=dout2; end

36、if; end if; end if;end process;process(clk,rst)begin if rst='0' then error<='1' elsif clk'event and clk='1' then if cnt3="1000000" then error<=d2(0) and d2(1) and d2(2) and d2(3) and d2(4) and d2(5) and d2(6) and d2(7) and d2(8) and d2(9) and d2(10) and d2

37、(11) and d2(12) and d2(13) and d2(14) and d2(15);end if;end if;end process;end behavioral;(4)framelibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity frame isport(clk,reset:in std_logic; din,din_dv:in std_logic; dout:out std_logic);end frame;a

38、rchitecture behavior of frame issignal a,cnt_en :std_logic;signal cnt:integer;begincnt_en_pro:process(clk,reset)begin if reset='0' then cnt_en<='0' elsif clk'event and clk='1' then if cnt=80 then cnt_en<=0; elsif din_dv='1' then cnt_en<='1' end if

39、; end if;end process;cnt_pro:process(clk,reset)begin if reset='0' then cnt<=0; elsif clk'event and clk='1' then if cnt=80 then cnt<=0; elsif cnt_en='1' then cnt<=cnt=1; end if; end if;end process;dout_pro:process(clk,reset)begin if reset='1' then dout<

40、='0'elsif ( clk'event and clk ='1' ) thendind <= din ;if ( din_dv='1' and cnt_en='0' ) thendout <='0'elsif ( cnt_en = '1' and cnt =80 ) thendout <='1'elsif ( cnt_en = '1' and cnt >= 0 and cnt <80 ) thendout <= dind

41、 ;end if; end if;end process;end behavior;(5)receivelibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc_frame_receive is port( clk:in std_logic; reset:in std_logic; din:in std_logic; dout_dv:out std_logic; dout:out std_logic );end crc_fram

42、e_receive;architecture behavioral of crc_frame_receive issignal cnt:std_logic_vector(6 downto 0);signal data_dv:std_logic;beginprocess(clk,reset)begin if reset='0' then data_dv<='0' elsif clk'event and clk='1' then if din='0' and cnt<"1001111" then

43、 data_dv<='1' elsif cnt="1001111" then data_dv<='0' end if; end if;end process;process(clk,reset)begin if reset='0' then cnt<=(others=>'0'); elsif clk'event and clk='1' then if data_dv='1' then cnt<=cnt+1;end if;end if;end

44、process;process(clk,reset)begin if reset='0' then dout_dv<='0' dout<='0' elsif clk'event and clk='1' then if data_dv='1' then dout_dv<='1' dout<=din; elsif data_dv='0' and din='1' then dout_dv<='0' dout<=&#

45、39;0' end if; end if;end process;end behavioral;(6)checklibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc_check is port( clk:in std_logic; reset:in std_logic; din:in std_logic; din_dv:in std_logic; error:out std_logic );end crc_check

46、;architecture behavioral of crc_check issignal cnt:std_logic_vector(6 downto 0);signal cnt_en,din1:std_logic;signal d1:std_logic_vector(15 downto 0);beginprocess(clk,reset)begin if reset='0' then cnt_en<='0' elsif clk'event and clk='1' then if cnt="1001111" t

47、hen cnt_en<='0' elsif din_dv='1' then cnt_en<='1'end if; end if;end process;process(clk,reset)begin if reset='0' then cnt<="0000000" elsif clk'event and clk='1' then if cnt_en='1' then cnt<=cnt+'1' end if; end if;end p

48、rocess;process(clk,reset)begin if reset='0' then d1<=(others=>'0'); elsif clk'event and clk='1' then if din_dv='1' then d1(0)<=din xor d1(15); d1(1)<=d1(0); d1(2)<=d1(1); d1(3)<=d1(2); d1(4)<=d1(3); d1(5)<=d1(4) xor (din xor d1(15); d1(6)<=d1(5); d1(7)<=d1(6); d1(8)<=d1(7); d1(9)<=d1(8); d1(10)<=d1(9); d1(11)<=d1(10); d1(12)<=d1(11) xor (din xor d1(15); d1(13)<=d1(12); d1(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论