循环冗余CRC模块设计说明.docx
- 文档编号:28397213
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:10
- 大小:803.35KB
循环冗余CRC模块设计说明.docx
《循环冗余CRC模块设计说明.docx》由会员分享,可在线阅读,更多相关《循环冗余CRC模块设计说明.docx(10页珍藏版)》请在冰豆网上搜索。
循环冗余CRC模块设计说明
附表1:
大学学生实验报告
开课学院及实验室:
物理与电子工程学院-电子楼317室2016年5月26日
学院
物电
年级、专业、班
Jason.P
学号
实验课程名称
EDA技术实验
成绩
实验项目名称
循环冗余(CRC)模块设计
指导教师
一、实验目的:
设计一个在数字传输中常用的校验、纠错模块:
循环冗余校验CRC模块,学习使用FPGA器件完成数据传输中的差错控制。
二、实验容:
1、实验原理:
CRC即CyclicRedundancyCheck循环冗余校验,是一种数字通信中的信道编码技术。
经过CRC方式编码的串行发送序列码,可称为CRC码,共由两部分构成:
k位有效信息数据和r位CRC校验码。
其中r位CRC校验码是通过k位有效信息序列被一个事先选择的r+1位“生成多项式”相“除”后得到(r位余数即是CRC校验码),这里的除法是“模2运算”。
CRC校验码一般在有效信息发送时产生,拼接在有效信息后被发送;在接收端,CRC码用同样的生成多项式相除,除尽表示无误,弃掉r位CRC校验码,接收有效信息;反之,则表示传输出错,纠错或请求重发。
本设计完成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);
input[11:
0]sdata;
inputclk,datald;
output[16:
0]datacrc;
outputhsend;
parameterD=6'b110101;
reg[16:
0]datacrc;
parameters0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8,s9=9;
reghsend;
reg[3:
0]cs;
reg[11:
0]data;
always@(posedgeclk)
if(datald)cs<=s0;
else
case(cs)
s0:
begincs<=s1;data<=sdata;datacrc[16:
5]<=sdata;hsend<=0;end
s1:
begincs<=s2;
if(data[11]==1)data=data^D;
data=data<<1;
end
s2:
begincs<=s3;
if(data[11]==1)data=data^D;
data=data<<1;
end
s3:
begincs<=s4;
if(data[11]==1)data=data^D;
data=data<<1;
end
s4:
begincs<=s5;
if(data[11]==1)data=data^D;
data=data<<1;
end
s5:
begincs<=s6;
if(data[11]==1)data=data^D;
data=data<<1;
end
s6:
begincs<=s7;
if(data[11]==1)data=data^D;
data=data<<1;
end
s7:
begincs<=s8;
if(data[11]==1)data=data^D;
data=data<<1;
end
s8:
begin
cs<=s9;
hsend<=1;
datacrc={datacrc[16:
5],data[11:
7]};
end
s9:
begin
hsend<=0;
end
endcase
endmodule
modulereceive(clk,rdata,datafini,datacrc,hrecv,error);
input[16:
0]datacrc;
inputclk,hrecv;
output[11:
0]rdata;
outputdatafini,error;
parameterD=6'b110101;
parameters0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8;
regdatafini,error;
reg[11:
0]rdata;
reg[3:
0]cs;
reg[11:
0]data;
always@(posedgeclk)
if(hrecv)cs<=s0;
else
case(cs)
s0:
begincs<=s1;data<=datacrc[16:
5];rdata[11:
0]<=datacrc[16:
5];error<=0;
datafini<=0;end
s1:
begincs<=s2;
if(data[11]==1)data=data^D;
data=data<<1;
end
s2:
begincs<=s3;
if(data[11]==1)data=data^D;
data=data<<1;
end
s3:
begincs<=s4;
if(data[11]==1)data=data^D;
data=data<<1;
end
s4:
begincs<=s5;
if(data[11]==1)data=data^D;
data=data<<1;
end
s5:
begincs<=s6;
if(data[11]==1)data=data^D;
data=data<<1;
end
s6:
begincs<=s7;
if(data[11]==1)data=data^D;
data=data<<1;
end
s7:
begincs<=s8;
if(data[11]==1)data=data^D;
data=data<<1;
end
s8:
begin
if(data[11:
7]==datacrc[4:
0])error<=0;
elseerror<=1;
datafini<=1;
end
endcase
endmodule
电路原理图的顶层设计
四、仿真结果:
仿真时序图
运行流程:
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 模块 设计 说明