CRC实验报告0616.docx
- 文档编号:7763838
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:30
- 大小:95.06KB
CRC实验报告0616.docx
《CRC实验报告0616.docx》由会员分享,可在线阅读,更多相关《CRC实验报告0616.docx(30页珍藏版)》请在冰豆网上搜索。
CRC实验报告0616
数电实验报告
题目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编码采用如图2所示的结构实现。
图二CRC编码实现结构
系统引入噪声的系统图如下
图三引入噪声仿真结构图
第三章FPGA模块程序设计与仿真
1、程序模块
见附录,此处不作累述。
2、程序仿真波形图
图四系统输入输出波形图
图五发送端CRC编码时序图
第四章结束语
1、收获
经过此次实验,掌握了CRC编码的相关知识,熟练的运用了VHDL语言编写程序。
2、改进意见
希望老师能具体讲解组帧与帧解析的相关知识。
附录:
1、系统程序
———-----—--————-—-——----————--—CRC系统程序———-——----——----——-——-----—---——---—--—
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE。
STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED。
ALL;
entitycrc16is
port(clk,rst,en:
instd_logic;
din:
instd_logic;
din_dv:
instd_logic;
error:
outstd_logic
);
endcrc16;
architectureBehavioralofcrc16is
componentcrc16_rx
port(
clk:
instd_logic;
rst:
instd_logic;
en:
instd_logic;
din:
instd_logic;
din_dv:
instd_logic;
dout:
outstd_logic;
dout_dv:
outstd_logic
);
endcomponent;
componentrs232frame
port(
clk:
instd_logic;
rst:
instd_logic;
en:
instd_logic;
din:
instd_logic;
din_dv:
instd_logic;
dout:
outstd_logic
);
endcomponent;
componentframe_receive
port(
clk:
instd_logic;
rst:
instd_logic;
en:
instd_logic;
din:
instd_logic;
dout:
outstd_logic;
dout_dv:
outstd_logic
);
endcomponent;
componentcrc16_tx
port(
clk:
instd_logic;
rst:
instd_logic;
en:
instd_logic;
din:
instd_logic;
din_dv:
instd_logic;
error:
outstd_logic
);
endcomponent;
signalcrc16_rx_dout,frame_out,frame_receive_dout:
std_logic;
signalcrc16_rx_dout_dv,frame_receive_dout_dv:
std_logic;
signalframe_receive_JY:
std_logic;
begin
P1:
crc16_rx
portmap(
clk=>clk,
rst=〉rst,
en=>en,
din=〉din,
din_dv=>din_dv,
dout=〉crc16_rx_dout,
dout_dv=>crc16_rx_dout_dv
);
P2:
rs232frame
portmap(
clk=>clk,
rst=〉rst,
en=>en,
din_dv=〉crc16_rx_dout_dv,
din=>crc16_rx_dout,
dout=〉frame_out
);
P3:
frame_receive
portmap(
clk=〉clk,
rst=〉rst,
en=>en,
din=〉frame_out,
dout=>frame_receive_dout,
dout_dv=>frame_receive_dout_dv
);
P4:
crc16_tx
portmap(
clk=〉clk,
rst=〉rst,
en=〉en,
din=〉frame_receive_dout,
din_dv=〉frame_receive_dout_dv,
error=>error
);
——process(clk,error_en)
—-begin
--if(clk'eventandclk=’1’)then
-—if(error_en=’1’)then
-—frame_receive_JY〈=frame_receive_doutxornoise;
--else
--frame_receive_JY<=frame_receive_dout;
—-endif;
--endif;
—-endprocess;
endBehavioral;
-—-—---—-—---———-——-—--—-—-—--—-—-———发送端编码CRC模块—-—--——-——--——--——-—-—----—
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH。
ALL;
useIEEE.STD_LOGIC_UNSIGNED。
ALL;
entitycrc16_rxis
port(clk:
instd_logic;
rst:
instd_logic;
en:
instd_logic;
din:
instd_logic;
din_dv:
instd_logic;
cnt_out:
outstd_logic_vector(6downto0);
clr_out:
outstd_logic;
dout:
outstd_logic;
dout_dv:
outstd_logic
);
endcrc16_rx;
architectureBehavioralofcrc16_rxis
signalcnt_en:
std_logic;
signalclr:
std_logic;
signald:
std_logic_vector(15downto0);
signalcnt:
std_logic_vector(6downto0);
begin
process(clk,rst)
begin
if(rst=’1')then
cnt<=”0000000";
elsif(clk'eventandclk='1')then
if(cnt_en='1’)then
if(cnt="1001111”)then--cnt=79
cnt<=”0000000";
else
cnt<=cnt+’1’;
endif;
endif;
endif;
cnt_out<=cnt;
endprocess;
process(clk,rst)
begin
if(rst='1’)then
cnt_en<='0';
elsif(clk’eventandclk=’1')then
if(din_dv=’1')then
cnt_en<='1';
elsif(cnt=”1001111")then
cnt_en〈='0’;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst=’1')then
clr<='0';
elsif(clk’eventandclk='1')then
if(en=’1’)then
if(cnt="1001101")then
clr<=’1’;
elsif(cnt="1001110")then
clr<=’0';
endif;
endif;
endif;
clr_out〈=clr;
endprocess;
process(clk,rst)
begin
if(rst=’1')then
dout〈='0’;
elsif(clk’eventandclk=’1’)then
if(en='1')then
if(din_dv='1’)then
dout<=din;
else
dout<=d(15);
endif;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst='1’)then
dout_dv〈='0’;
elsif(clk’eventandclk=’1’)then
if(en='1’)then
if(din_dv=’1')then
dout_dv〈='1';
elsif(cnt="1001111")then
dout_dv〈='0’;
endif;
endif;
endif;
endprocess;
process(clk,rst,clr)
begin
if(rst=’1’orclr=’1’)then
d〈=”0000000000000000”;
elsif(clk'eventandclk=’1’)then
if(en=’1’)then
if(din_dv=’1')then
d(0)<=d(15)xordin;
d
(1)<=d(0);
d
(2)<=d
(1);
d(3)<=d
(2);
d(4)〈=d(3);
d(5)〈=d(15)xordinxord(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)xordinxord(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);
endif;
endif;
endif;
endprocess;
endBehavioral;
———————---——--—------—frame模块-—-—--—-----————---—-—--—----———-—----—--—--—-
libraryIEEE;
useIEEE。
STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH。
ALL;
useIEEE。
STD_LOGIC_UNSIGNED。
ALL;
entityrs232frameis
port(clk,rst,en:
instd_logic;
din:
instd_logic;
din_dv:
instd_logic;
dout:
outstd_logic
);
endrs232frame;
architectureBehavioralofrs232frameis
signalcnt:
std_logic_vector(6downto0);
signalcnt_en:
std_logic;
signaldin_r,din_dv_r:
std_logic;
begin
process(clk,rst)
begin
if(rst=’1’)then
din_r<=’0';
din_dv_r〈=’0’;
elsif(clk'eventandclk='1')then
if(en='1’)then
din_r<=din;
din_dv_r〈=din_dv;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst='1’)then
cnt_en<=’0’;
elsif(clk'eventandclk='1’)then
if(en=’1’)then
if(din_dv=’1’)then
cnt_en<=’1’;
elsif(cnt="1010000")then
cnt_en〈=’0';
endif;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst='1’)then
cnt〈="0000000";
elsif(clk'eventandclk=’1')then
if(en=’1')then
if(cnt_en='1')then
if(cnt=”1010000")then
cnt<="0000000";
else
cnt<=cnt+’1';
endif;
endif;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst='1')then
dout〈='1’;
elsif(clk'eventandclk='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’;
endif;
endif;
endif;
endprocess;
endBehavioral;
------—-——-————--—-----———帧解析模块—-—--—--—-—-——--—-——-————-—-—-----
libraryIEEE;
useIEEE。
STD_LOGIC_1164.ALL;
useIEEE。
STD_LOGIC_ARITH。
ALL;
useIEEE.STD_LOGIC_UNSIGNED。
ALL;
entityframe_receiveis
port(clk,rst,en:
instd_logic;
din:
instd_logic;
dout:
outstd_logic;
dout_dv:
outstd_logic
);
endframe_receive;
architectureBehavioralofframe_receiveis
signaldata_dv:
std_logic;
signalcnt:
std_logic_vector(6downto0);
begin
process(clk,rst)
begin
if(rst='1’)then
data_dv<='0’;
elsif(clk'eventandclk=’1’)then
if(en=’1’)then
if(cnt="1001111")then
data_dv<='0’;
elsif(din='0')then
data_dv〈=’1’;
endif;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst=’1’)then
cnt<=”0000000";
elsif(clk’eventandclk=’1')then
if(en=’1’)then
if(data_dv='1')then
if(cnt=”1001111”)then
cnt<=”0000000";
else
cnt〈=cnt+'1';
endif;
endif;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst='1')then
dout<=’0';
dout_dv〈='0’;
elsif(clk'eventandclk=’1’)then
dout〈=din;
dout_dv〈=data_dv;
endif;
endprocess;
endBehavioral;
---—-———-———--—-——————-—---—-—-—-——-CRC校验模块---——-—---——---—-—-———--—————---
libraryIEEE;
useIEEE。
STD_LOGIC_1164。
ALL;
useIEEE。
STD_LOGIC_ARITH。
ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycrc16_txis
port(clk,rst,en:
instd_logic;
din:
instd_logic;
din_dv:
instd_logic;
error:
outstd_logic
);
endcrc16_tx;
architectureBehavioralofcrc16_txis
signalcnt_en:
std_logic;
signalclr:
std_logic;
signald:
std_logic_vector(15downto0);
signalcnt:
std_logic_vector(6downto0);
begin
process(clk,rst)
begin
if(rst='1’)then
cnt<=”0000000”;
elsif(clk'eventandclk=’1’)then
if(cnt_en='1’)then
if(cnt="1010000”)then
cnt<=”0000000";
else
cnt〈=cnt+'1';
endif;
endif;
endif;
endprocess;
process(clk,rst)
begin
if(rst=’1’)then
cnt_en〈=’0’;
elsif(clk’eventandclk=’1')then
if(en='1’)then
if(din_dv=’1’)then
cnt_en<=’1’;
elsif(cnt="1010000")then
cnt_en〈='0';
endif;
endif;
endif;
e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CRC 实验 报告 0616