您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 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.电子秒表设计框图电子时钟stopwatch.v(主程序)counter10.v(计数器)Divider.v(分频器)SEG7_LUT.v(数码管显示)模块分析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/1nsmodulestopwatch_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));initialbeginCLK_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;endalways#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.模块化设计能减轻开发人员的难度,逻辑更清晰。
本文标题:FPGA电子秒表计时器verilog实验报告
链接地址:https://www.777doc.com/doc-5299231 .html