版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程报告设计课题: CRC循环冗余校验码 姓 名: 陈舒凌,高冉 专 业: 电子信息工程 学 号: 1115108007 1115106012 日 期 2013 年 11月 20日2013年12月1 日 指导教师: 傅文渊老师 华侨大学信息科学与工程学院电子工程系CRC循环冗余校验码实验目的:设计一个在数字传输中常用的校验、纠错模块:循环冗余校验CRC模块,学习使用 FPGA器件完成数据传输中的差错控制实验内容: 采用的 CRC 生成多项式为 X5+X4+X2+1,校验码为 5 位,有效信息数据为 12位。 A、根据以上信息,编写硬件描述语言完成上述功能,给出仿真波形。 B、CRC 校验生成模
2、块和 CRC 校验查错模块连接在一起,协调工作。引出必要的观察信号,锁定引脚,并在EDA实验系统上实现之。 C、如果输入数据、输出 CRC码都是串行的,设计该如何实现?给出你的方案,并通过硬件验证。模2运算的原理模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。模2除法运算定义为:0÷10 1÷11多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根 据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多
3、位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义 的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷10111110110,列竖式计算: 1 1 1 0 1 0 1 11 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 引言 随着工业控制系统网络化的不断发展,建立可靠、稳定、高速的通信网络已成为
4、控制系统的必然要求。然而,在数字通信中可靠与快速往往是一对矛盾。若要求快速,则必然使得每个数据码元所占地时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误的可能性增加,传送信息的可靠性下降。若是要求可靠,则使得传送消息的速率变慢。其中差错检测和纠错控制是保证高可靠性的一种切实方法。在各种通信领域,多项式编码循环冗余码CRC简单且误判概率很低,被普遍应用。-实现方法 CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。 它的编码规则是: 1)、首先将原信息码(kbit)左移r位(k+r=n) 2)、运
5、用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码 生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为0和1取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。程序设计的原理 并行输入输出CRC校验生成模块:library IEEE;use ieee.numeric_std.all;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNE
6、D.ALL;entity crcversion2 isPort ( sdata : in STD_LOGIC_VECTOR (11 downto 0); -message bits clk : in STD_LOGIC;redundant : out STD_LOGIC_VECTOR (4 downto 0); -redundant bitsdataid:in std_logic;hsend:out std_logic;datacrco : out STD_LOGIC_VECTOR (16 downto 0);-message with redundant bitsend crcversion
7、2;architecture Behavioral of crcversion2 isbegin process(clk) variable v:std_logic_vector(16 downto 0); variable u:std_logic_vector(16 downto 0); variable i,j:integer:=0; variable w:std_logic_vector(16 downto 0);constant multicoef :STD_LOGIC_VECTOR (5 downto 0):="110101" -crc polynomialbeg
8、inif clk'event and clk='1' then if(dataid='1')thenw(16 downto 5):=sdata(11 downto 0);-v有m+(n-1)个位for j in 4 downto 0 loopw(j):='0' 第1段end loop;elsif(dataid='0') then w(16 downto 0):=(others=>'0');end if;v(16 downto 0):=w(16 downto 0);u(16 downto 11):=mu
9、lticoef(5 downto 0); 第2段u(10 downto 0):=(others=>'0');for i in 11 downto 0 loop -移位m次,为得到余数部分的n-1个位if(v(16)='1') thenv:=v xor u;else null;-什么也不做 第3段end if;v:= to_stdlogicvector(to_bitvector(v) sll 1);end loop;redundant<=v(16 downto 12); - redundant bitsdatacrco(16 downto 5)<
10、=w(16 downto 5); 第4段datacrco(4 downto 0)<=v(16 downto 12);hsend<='1'- total messageend if;end process;end Behavioral;思路 段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
11、的后5个位。这时也把我们的multicoeff扩展到17个位的u,把后11个位也都赋0。(这个后来想想下还是可以把v和u用12个位异或就好,只要移位够12次,那v剩下的前5位就是余数) 段3.根据模2除法,做异或时我们的被除项的第一位必须是1才能做。若v的第一个位是1,v和u异或再赋回给v由于()和的第一个位是,异或完的第一个位一定变成,然后再把移前一位,后面补0便可。否则便不异或,直接就移前一位。共要移位12次才能获得我们5个位的余数。因此我们使用12次循环的loop语句。在每一次上升沿到,做12次的异或移位,不异或也移位,就会移了个位。这里使用的移位方法是向左位移的语句sll,由于这个语句
12、只能是给bit类型用,而我们的v是一个vector,那先强制转换成bit再转换去vector。 当然这里可以用移位寄存器法来实现,v(17 downto 1):=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
13、时,信号sdata不能输入,不能进行运算,给输出datacrc0,redundant都赋值成零。并行输入输出的校验模块: library IEEE;use ieee.numeric_std.all;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc0version2 isPort ( rdata : out STD_LOGIC_VECTOR (11 downto 0); -message bits clk : in STD_LOGIC;datacr
14、ci : in STD_LOGIC_VECTOR (16 downto 0);datafini: out STD_LOGIC;hrecv: in std_logic;error: out bit); -message with redundant bitsend crc0version2;architecture Behavioral of crc0version2 isbegin process(clk)variable v:std_logic_vector(16 downto 0);variable u:std_logic_vector(16 downto 0);variable i:in
15、teger:=0; variable w:std_logic_vector(16 downto 0);constant multicoef :STD_LOGIC_VECTOR (5 downto 0):="110101"-crc polynomialbeginif clk'event and clk='1' then if(hrecv='1')thenw(16 downto 0):=datacrci(16 downto 0);-v有m+(n-1)个位第1段elsif(hrecv='0')thenw(16 downto
16、0):=(others=>'0');end if;v(16 downto 0):=w(16 downto 0);u(16 downto 11):=multicoef(5 downto 0); 第2段u(10 downto 0):=(others=>'0');for i in 16 downto 0 loop -移位1次,为得到看是否能被整除if(v(16)='1') thenv:=v xor u;else null; 第3段 end if;v:= to_stdlogicvector(to_bitvector(v) sll 1);end
17、 loop;if(v(16 downto 0)="00000000000000000" )then error<='0' rdata<=w(16 downto 5);datafini<='1'else error<='1' 第段rdata<=(others=>'0');datafini<='0'end if;end if;end process;end Behavioral; 思路 校验这模块基本上是在接收模块的基础上改过来而已。这时的输入是一 个17个
18、位的crc码,输出会是crc吗的前12个位,即是我们的原信息数据。所以只说段和段。段.在loop语句里,若第一位是,输入的17个位便和我们扩展成17位的multicoeff(110101)做异或,然后向左移位,否则便不做异或,直接向左移位。要是能整除,没有余数,都为。要是不能整除,就不会都是.段. 要是能整除,没有余数,v都为0,error便输出0,把原先还没参与模2除法的w的前12个位赋给输出rdata。要是不能整除,就不会都是,那error便输出1,把rdata都赋0。并行CRC校验检错模块仿真波形当hrecv=1时,接收输入信号datacrci进行除法运算,datacrci能被11010
19、1整除时,error为0。完成标志位datafini为1,输出信号rdata为原来要校验的信号;datacrci不能被110101整除时error为1,完成标志位0,输出信号rdata为0;并行总的电路并行总的电路的仿真波形输入标志位dataid为1,输入数据才能进行运算。时钟信号到来,开始进行运算,校验之后输出原来要校验的数据,输出余数,错误警报也为置为0使用了模式0串行输入输出的接收模块:library IEEE;use ieee.numeric_std.all;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEE
20、E.STD_LOGIC_UNSIGNED.ALL;entity crcseriesversion3 isPort ( sdata : in STD_LOGIC; -message bits datald: in std_logic;clk : in STD_LOGIC;redundant: out STD_LOGIC_VECTOR (4 downto 0); -redundant bitsdatacrco : out STD_LOGIC; -message with redundant bitshsend: out std_logic);end crcseriesversion3;archit
21、ecture Behavioral of crcseriesversion3 is begin process(clk) variable v:std_logic_vector(16 downto 0); variable d:std_logic_vector(16 downto 0); variable u:std_logic_vector(16 downto 0); variable q:std_logic_vector(16 downto 0); variable i,j:integer:=0; variable count:integer:=0; variable count2:int
22、eger:=0; variable t : STD_LOGIC_VECTOR (16 downto 0); variable c: std_logic:='1' variable y:std_logic_vector(16 downto 0); variable g :integer:=0; constant multicoef :STD_LOGIC_VECTOR (5 downto 0):="110101" -crc polynomialbeginif clk'event and clk='1' then if (count<
23、17 and datald='1') then count:=count+1;if(count<=12) then v(17-count):=( sdata);-v有m+(n-1)个位elsif (count>12) 第1段then v(17-count):='0'end if;end if;if(count=17) then y(16 downto 0):=v(16 downto 0);count:=0; 第2段g:=g+1;end if; u(16 downto 11):=multicoef(5 downto 0); u(10 downto 0)
24、:=(others=>'0'); 第3段 hsend<='0'if(c='1') thend(16 downto 0):=y(16 downto 0);q(16 downto 0):=d(16 downto 0);for i in 11 downto 0 loop -移位12次,为得到余数部分的5个位if(q(16)='1') thenq:=q xor u; 第4段else null;end if;q:= to_stdlogicvector(to_bitvector(q) sll 1);end loop;end if;
25、redundant<=q(16 downto 12); - redundant bitst(16 downto 5):=d(16 downto 5); 第5段t(4 downto 0):=q(16 downto 12); if(count2>=0 and count2<=16 and g>=1) then c:='0' count2:=count2+1;datacrco<=t(17-count2);hsend<='1'elsif (count2=17 ) 第6段then c:='1' count2:=0;hse
26、nd<='0'end if;- total messageend if;end process;end Behavioral;思路 主要程序运作方式是用clk来分解我们的串行输入,即串行输入sdata(接收的信息数据)每一位的长短由clk的长短来决定。当给程序输入完12个位后,要等待5个时钟,才会把17个位的crc码串行输出来。下一个也是一样(这里可参考其波形图来更加明白)。输入输出都是串行,但内部是并行运算。由内部所造成的延时时间大概是10ns。要是我们把clk弄大于10ns这个延时应该不会影响输出。下面每一段都表示一个顺序语句。下面所谓的串行输入和串行输出表示在每一次
27、时钟上升沿的到来时就输入或输出一位。sData v( 16)v( 4)v( 14)v( 13)v( 12)v( 11)v( 10)v( 9)v( 8)v( 15)v( 3)v( 2)v( 1)v( 0)Startclk 段1.使用count来把clk输入分n个小段的时间,每小段共有17个clk(上升沿),在每小段里的17个clk的每一个上升沿所对应的sdata分别输入给程序里的变量v。当count小于等于12时,v的前12个位都是被赋sdata的值,后5个位都置0,相当于,sdata在每小段的第13到17个clk都是无效的(相当于我们自己限制在那段时间不允许有输入),我们便称这时间为等待时间。
28、Datald是一个标志号,允许或不允许输入,若是0,便把v都置0。段2. 当count=17的时候,前12个位已经接收完sdata信息数据的v赋给y,count便置回0。y是用来寄存总共所接收的信息数据,在每一次的第17个clk才会有值。同时,g加1,g.是计算每次count计数了17个clk有多少次。段3.multicoeff扩展成17个位的u,u的值 永远不变。初始化hsend<=0。段4.如果c=1, 则y值赋给了q和d,然后对q值在loop语句做模2除法,在loop语句执行完12次后得余数(怀疑是这个loop语句要做12次才会造成一个10ns的延时),d保留一样的。C是标识号,来
29、表示在还没把17个位的crc码都串行输出完,都不做模2运算。即使在输出未做完(这时候c置0),有了一个新的y,但 这时c是 0,所以不会把y给q(q是参与模2除法的)也不进入loop语句,因此q不变,还是保留着上一个做了运算的值。 d(寄存着sdata信息数据)是用来赋给输出crc串行码的前12个位,也是确保要是有新的y值了,但由于还没输出完毕上一个crc码(c置0),新的y值不给d,d保留上一个的,不影响输出。 模2运算和并行的接收模块是一样的,因此这里不再说。段5 跳出loop语句后,便把已经模2运算q的前5位赋给并行输出的redundant。d 赋给t 的前12 个位,q赋给t的后5个位
30、。段6.这是输出部分,count2 是计算时钟来时串行输出了多少个位。 因此当count2>=0以及count2<=16,便将c先置0,然后将count2加1,过后从t的最高位开始每一次时钟上升沿来一次赋给输出datacrco一位。到了count2=16,count2加1后,变成17,输出t的最后一位。时钟再来一次时,这时候count2已经是17,便做c:='1' count2:=0(清零);hsend<='1'在这个的同时,count也等于17了,有了一个新的y值,这时c=1,便做运算,然后把结果再串行输出。基本上就是这样子:第1,2,3.n
31、个17个clkY 代表接收完的输入。T代表已经做了运算的结果NClk的次数 1 12 173 34 4 415 59 5 76Datacrco<=t1 C:=0Datacrco<=t2 C:0Datacrco<=t3 C:=0Datacrco<=t4 C:=0C:=1C:=1C:=1C:=1C:=1Y1Y2Y4Y3Y5Datacrco<=0 C:=0结论 开始时,本想要在串行模块中,在12个时钟周期后,接收完 一个12位的输入,然后再并行运算后立即得t1再串行输出17个位,接着又在t1的输出过程中,又接收完另一个12位的输入,等到已经将t1输出完后,才对已并行运算
32、而得的t2串行输出。但这样的话,到clk等于第59个时,便开始将t5串行输出,而在clk等于第60个时,又接收了另一个输入,我们称之为y6,而clk等到第72个时再又接收了下一个输入称y7,但始终还没将t5的17个位输出完,而y7将会覆盖未执行的y5了,等到clk等于第63个时,才开始输出t5.可见有一部分的串行信息数据不会被使用。因此,只好使接收也是17个时钟的时段,输出也是17个时钟的时段。这样的话可以避免覆盖并使它们有同步性,即输出完才有输入。串行输入输出的接收模块仿真波形串行输出输入的校验模块library IEEE;use ieee.numeric_std.all;use IEEE.
33、STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc0seriesversion3 isPort ( rdata : out STD_LOGIC; -message bits clk : in STD_LOGIC;datacrci : in STD_LOGIC;error: out bit;hrecv: in std_logic;datafini: out std_logic); -message with redundant bitsend crc0seriesve
34、rsion3;architecture Behavioral of crc0seriesversion3 isbegin process(clk)variable v:std_logic_vector(16 downto 0); variable u:std_logic_vector(16 downto 0); variable i:integer:=0; constant multicoef :STD_LOGIC_VECTOR (5 downto 0):="110101"-crc polynomial variable y:std_logic_vector(16 down
35、to 0); variable g :integer:=0; variable count:integer:=0; variable count2:integer:=0; variable q:std_logic_vector(16 downto 0); variable d:std_logic_vector(16 downto 0);beginif clk'event and clk='1' then if (count<17 and hrecv='1') then count:=count+1;v(17-count):=(datacrci);-
36、v有m+(n-1)个位end if;if(count=17) then y(16 downto 0):=v(16 downto 0);count:=0;g:=g+1;end if; u(16 downto 11):=multicoef(5 downto 0); u(10 downto 0):=(others=>'0'); datafini<='0'd(16 downto 0):=y(16 downto 0);q(16 downto 0):=d(16 downto 0); for i in 16 downto 0 loop -移位m次,为得到余数部分的
37、n-1个位if(q(16)='1') thenq:=q xor u;else null;end if;q:= to_stdlogicvector(to_bitvector(q) sll 1);if(q(16 downto 0)="00000000000000000 )then error<='0' if(count2>=0 and count2<=16 and g>=1) then c:='0' count2:=count2+1;if(count2>=1 and count2<=12) then rdata<=d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 患者观察和巡视管理制度
- 康复用品管理制度
- 2022年三年级语文下册第六单元主题阅读+答题技巧(含答案、解析)部编版
- 【假期阅读技能提升训练】小学语文三年级下册阅读技能提升内文阅读第5讲-附答案.部编版
- 2024年张家口办理客运从业资格证2024年试题
- 2024年巴中申请客运从业资格证考试题和答案
- 2024年武威道路客运输从业资格证理论考试答案
- 2024年天水道路旅客运输驾驶员从业资格考试试题及答案
- 历史-浙江省湖州、衢州、丽水2024年11月三地市高三教学质量检测试卷试题和答案
- 吉首大学《国际商务礼仪》2021-2022学年第一学期期末试卷
- 八年级物理上册 第四章 第五节《光的色散》说课稿 (新版)新人教版
- 新《劳动法》知识学习考试题库200题(含答案)
- 铭记历史 勿忘国耻九一八事变教育主题班会课件
- 中药蒲公英培训课件
- 2024-2030年中国帆船行业市场深度调研及发展趋势与投资前景研究报告
- 2021年新版《思想道德与法治》第六章课件-学习法治思想提升法治素养
- 2024年全国安康杯安全知识竞赛题库及答案(共239题)
- 2024年新《公司法》主要修订内容解读
- 走进摄影智慧树知到答案2024年海南软件职业技术学院
- 小学六年级数学方程应用题100道附答案(完整版)
- 2024云南黄金集团招聘高校毕业生72人(高频重点提升专题训练)共500题附带答案详解
评论
0/150
提交评论