FPGA电子秒表计时器verilog实验报告.docx
- 文档编号:26195303
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:14
- 大小:359.16KB
FPGA电子秒表计时器verilog实验报告.docx
《FPGA电子秒表计时器verilog实验报告.docx》由会员分享,可在线阅读,更多相关《FPGA电子秒表计时器verilog实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
FPGA电子秒表计时器verilog实验报告
华中科技大学
《电子线路设计、测试与实验》实验报告
实验名称:
用EDA技术设计多功能数字钟
院(系):
电子信息与通信学院
专业班级:
姓名:
学号:
时间:
地点:
实验成绩:
指导教师:
2018年3月27日
一.
实验任务及要求
基本要求:
电子秒表
1)可计时的范围0.00s~99.99s(显示用七段数码管,显示小数点)。
2)能够暂停,能够在计时结束使用灯光或者声音报警提示。
提高要求:
PWM波产生器
1)可输出占空比按10%递进的PWM波(示波器测量查看)。
二.实验条件
实验板:
Nexys4DDR
实验软件:
ISE14.7,ModelSim
三.预习要求
1.NEXYS4DDR开发板说明。
2.有限状态机。
3.数码管扫描显示。
四.实验原理
1.电子秒表
设计框图
模块分析
1)分频模块(Divider.v)
将系统给定的100MHZ的频率通过分频模块变成100Hz的clk(用来计时)和4000Hz的clk_seg(用来扫描数码管)。
代码如下:
原理:
输入的100MHz的信号为CLK_100MHz,每当CLK_100MHz上升沿来时,Count_DIV计数加1,且每当Count_DIV=100M/(2*100)=0.5M时,CLK_Out取反一次并且Count_DIV<=0,这样会得到一个100Hz的信号。
当需要得到4000Hz的clk_seg时,在顶层模块中修改parameterOUT_Freq=4000;这样,每当Count_DIV=100M/(2*4000)=12500时,CLK_Out取反一次并且Count_DIV<=0,这样会得到一个4000Hz的信号。
在主程序中修改参数如下:
仿真时,为便于观察,在testbench中,将CLK_100MHz的周期设为2ns:
always#1CLK_100MHz<=~CLK_100MHz;
并修改参数如下,验证分频模块的正确性(图中数字16,8,1只表示频率的倍数关系,并非真正的频率)
其仿真图如下图:
从图中可以看出,CLK_100MHz的周期为2ns,clk_seg的周期为4ns,clk的周期为32ns,符合倍数关系,故分频模块的正确性得到验证。
2)七段数码管显示模块
运用4个七段数码管,前两个显示秒的十位和个位,后两个显示小数点后两位,因为要显示4个数码管,因此用4000Hz的频率扫描4个数码管,使每个数码管每隔1ms亮一次。
代码如下:
3)十进制计数器模块
因为每个数码管的计数规律都为:
0-1-2-3-4-5-6-7-8-9-0-1……,所以采用十进制计数器。
传入的参数stop表示暂停信号,若有暂停信号或没有使能,则保持计数不变。
代码如下:
4)主程序模块
代码如下:
代码分析:
Second0[3:
0]表示百分位的数字,Second0[7:
4]表示十分位的数字,Second1[3:
0]表示个位的数字,Second1[7:
4]表示十位的数字。
如果start为1,即计时开始,则开启数码管使能,数码管开始显示计数值,如果finish等于1,表示计时完成,则alarm=1;点亮报警灯。
接下来调用四个counter10模块,通过控制其使能信号实现正确计时,第一个(C1)的使能信号为start,也就是按下开启键便开始计时,第二个(C2)的使能信号为Second0[3:
0]==4’d9,也就是当百分位计时到了9,且下一个时钟的上升沿到来时,则十分位加1;第三个(C3)的使能信号为Second0==8’h99,也就是当小数点后计时到了99,且下一个时钟的上升沿到来时,则个位加1;第四个(C4)的使能信号为Second1[3:
0]==4’h9&&Second0==8’h99,也就是当小数点后计时到了99而且个位计数到了9,且下一个时钟的上升沿到来时,则十位加1;这样,就能确保计时的准确性。
TestBench
`timescale1ns/1ns
modulestopwatch_test;
regCLK_100MHz;
regrst;
regstart;
regstop;
regfinish;
wire[6:
0]HEX0;
wire[7:
0]scan;
wirealarm;
wiredot;
stopwatchuut(
.CLK_100MHz(CLK_100MHz),
.rst(rst),
.start(start),
.stop(stop),
.finish(finish),
.HEX0(HEX0),
.scan(scan),
.alarm(alarm),
.dot(dot)
);
initialbegin
CLK_100MHz=0;
rst=0;
start=0;
stop=0;
finish=0;
#5;rst=1;#5;rst=0;
start=1'b1;
#64;stop=1'b1;#64;stop=0;
#6400;finish=1'b1;
#700;
end
always#1CLK_100MHz<=~CLK_100MHz;
endmodule
仿真波形
1.暂停键
从图中可以看出,当stop=0即暂停键没有按下的时候,只要clk上升沿一到,Second0的数值就加一;当stop=1即暂停键按下的时候,即使clk上升沿到了,Second0也不变,也就是暂停计时了。
2.结束键
从图中可以看出,当finish=1也就是结束键按下的时候,警报灯亮起(alarm=1),同时计时停止。
3.进位
1)
这是从Second0[3:
0]向Second0[7:
4]进位,从图中可以看出,Second0=8`b0000_1001时,当下一个clk上升沿到来的时候,Second0变为8`b0001_0000,即实现了从0.09到0.10的进位。
2)
这是从Second0向Second1[3:
0]进位,从图中可以看出,Second0=8`b1001_1001时(也就是计时到了99),当下一个clk上升沿到来的时候,Second0变为8`b0000_0000,Second1[3:
0]由0变成了1,即实现了从0.99到1.00进位。
2.PWM波产生器
本实验的思路较简单,在一个固定的时间间距内,当Count_DIV的值从0计数到duty时,输出电平反转;计数到这个时间间距后,电平再反转,将Count_DIV置零,并将duty的值增加10%。
然后下一个循环开始,以此达到输出占空比按10%递进的PWM波的目的。
实验代码:
Testbench:
仿真波形:
从图中可以看出,输出波形的占空比以10%逐渐增加,可知代码正确。
五.调试过程及实验结果
1.电子秒表
引脚分配如下:
调试过程及结果
在调试过程中,我碰到了如下问题,并找到了相应的解决方案:
1.问题:
按下start按钮后,数码管没有显示。
解决方案:
检查代码后发现,原来是忘记开启数码管使能(EN_SEG=1),于是在原代码中加上后解决了这个问题。
2.问题:
实验中发现,本来只要一个小数点亮,但四个数码管的小数点都亮了起来。
解决方案:
在SEG7_LUT.v(数码管模块)中,扫描数码管时,将其他三个数码管的小数点的电平设为无效电平(dot=1),而需要显示小数点的那个数码管的dot=~EN_SEG_in,也就是当数码管使能(EN_SEG_in=1)时,小数点亮;不使能则不亮。
修改后的代码如下:
2.PWM波产生器
引脚分配如下:
调试过程及结果
调试步骤:
1.将开发板与示波器共地,并将开发板的G6引出与示波器的CH1相连,在示波器上观察波形,实现了预期结果。
六.实验的收获、体会与改进建议
在这次实验过程中,我掌握了verilog程序的模块化设计方法和数码管的扫描。
以下是我的一些感悟:
1.电子秒表实验中,通过使能信号的灵活运用从而达到控制计数的目的,可谓巧妙。
不仅代码简洁,由此设计出的电路也更简单和易于调试。
2.模块化设计能减轻开发人员的难度,逻辑更清晰。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 电子 秒表 计时器 verilog 实验 报告