循环冗余CRC模块设计说明Word文件下载.docx
- 文档编号:14685460
- 上传时间:2022-10-23
- 格式:DOCX
- 页数:9
- 大小:295.71KB
循环冗余CRC模块设计说明Word文件下载.docx
《循环冗余CRC模块设计说明Word文件下载.docx》由会员分享,可在线阅读,更多相关《循环冗余CRC模块设计说明Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
本设计完成12位信息加5位CRC校验码发送、接收,由两个模块构成,CRC校验生成模块(发送)和CRC校验检错模块(接收),采用输入、输出都为并行的CRC校验生成方式。
图10-1的CRC模块端口数据说明如下:
图10-1CRC模块sdata:
12位的待发送信息datald:
sdata的装载信号datacrc:
附加上5位CRC校验码的17位CRC码,在生成模块被发送,在接收模块被接收。
clk:
时钟信号rdata:
接收模块(检错模块)接收的12位有效信息数据hsend、hrecv:
生成、检错模块的握手信号,协调相互之间关系error:
误码警告信号datafini:
数据接收校验完成采用的CRC生成多项式为X5+X4+X2+1,校验码为5位,有效信息数据为12位。
2、实验步骤:
(1)编译以上示例文件,给出仿真波形。
(2)建立一个新的设计,调入crcm模块,把其中的CRC校验生成模块和CRC校验查错模块连接在一起,协调工作。
引出必要的观察信号,锁定引脚,并在EDA实验系统上的FPGA目标器件中实现。
三、实验HDL描述:
modulesender(clk,sdata,datald,datacrc,hsend);
input11:
0sdata;
inputclk,datald;
output16:
0datacrc;
outputhsend;
parameterD=6b110101;
reg16:
parameters0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8,s9=9;
reghsend;
reg3:
0cs;
reg11:
0data;
always(posedgeclk)if(datald)cs=s0;
elsecase(cs)s0:
begincs=s1;
data=sdata;
datacrc16:
5=sdata;
hsend=0;
ends1:
begincs=s2;
if(data11=1)data=dataD;
data=data1;
ends2:
begincs=s3;
ends3:
begincs=s4;
ends4:
begincs=s5;
ends5:
begincs=s6;
ends6:
begincs=s7;
ends7:
begincs=s8;
ends8:
begincs=s9;
hsend=1;
datacrc=datacrc16:
5,data11:
7;
ends9:
beginhsend=0;
endendcaseendmodulemodulereceive(clk,rdata,datafini,datacrc,hrecv,error);
input16:
inputclk,hrecv;
output11:
0rdata;
outputdatafini,error;
parameters0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8;
regdatafini,error;
reg11:
always(posedgeclk)if(hrecv)cs=s0;
data=datacrc16:
5;
rdata11:
0=datacrc16:
error=0;
datafini=0;
beginif(data11:
7=datacrc4:
0)error=0;
elseerror=1;
datafini=1;
endendcaseendmodule电路原理图的顶层设计四、仿真结果:
仿真时序图运行流程:
datald为0时,生成、接收模块最终保持在s9、s8状态;
当datald在一个时钟上升沿为1时,生成模块从s0运行至保持s9;
其中生成模块s8状态的操作使联络信号置1,接收模块也将因此从s0运行至保持s9。
上图初始时运行流程为:
第1个时钟上升沿,datald信号置1,生成模块状态置为s0;
此时接收模块状态为s0,执行状态操作(rdata取得数据为0,中间变量data取得数据为sdata);
第2个时钟上升沿,生成模块处理状态s0时事件,此时数据输出口高12位为原始数据sdata;
接收端在2-8时钟上升沿(s1-s7)生成校验码;
第3-9个时钟上升沿,生成模块状态为s1-s7,生成校验码;
第9个时钟上升沿,接收模块状态为s8,提取接收的校验码,与自身生成的校验码比较,若不同则error为1,最后校验完成信号datafini置1,接收端停留在此状态,直至接收联络信号为1,回到s0状态;
第10个时钟上升沿,生成模块状态为s8,将校验码并位至输出口低5位,并将联络信号置1;
时钟上升沿时联络信号为0,接收模块保持状态s8,并执行相应操作;
第11个时钟上升沿,生成模块状态为s9,将联络信号置0,无datald高电平将保持此状态;
时钟上升沿时联络信号为1,接收模块状态置为s0;
第12个时钟上升沿,接收模块状态为s0,执行操作为:
rdata和中间变量data均取得带校验码的17位数据的高12位,即sdata,并清除datafini和error信号;
第13-20个时钟上升沿,接收模块事件情况同第2-9个时钟上升沿;
第21个时钟上升沿及之后,由于联络信号始终为0,接收模块保持状态s8。
五、引脚锁定:
六、硬件测试结果:
下载程序到目标机图1图2图3注:
采用模式1。
由键4-键2设置待发送的数据并由数码管4-数码管2显示;
数码管7-数码管5显示接收到的数据;
LED-D8为error信号;
LED-D7为datafini信号;
键7控制datald信号,由硬件测试可以清晰的看到,当datald信号经过一次高低电平切换后,在数码管7-数码管5显示出接收到的数据和输入的数据一致。
七、实验心得:
通过本次实验使我明白了循环冗余(CRC)校验实现的原理,同时也掌握了其VerilogHDL代码编写及原理图设计的方法。
八、思考题:
1.如果输入数据、输出CRC码都是串行的,设计该如何实现(提示:
采用LFSR)。
答:
通过线性反馈移位寄存器(LFSR)实现。
通过CRC的生成原理知道CRC的检验码生成是通过除法得到,由此联想到可以通过LFSR来产生校验码。
假设原信息码子多项式为生成多项式为那么CRC的码字为,使用用LFSR电路来进行实现,将M(x)向左移r位在电路中的意义即为输入完信息码后再输入r个0,所以在电路上的表现就如图所示。
将这个时刻产生的寄存器输入添加到原信息码的后边就进行完了CRC编码,同样接收端可以使用LFSR来进行CRC检验。
2.在程序中需要8个时钟周期才能完成一次CRC校验,试重新设计使得在一个clk周期内完成。
将含状态机的两个大模块分解为多个串并联的小模块,每个模块处理时间为1个时钟周期,形成流水线结构。
说明:
各学院(实验中心)可根据实验课程的具体需要和要求自行设计和确定实验报告的内容要求和栏目,但表头格式按照“实验项目名称”栏以上部分统一。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 冗余 CRC 模块 设计 说明