FPGA实验报告要点Word格式文档下载.docx
- 文档编号:3174176
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:18
- 大小:198.81KB
FPGA实验报告要点Word格式文档下载.docx
《FPGA实验报告要点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《FPGA实验报告要点Word格式文档下载.docx(18页珍藏版)》请在冰点文库上搜索。
3)由于实验板上按键需要进行消抖,所以需要一个消抖模块(debounce_module),待计数的时钟clk输入至计数器前,先通过消抖模块。
1)十进制计数器模块(cnt10.v)实验原理
输入:
CLK-------待计数的时钟
CLR---------异步清零信号,当CLR=1,输出复位为0,当CLR=0,正常计数
ENA---------使能控制信号,当ENA=1,电路正常累加计数,否则电路不工作
输出:
SUM[3:
0]----------计数值的个位。
即,在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。
COUT------------计数值的十位进位,即:
只有在时钟CLK上升沿检测到SUM=9时,COUT将被置1,其余情况下COUT=0。
2)数码管显示驱动模块(led.v)实验原理
输入:
sum[3:
0]-------待显示的数值。
out[6:
0]----------驱动数码管的七位数值(注意下表中out的对应位)。
表2-1共阳极数码管驱动模块输入与输出关系表
注:
这是一个组合逻辑电路,可以考虑用always,或者assign语句设计。
3)消抖模块设计原理
(1)按键抖动产生的原因:
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
图2.3按键抖动波形图
(2)消抖模块原理框图简介
图2.4消抖模块框图
电平检查模块:
检测输入的按键是否被按下或者释放,并分别将H2L_Sig,L2H_Sig拉高,
并随后拉低,给出按键的操作信息。
延时模块:
对输入的信号变化时刻进行计时并观察信号的变换情况,对输出端口进行恰
当地赋值。
二、实验步骤
(1)新建一个工程,为工程命名、指定存储路径和目标芯片等。
(在E盘或者DATA盘的根目录下,以自己的学号为文件名建立工程)。
建议工程名、路径名中不要使用中文,file->
NewProject。
(2)选择Top-level的类型是HDL。
(3)做好器件、EDA工具的正确选择,才能使得正常完成锁定引脚、下载的操作。
本次实验中仍采用ISE自带的综合和仿真工具。
图2.5器件和EDA工具选择界面
(4)建立新VerilogHDL模块编辑窗口,分别按照十进制计数器(cnt10.v),数码管驱动模块(led.v)的目标要求进行设计,各模块在综合后,采用波形的方式编辑测试激励波形,对相关模块进行功能仿真,实现模块的验证、修正。
在编辑测试激励文件时,应考虑测试的完备性。
1)、十进制计数器(cnt10.v)程序代码如下:
modulecnt10(CLK,CLR,ENA,COUT,SUM);
inputCLK,CLR,ENA;
output[3:
0]SUM;
outputCOUT;
reg[3:
regCOU;
always@(posedgeCLKorposedgeCLR)begin
if(CLR)
SUM<
=4'
b0000;
elseif(ENA&
&
SUM==4'
d10)
SUM<
4'
=SUM+1'
b1;
end
COUT<
=1'
b0;
else
Endmodule
2)、数码管驱动模块(led.v)的程序代码:
moduleled(IN,OUT);
input[3:
0]IN;
output[6:
0]OUT;
reg[6:
always@(IN)
begin
case(IN)
b0000:
OUT<
=7'
b1000000;
b0001:
b1111001;
b0010:
b0100100;
b0011:
b0110000;
b0100:
b0011001;
b0101:
b0010010;
b0110:
b0000010;
b0111:
b1111000;
b1000:
b0000000;
b1001:
b0010000;
b1010:
b0001000;
b1011:
b0000011;
b1100:
b1000110;
b1101:
b0100001;
b1110:
b0000110;
b1111:
b0001110;
endcase
end
endmodule
(5)用VerilogHDL将cnt10.v和led.v组合为一个模块,完成综合、功能仿真,分形,修正设计。
1)、顶层模块程序代码(cnt10led.v):
`timescale1ns/1ps
modulecnt10led(CLK_50M,CLK,CLR,ENA,COUT,DATA_OUT);
inputCLK_50M,CLK,CLR,ENA;
output[6:
0]DATA_OUT;
wirePin_Out;
wire[3:
0]DATA_IN;
//regCOUT;
debounce_moduleu0(CLK_50M,CLR,CLK,Pin_Out);
cnt10u1(Pin_Out,CLR,ENA,COUT,DATA_IN);
ledu2(DATA_IN,DATA_OUT);
由于本次设计的时钟周期可以较长,系统对时序没有要求,可以省略个子模块的时序仿真。
(6)拷贝消抖模块代码:
debounce_module.v,delay_module.v,detect_module.v,组合完成消抖模块。
1)、detect_module.v程序代码如下:
moduledetect_module(CLK,RSTn,Pin_In,H2L_Sig,L2H_Sig);
inputCLK;
inputRSTn;
inputPin_In;
outputH2L_Sig;
outputL2H_Sig;
parameterT100US=16'
d1999;
reg[10:
0]Count1;
regisEn;
always@(posedgeCLKorposedgeRSTn)
if(RSTn)
Count1<
=11'
d0;
isEn<
=1'
elseif(Count1==T100US)
else
=Count1+1'
regH2L_F1;
regH2L_F2;
regL2H_F1;
regL2H_F2;
if(RSTn)
begin
H2L_F1<
H2L_F2<
L2H_F1<
L2H_F2<
else
=Pin_In;
=H2L_F1;
=L2H_F1;
assignH2L_Sig=isEn?
(H2L_F2&
!
H2L_F1):
1'
assignL2H_Sig=isEn?
(!
L2H_F2&
L2H_F1):
Endmodule;
2)、delay_module.v程序代码如下:
moduledelay_module(CLK,RSTn,H2L_Sig,L2H_Sig,Pin_Out);
inputH2L_Sig;
inputL2H_Sig;
outputPin_Out;
parameterT1MS=25'
d19_999;
reg[15:
regisCount;
regrPin_Out;
reg[1:
0]i;
=16'
elseif(isCount&
Count1==T1MS)
elseif(isCount)
elseif(!
isCount)
reg[3:
0]Count_MS;
Count_MS<
=4'
elseif(isCount&
=Count_MS+1'
Count_MS<
isCount<
rPin_Out<
i<
=2'
case(i)
2'
d0:
if(H2L_Sig)i<
d1;
elseif(L2H_Sig)i<
d2;
2'
d1:
if(Count_MS==4'
d10)beginisCount<
i<
elseisCount<
d2:
assignPin_Out=rPin_Out;
3)、组合模块(debounce_module.v)程序代码如下:
moduledebounce_module(CLK,RSTn,Pin_In,Pin_Out);
inputCLK;
wireH2L_Sig;
wireL2H_Sig;
detect_moduleU1
(
.CLK(CLK),
.RSTn(RSTn),
.Pin_In(Pin_In),//input-fromtop
.H2L_Sig(H2L_Sig),//output-toU2
.L2H_Sig(L2H_Sig)//output-toU2
);
delay_moduleU2
.RSTn(RSTn),
.H2L_Sig(H2L_Sig),//input-fromU1
.L2H_Sig(L2H_Sig),//input-fromU1
.Pin_Out(Pin_Out)//output-totop
(7)将消抖模块,十进制计数器模块(cnt10.v),数码管驱动模块(led.v)组合为一个系统。
(8)硬件测试平台设计。
3、实验结果及分析
(1)、完成十进制计数器(cnt10.v)程序代码的编写之后,保存文件,然后对此模块进行综合。
方法为在sources窗口选中待综合模块cnt10,在process窗口双击Synthesize-XST,综合完后可以双击Synthesize-XST下的ViewRTLSchematic,得到综合后的电路图为:
图1、模块(cnt10)的综合电路图
(2)、完成数码管驱动模块(led.v)程序代码的编写之后,然后对此模块进行综合。
由
(一)同理可得:
综合后的(led.v)模块电路图为:
图2、模块(led.v)的综合电路图
(3)、VerilogHDL将cnt10.v和led.v组合为一个模块(cnt10led.v)。
然后再同理进行综合此模块。
得到综合后的电路图为:
图3、模块(cnt10led.v)的综合电路图
(4)、将消抖模块,十进制计数器模块(cnt10.v),数码管驱动模块(led.v)组合为一个系统。
然后再对此整体综合模块进行综合,得到整体的综合电路图为:
图4、整体模块的综合电路图
(5)、分析整个过程正确之后,接下来进行引脚锁定,进行引脚锁定处理,加入用户约束文件(*.ucf)文件即可。
(6)双击ImplementDesign进行布局布线,生成下载文件,载入硬件电路中,即可看到数码管上显示0,按下按键,数字即加1。
整个设计过程正确。
4、实验思考题解答(实验指导书要求的思考题)
1、如何用两个或一个always实现十进制计数模块?
写出相应代码。
答:
程序代码如下:
1)、always@(posedgeCLKorposedgeCLR)
if(CLR)
begin
SUM=4'
ADD=1'
end
else
begin
if(ENA)
if(SUM==4'
b1001)
begin
SUM=4'
ADD=1'
end
else
begin
SUM=SUM+1'
else
begin
SUM=SUM;
ADD=ADD;
end
end
2)、两个always如下:
always@(CLR)
flag=1;
flag=0;
always@(posedgeCLK)
if(flag)
2、如何always,或assign实现数码管的驱动设计?
写出相应代码。
always@(data_in)
case(data_in)
4'
data_out<
=7'
b1111110;
b1101101;
b1111001;
b0110011;
b1011011;
b1011111;
b1110000;
b1111111;
b1111011;
b1110111;
b0011111;
b1001110;
b0111101;
b1001111;
default:
b1000111;
endcase
3、比较实验一与实验二的实验过程,说明原理图的输入法与HDL输入法的不同应用环境。
通过做实验一和实验二,通过比较可以得出:
实验一中应用的是原理图完成十进制计数器的显示,而原理图输入法比较直观,便于我们理解,但是在做的过程中,工作量相对较大,需要反复绘制八张原理图,所以原理图设计比较适合相对简单的电路,门电路较少的电路;
在实验二中是通过应用HDL语言描述,在设计过程中,可以按功能分成多个模块,按我们的需要进行调用,并且还有利于自顶向下的设计。
所以适用于较复杂的电路。
4、CHIPSCOPE调试和仿真有何区别?
CHIPSCOPE是一款调试阶段的调试工具(逻辑分析仪),它在工程里加入采集数据的内核,当程序下载到芯片里运行时,它可以采集要观察到的信号并在计算机上显示出来,与功能仿真不同,它只能检查局部,针对部分“出问题”的地方的检验,这个过程必须设计FPGA硬件。
五、体会
通过上一次实验的操作训练。
因而本次实验中对软件的操作就比较熟悉了,通过本次试验,虽然完成的功能和实验一类似,但是完成的过程却不一样,在本次实验中,操作最多的就是写代码了,用HDL语言来完成十进制计数器及显示的功能,感受最深的就是程序代码的书写,感觉跟以前学的C语言有一定的差别,C语言中是用函数构成的,而HDL语言是由module模块组成的,对各个模块按需调用。
针对第一次试验过程,本次实验过程较为简单了许多,虽然完成的是同一个功能,但是是分别从两个方面进行完成的,实验一中应用的是原理图完成十进制计数器的显示,需要绘制多个原理图,过程原理虽简单但操作比较繁琐,通过本次实验过后,用HDL语言来实现此功能,变得更加简单,所以学号HDL语言对我们来说是至关重要的,同时还有利于我们对FPGA这门课程的理解以及学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 实验 报告 要点