1、FPGA电子秒表计时器verilog实验报告华中科技大学电子线路设计、测试与实验实验报告实验名称:用EDA技术设计多功能数字钟院(系):电子信息与通信学院专业班级:姓名:学号:时间:地点:实验成绩:指导教师:2018 年 3 月 27 日一.实验任务及要求基本要求:电子秒表1)可计时的范围0.00s99.99s(显示用七段数码管,显示小数点)。2)能够暂停,能够在计时结束使用灯光或者声音报警提示。提高要求: PWM波产生器1)可输出占空比按10%递进的PWM波(示波器测量查看)。二.实验条件实验板:Nexys4 DDR实验软件:ISE14.7,ModelSim三.预习要求1.NEXYS 4 D
2、DR开发板说明 。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时,在顶层模块中
3、修改parameter OUT_Freq=4000;这样,每当Count_DIV=100M/(2*4000)=12500时,CLK_Out取反一次并且Count_DIV =0,这样会得到一个4000Hz 的信号。 在主程序中修改参数如下:仿真时,为便于观察,在testbench中,将CLK_100MHz的周期设为2ns:always #1 CLK_100MHz = CLK_100MHz;并修改参数如下,验证分频模块的正确性(图中数字16,8,1只表示频率的倍数关系,并非真正的频率)其仿真图如下图: 从图中可以看出,CLK_100MHz的周期为2ns,clk_seg的周期为4ns,clk的周期为
4、32ns,符合倍数关系,故分频模块的正确性得到验证。2)七段数码管显示模块运用4个七段数码管,前两个显示秒的十位和个位,后两个显示小数点后两位,因为要显示4个数码管,因此用4000Hz的频率扫描4个数码管,使每个数码管每隔1ms亮一次。代码如下:3)十进制计数器模块因为每个数码管的计数规律都为:0-1-2-3-4-5-6-7-8-9-0-1,所以采用十进制计数器。传入的参数stop表示暂停信号,若有暂停信号或没有使能,则保持计数不变。代码如下:4)主程序模块代码如下:代码分析:Second03:0表示百分位的数字,Second07:4表示十分位的数字,Second13:0表示个位的数字,Sec
5、ond17:4表示十位的数字。如果start为1,即计时开始,则开启数码管使能,数码管开始显示计数值,如果finish等于1,表示计时完成,则alarm=1;点亮报警灯。 接下来调用四个counter10模块,通过控制其使能信号实现正确计时,第一个(C1)的使能信号为start,也就是按下开启键便开始计时,第二个(C2)的使能信号为Second03:0=4d9,也就是当百分位计时到了9,且下一个时钟的上升沿到来时,则十分位加1;第三个(C3)的使能信号为Second0=8h99,也就是当小数点后计时到了99,且下一个时钟的上升沿到来时,则个位加1;第四个(C4)的使能信号为Second13:0
6、=4h9 & Second0=8h99,也就是当小数点后计时到了99而且个位计数到了9,且下一个时钟的上升沿到来时,则十位加1;这样,就能确保计时的准确性。TestBenchtimescale 1ns / 1nsmodule stopwatch_test; reg CLK_100MHz; reg rst; reg start; reg stop; reg finish; wire 6:0 HEX0; wire 7:0 scan; wire alarm; wire dot; stopwatch uut ( .CLK_100MHz(CLK_100MHz), .rst(rst), .start(st
7、art), .stop(stop), .finish(finish), .HEX0(HEX0), .scan(scan), .alarm(alarm), .dot(dot) ); initial begin CLK_100MHz = 0; rst = 0; start = 0; stop = 0; finish = 0; #5;rst=1;#5;rst=0; start=1b1; #64;stop=1b1;#64;stop=0; #6400;finish=1b1; #700; end always #1 CLK_100MHz=CLK_100MHz;endmodule仿真波形1.暂停键从图中可以
8、看出,当stop=0即暂停键没有按下的时候,只要clk上升沿一到,Second0的数值就加一;当stop=1即暂停键按下的时候,即使clk上升沿到了,Second0也不变,也就是暂停计时了。2.结束键从图中可以看出,当finish=1也就是结束键按下的时候,警报灯亮起(alarm=1),同时计时停止。3.进位1)这是从Second03:0向Second07:4进位,从图中可以看出,Second0=8b0000_1001时,当下一个clk上升沿到来的时候,Second0变为8b0001_0000,即实现了从0.09到0.10的进位。2)这是从Second0向Second13:0进位,从图中可以看
9、出,Second0=8b1001_1001时(也就是计时到了99),当下一个clk上升沿到来的时候,Second0变为8b0000_0000, Second13:0由0变成了1,即实现了从0.99到1.00进位。2. PWM波产生器本实验的思路较简单,在一个固定的时间间距内,当Count_DIV的值从0计数到duty时,输出电平反转;计数到这个时间间距后,电平再反转,将Count_DIV置零,并将duty的值增加10%。然后下一个循环开始,以此达到输出占空比按10%递进的PWM波的目的。实验代码:Testbench:仿真波形:从图中可以看出,输出波形的占空比以10%逐渐增加,可知代码正确。 五
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.模块化设计能减轻开发人员的难度,逻辑更清晰。