欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    CRC编码器的设计(共25页).doc

    • 资源ID:8562647       资源大小:712.50KB        全文页数:26页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    CRC编码器的设计(共25页).doc

    精选优质文档-倾情为你奉上目录CRC编码器的设计一、 设计目的:掌握CRC的编码原理及作用, 并进行设计。二、设计要求1、阐述CRC的编码原理及作用2、基于VHDL语言实现CRC的编码 3、写出详细的设计报告(不少于5000字)三、 CRC循环冗余校验简介循环冗余校验(CRC)是一种根据网络数据封包或电脑档案等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。而且CRC码是目前通信系统中最常用的一种差错控制编码,利用其进行检错的过程可简单描述为:在发送端根据要传送的二进制码序列,以一定的规则产生一个校验用的监督码,附在原始信息后边,构成一个新的二进制码序列数,然后发送出去。在接收端根据信息码和CRC 码之间所遵循的规则进行检验,一旦传输过程中发生差错,则信息码元与监督码元之间的关系遭到破坏,从而可以发现错误,乃至纠正错误。四、 CRC的编码原理循环冗余校验码(cyclic redundancy check,CRC)简称为循环码或CRC码。二进制信息沿一条信号线逐位在设备之间传送称为串行传送,CRC码常用于串行传送过程中的检错与纠错。CRC码由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码。其中任意一个二进制位码都可以和一个系数仅为0和1取值的多项式一一对应。例如:代码对应的多项式为,而多项式为对应的代码。由上可以看出,CRC 多项式是线性结构,可以非常容易地故意改变量据而维持 CRC 不变。所以尽管在错误检测中非常有用,CRC 并不能可靠地校验数据完整性。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)×。如图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位错。 Q6Q5Q4Q3Q2Q1Q0余数出错位正确1100010000无错误1100011001Q01100000010Q11100110100Q21101010011Q31110010110Q41000010111Q50100010101Q6表4.1 循环校验码的出错模式对于其验证码,它的编码规则是,如果CRC码共长个bit,信息码长个bit,就称为码:1、首先将原信息码( bit)左移位();2、运用一个生成多项式(也可看成二进制数)用模2除上面的式子,得到的余数就是利用生成多项式生成CRC校验码。而在构建一个新的 CRC 多项式或者改进现有的 CRC 时,一个通用的数学原则是使用满足所有模运算不可分解多项式约束条件的多项式。这种情况下的不可分解是指多项式除了与它自身之外不能被任何其它的多项式整除。如果 CRC 有多于一个的非零系数,那么 CRC 能够检查出输入消息中的所有单数据位错误。同时其也可以用于检测短于的输入消息中的所有双位错误,其中是多项式的最长的不可分解部分的长度。另外,如果多项式可以被整除,那么不存在可以被它整除的有奇数个非零系数的多项式。因此,它可以用来检测输入消息中的奇数个错误,就像奇偶校验函数那样。五、 CRC校验原理 (1)CRC码的检错方法 假设要进行校验的数据信息为一个位的二进制数据,将左移位后,用一个约定的生成多项式相除,将所得校验位拼接到的位数据后面,形成一个位的代码,称这个代码为循环冗余校验(CRC)码,也称()码。 图5.1 CRC码结构 (2)模2除法器模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。它是CRC校验中的一个十分重要的部分,用于得到校验码。图5.2 模2除法器示例如图所示,用10011来除0000,大致方法与二进制除法相同,但是相比之下,模2除法没有进位与借位,所以在相减的时候,则做异或运算。前面为0的可以直接省略,从第一位为1开始计数。(3)校验位的生成 假设:要传送的数据信息为:,即报文多项式为:约定的生成多项式为:则数据信息位数,生成多项式位数为4位,所以校验位位数。生成校验位时,用去除以,相除时采用“模2运算”的多项式除法。 利用“模2”多项式除法计算的过程。则有:校验位为111,CRC码为。说明:如果要校验CRC码,则可将CRC码用同一个多项式相除,若余数为0,则说明无错;若余数不为0,则说明有错。 图5.3 校验位生成示例(4)CRC码的纠错在接收方将收到的CRC码用约定的生成多项式去除,如果码字没有错误,则余数为0,若有一位出错,则余数不为0,而且不同的出错位置其余数不同。更换不同的码字,余数和出错位的关系不变。只和码制与生成多项式有关。 如果CRC码中有一位出错,用特定的作模2除,则会得到一个不为0的余数。若对余数补0后继续除下去,则会出现一个有趣的现象:各次余数将会按照一个特定的顺序循环。(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,其中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校验时序与发送端相同,区别只在于无需顺序移出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模块实现帧解析功能,它根据发送端发送的数据,检测到一个起始位零,即生成计数使能信号,生成数据有效信号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; error_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_logic; 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_logic; 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,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_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,din=>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: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 clk'event and clk='1' then if cnt="" 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<="" elsif clk'event and clk='1' then if cnt_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="" then dout_dv<='0' 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 (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)<=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<='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_logic; 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');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<="" then dout1_dv<='1' cnt2<=cnt2+'1' if cnt1<="" 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 and 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)<=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); 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' 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<"" 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<="" then d2(0)<=dout1 xor d2(15); d2(1)<=d2(0); d2(2)<=d2(1); d2(3)<=d2(2); d2(4)<=d2(3); 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<="" then data<=dout2; end 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="" 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(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;architecture 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; 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<='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 ;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_frame_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<"" then data_dv<='1' elsif cnt="" 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 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<='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;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)

    注意事项

    本文(CRC编码器的设计(共25页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开