CRC实验报告2011-06-16.doc_第1页
CRC实验报告2011-06-16.doc_第2页
CRC实验报告2011-06-16.doc_第3页
CRC实验报告2011-06-16.doc_第4页
CRC实验报告2011-06-16.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

数电实验报告题 目 CRC校验原理仿真实验 班 级 29001040班 姓 名 刘 奎 学 号 2903003015 时 间 2011年5月25日 地 点 英才实验学院创新实验室 指导教师 李尚泽 摘要 本实验利用循环校验码(CRC)校验原理通过对通信系统发射端的原始数据生成CRC校验位,并按照RS-232的传输协议组帧,在传输过程中加入随机的噪声,在接收端对RS-232传输帧格式进行解析,并完成CRC校验。整个过程在Modelsim上仿真实现。关键词 CRC校验 仿真 目录第一章 实验原理与任务2第二章 设计思路、方法及方案3第三章 FPGA模块程序设计与仿真3第四章 结束语4附 录 4第一章 实验任务与原理1、任务指标利用VHDL完成16比特CRC校验程序的设计,并能利用modelsim仿真得到电路的时序波形。2、实验要求在了解CRC校验原理的前提下,在发送端对原始数据生成CRC校验位,并按照RS-232的传输协议组帧,在接收端对RS-232传输帧格式进行解析,并完成CRC校验。整个过程在Modelsim上仿真实现。3、原理阐述循环校验码(CRC)是数据通信领域中常用的一种差错校验码,其特点是信息字段和校验字段的长度可以任意选定。生成CRC校验码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为0或1的多项式一一对应,例如1010111对应的多项式为。CRC码集选择的原则:若设码字长度为N,信息字段长度为K,校验字段长度为R,则N=K+R;对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x)使得:其中m(x)为K次信息多项式,r(x)为R-1次校验多项式,g(x)称为生成多项式。V(x)为发送的信息加码字多项式。发送方通过指定的g(x)产生CRC码字,接收方则通过g(x)来验证CRC码字,若传输码字多项式V(x)能除尽g(x),则传输正确。本实验使用CRC-CCITT标准进行仿真,其生成多项式为:CRC校验采用多项式除法实现,若V(x)能除尽g(x),则传输正确,否则错误。实现结构上,在发送端进行CRC-CCITT标准编码,在接收端将信源数据与编码字串行输入与发送端相同的CRC编码器,若编码字为全零,则无传输错误,否则,传输出错。接收端CRC校验时序与发送端相同,区别只在于无需顺序移出CRC编码字,只需判断是否为全零即可。引入的噪声来源为随机产生的比特序列,与帧解析的数据输出进行异或,其原理为dout与0异或仍为dout,dout与1异或为dout,因此噪声序列只需随机引入几个1即可实现传输错误的模拟。第二章 设计思路、方法及方案1、框图结构说明由上述原理分析,我们设计出如下框图的系统结构。图一 CRC校验系统结构CRC编码采用如Error! Reference source not found.所示的结构实现。图二 CRC编码实现结构系统引入噪声的系统图如下图三 引入噪声仿真结构图第三章 FPGA模块程序设计与仿真1、 程序模块见附录,此处不作累述。2、 程序仿真波形图 图四 系统输入输出波形图图五 发送端CRC编码时序图第四章 结束语1、 收获经过此次实验,掌握了CRC编码的相关知识,熟练的运用了VHDL语言编写程序。2、 改进意见希望老师能具体讲解组帧与帧解析的相关知识。附录:1、系统程序-CRC系统程序-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc16 is port(clk,rst,en:in std_logic; din:in std_logic; din_dv:in std_logic; error:out std_logic );end crc16;architecture Behavioral of crc16 iscomponent crc16_rx port( clk:in std_logic;rst:in std_logic;en:in std_logic;din:in std_logic;din_dv:in std_logic;dout:out std_logic;dout_dv:out std_logic);end component;component rs232frame port( clk:in std_logic;rst:in std_logic;en:in std_logic;din:in std_logic;din_dv:in std_logic;dout:out std_logic);end component;component frame_receive port( clk:in std_logic;rst:in std_logic;en:in std_logic;din:in std_logic;dout:out std_logic;dout_dv:out std_logic);end component;component crc16_tx port( clk:in std_logic;rst:in std_logic;en:in std_logic; din:in std_logic;din_dv:in std_logic;error:out std_logic );end component;signal crc16_rx_dout,frame_out,frame_receive_dout:std_logic;signal crc16_rx_dout_dv,frame_receive_dout_dv:std_logic;signal frame_receive_JY:std_logic;beginP1: crc16_rxport map( clk=clk,rst=rst,en=en,din=din,din_dv=din_dv,dout=crc16_rx_dout,dout_dv=crc16_rx_dout_dv);P2: rs232frameport map( clk=clk,rst=rst,en=en,din_dv=crc16_rx_dout_dv,din=crc16_rx_dout,dout=frame_out);P3: frame_receiveport map( clk=clk,rst=rst,en=en,din=frame_out,dout=frame_receive_dout,dout_dv=frame_receive_dout_dv);P4: crc16_txport map( clk=clk,rst=rst,en=en,din=frame_receive_dout,din_dv=frame_receive_dout_dv,error=error);-process(clk,error_en)-begin- if(clkevent and clk=1) then- if(error_en=1) then- frame_receive_JY=frame_receive_dout xor noise;- else- frame_receive_JY=frame_receive_dout;- end if;- end if;- end process;end Behavioral;-发送端编码CRC模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc16_rx is port(clk:in std_logic;rst:in std_logic;en:in std_logic;din:in std_logic;din_dv:in std_logic;cnt_out:out std_logic_vector(6 downto 0);clr_out:out std_logic;dout:out std_logic;dout_dv:out std_logic);end crc16_rx;architecture Behavioral of crc16_rx issignal cnt_en:std_logic;signal clr:std_logic;signal d:std_logic_vector(15 downto 0);signal cnt:std_logic_vector(6 downto 0); beginprocess(clk,rst) begin if(rst=1) then cnt=0000000; elsif(clkevent and clk=1) then if(cnt_en=1) then if(cnt=1001111) then -cnt=79 cnt=0000000; else cnt=cnt+1; end if; end if;end if;cnt_out=cnt;end process;process(clk,rst) begin if(rst=1) then cnt_en=0; elsif(clkevent and clk=1) then if(din_dv=1) then cnt_en=1; elsif(cnt=1001111) then cnt_en=0; end if; end if;end process;process(clk,rst) begin if(rst=1) then clr=0; elsif(clkevent and clk=1) then if(en=1) then if(cnt=1001101) then clr=1; elsif(cnt=1001110) then clr=0; end if; end if;end if;clr_out=clr;end process;process(clk,rst) begin if(rst=1) then dout=0; elsif(clkevent and clk=1) then if(en=1) then if(din_dv=1) then dout=din;else dout=d(15);end if; end if; end if;end process;process(clk,rst) begin if(rst=1) then dout_dv=0; elsif(clkevent and clk=1) then if(en=1) then if(din_dv=1) then dout_dv=1;elsif(cnt=1001111) then dout_dv=0;end if; end if;end if;end process;process(clk,rst,clr) begin if(rst=1 or clr=1) then d=0000000000000000; elsif(clkevent and clk=1) then if(en=1) then if(din_dv=1) then d(0)=d(15) xor din; d(1)=d(0); d(2)=d(1); d(3)=d(2); d(4)=d(3); d(5)=d(15) xor din xor d(4); d(6)=d(5); d(7)=d(6); d(8)=d(7); d(9)=d(8); d(10)=d(9); d(11)=d(10); d(12)=d(15) xor din xor d(11); d(13)=d(12); d(14)=d(13); d(15)=d(14); else d(0)=d(15); d(1)=d(0); d(2)=d(1); d(3)=d(2); d(4)=d(3); d(5)=d(4); d(6)=d(5); d(7)=d(6); d(8)=d(7); d(9)=d(8); d(10)=d(9); d(11)=d(10); d(12)=d(11); d(13)=d(12); d(14)=d(13); d(15)=d(14); end if; end if; end if;end process; end Behavioral;-frame模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity rs232frame is port(clk,rst,en:in std_logic; din:in std_logic;din_dv:in std_logic;dout:out std_logic);end rs232frame;architecture Behavioral of rs232frame issignal cnt:std_logic_vector(6 downto 0); signal cnt_en:std_logic; signal din_r,din_dv_r:std_logic;beginprocess(clk,rst) begin if(rst=1) then din_r=0;din_dv_r=0; elsif(clkevent and clk=1) then if(en=1) then din_r=din;din_dv_r=din_dv; end if; end if;end process;process(clk,rst) begin if(rst=1) then cnt_en=0; elsif(clkevent and clk=1) then if(en=1) then if(din_dv=1) then cnt_en=1;elsif(cnt=1010000) then cnt_en=0;end if;end if; end if;end process;process(clk,rst) begin if(rst=1) then cnt=0000000; elsif(clkevent and clk=1) then if(en=1) then if(cnt_en=1) then if(cnt=1010000) then cnt=0000000; else cnt=cnt+1; end if;end if; end if;end if;end process;process(clk,rst) begin if(rst=1) then dout=1; elsif(clkevent and clk=1) then if(en=1) then if(din_dv_r=1) then dout=din_r;elsif(din_dv=1) then dout=0;else dout=1;end if;end if; end if;end process;end Behavioral;-帧解析模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity frame_receive is port(clk,rst,en:in std_logic; din:in std_logic;dout:out std_logic;dout_dv:out std_logic);end frame_receive;architecture Behavioral of frame_receive issignal data_dv : std_logic; signal cnt:std_logic_vector(6 downto 0);beginprocess(clk,rst) begin if(rst=1) then data_dv=0; elsif(clkevent and clk=1) then if(en=1) then if(cnt=1001111) then data_dv=0;elsif(din=0) then data_dv=1;end if; end if;end if;end process;process(clk,rst) begin if(rst=1) then cnt=0000000; elsif(clkevent and clk=1) then if(en=1) then if(data_dv=1) then if(cnt=1001111) then cnt=0000000; else cnt=cnt+1; end if;end if; end if;end if;end process;process(clk,rst) begin if(rst=1) then dout=0;dout_dv=0; elsif(clkevent and clk=1) then dout=din;dout_dv=data_dv; end if;end process;end Behavioral;-CRC校验模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity crc16_tx is port(clk,rst,en:in std_logic; din:in std_logic; din_dv:in std_logic; error:out std_logic );end crc16_tx;architecture Behavioral of crc16_tx issignal cnt_en:std_logic; signal clr:std_logic; signal d:std_logic_vector(15 downto 0); signal cnt:std_logic_vector(6 downto 0);beginprocess(clk,rst) begin if(rst=1) then cnt=0000000; elsif(clkevent and clk=1) then if(cnt_en=1) then if(cnt=1010000) then cnt=0000000;else cnt=cnt+1;end if; end if;end if;end process;process(clk,rst) begin if(rst=1) then cnt_en=0; elsif(clkevent and clk=1) then if(en=1) then if(din_dv=1) then cnt_en=1;elsif(cnt=1010000) then cnt_en=0;end if; end if;end if;end process;process(clk,rst) begin if(rst=1) then clr=0; elsif(clkevent and clk=1) then if(en=1) then if(cnt=1001111) then clr=1;elsif(cnt=1010000) then clr=0;end if; end if;end if;end process;process(clk,rst) begin if(rst=1) then error=0; elsif(clkevent and clk=1) then if(en=1) then if(cnt=1001111) then if(d=0000000000000000) then error=0; else error=1; end if;elsif(cnt=1010000) then error=0;end if;end if; end if;end process;process(clk,rst,clr) begin if(rst=1 or clr=1) then d=0000000000000000; elsif(clkevent and clk=1) then if(en=1) then if(din_dv=1) thend(0)=d(15) xor din; d(1)=d(0); d(2)=d(1); d(3)=d(2); d(4)=d(3); d(5)=d(15) xor din xor d(4); d(6)=d(5); d(7)=d(6); d(8)=d(7); d(9)=d(8); d(10)=d(9); d(11)=d(10); d(12)=d(15) xor din xor d(11); d(13)=d(12); d(14)=d(13); d(15)=d(14); else d(0)=d(15); d(1)=d(0); d(2)=d(1); d(3)=d(2); d(4)=d(3); d(5)=d(4); d(6)=d(5); d(7)=d(6); d(8)=d(7); d(9)=d(8); d(10)=d(9); d(11)=d(10); d(12)=d(11); d(13)=d(12); d(14)=d(13); d(15) clk, rst = rst, en = en, din = din, din_dv = din_dv, error = error ); - Clock process definitions clk_process :process beginclk = 0;wait for clk_period/2;clk = 1;wait for clk_period/2; end process; - Stimulus process stim_proc: process begin - hold reset state for 100 ns. rst=1;error=0;wait for 10 ns; rst=0;en=1;din=1;din_dv=1;

温馨提示

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

评论

0/150

提交评论