基于FPGA的两种显示模式时钟@板子型号为DE-115
下图为个是板子的具体型号!
一、本次实验设计题目为基于FPGA的数字时钟,其功能为数字时钟显示和秒表计时两个功能,且显示模块可在两个功能间任意切换。
具体的功能描述如下:
MI数字时钟:
a:二十四小时制显示时间,且时间可手动输入调整;
b:具有整点报时功能,整点时LED闪亮,蜂鸣器响铃提示;
M2秒表计时器:
c:秒表最大可实现108.9秒的计时功能。(计时分为秒计时和十分之一秒计时,都可实现最大99的显示,即99秒+9.9秒=108.9秒);
d:M2可实现秒表清零功能,并且整体有一个单独复位键;
e:时钟与秒表功能独立工作,且可随意切换模式,秒表工作时时钟功能不受影响。
基于上述的所有功能,完成相关的编译和仿真,实现一款应用性较强的数字时钟。
二、设计电路
本次实验设计总共分为五个模块,分别为顶层模块(shuzizhong.v)、时钟模块(clock.v)、秒表计时模块(timepiece.v)、数字时钟模块(digital_clock.v)、数码管显示模块(display.v)。从图2.1系统RTL视图中可以清晰地看出每个模块之间的联系。
图2.1系统RTL视图
关于系统RTL视图的分析:实验板上的晶振clk_50M为50MHZ,使clk_50M数据传入时钟模块,得到分频后的100HZ(clk_1ms)和1HZ(clk_1Hz)。将分频后得到的时钟传入秒表计时模块和数字时钟模块,使模块可以正常运行。最后,将秒表计时模块和数字时钟模块产生的数据分别传入数码管显示模块,使数码管上正常显示数据。图中的蜂鸣器beep和灯led是整时报警功能。
从图2.2资源占用图中可以看到,本设计一共用了294个总逻辑元素,使用了293个总组合功能,使用了79个专用逻辑寄存器。其中总寄存器为79个,总输入输出端口为53个(占总资源的10%),用到的总虚拟针、内存碎片、嵌入式乘法器、锁相环均为零个,可以得出,本次设计用到的资源相对来说还是较少的,得益于数码管显示的巧妙使用。
图2.3管脚分配图
图2.3为该设计的管脚分配图。可以看出,input中除了时钟频率的输入为晶振所在处,其余八个输入均为一般的正常开关。output中除了蜂鸣器beep为外设接口和灯led之外,其余的42个输出端口设置为为六个七段数码管的管脚。
各模块的说明:
顶层模块(shuzizhong.v):
信号名 输入/输出 说明 管脚分配
clk_50M 输入 50MHz基准时钟信号 PIN_Y2
nrst 输入 复位信号,低电平有效 SW17
stop0 输入 数字时钟暂停,高电平有效 SW0
stop 输入 秒表的暂停信号,高电平有效 SW1
clear 输入 秒表清零信号,高电平有效 KEY3
switch 输入 模块选择M1、M2 SW2
set_m1 输入 数字时钟分钟个位置数信号 KEY0
set_m10 输入 数字时钟分钟十位置数信号 KEY1
set_h 输入 数字时钟小时置数信号 KEY2
beep 输出 蜂鸣器整时报警信号 外设接口
out 输出 6个7段数码管输出信号 HEX[0]-HEX[5]
led 输出 整时报警显示 LEDR0
图2.4顶层模块仿真图
由图 2.4可得出,本设计的相关功能已基本实现。注意一些管脚名称的作用:stop0和stop分别只在数字时钟模式暂停和秒表模式的暂停;clear只是秒表清零信号,只对M2有效,对整个系统无效;且从仿真图可以得出:switch可以进行M1和M2的自由切换。
时钟模块(clock.v):
信号名 输入/输出 说明
clk_50M 输入 50MHz基准时钟信号
nrst 输入 复位信号,低电平有效
stop0 输入 数字时钟暂停信号,高电平有效
stop 输入 秒表的暂停信号,高电平有效
时钟模块部分代码示例:
图2.5 时钟模块仿真图时钟模块分别产生100HZ(clk_1ms)和1HZ(clk_1Hz)的时钟,并且,nrst低电平有效,一旦有效,则时钟全部清零,即全为0;
秒表计时模块(timepiece.v):
信号名 输入/输出 说明
clk_1ms 输入 时钟信号,100Hz时钟
nrst 输入 复位信号,低电平有效
stop 输入 暂停信号,高电平有效
clear 输入 清零信号,高电平有效
switch 输入 开关转换信号,高电平显示秒表
c_10ms 输出 秒表的十毫秒位
c_100ms 输出 秒表的百毫秒位
c_s 输出 秒表的秒位
秒表计时模块仿真图,秒表计时模块中,结合时钟模块产生的100HZ(clk_1ms)时钟进行0000~9999的108.9秒的计时功能;且当switch为0时,秒表计时模块无响应,只有switch为1时,秒表计时模块才进行相应的变化,体现了switch开关转换的灵活性;同时,秒的十位、秒的各位、毫秒的百毫秒位、毫秒的十毫秒位可根据时钟的变化而变化,功能基本实现。
数字时钟模块(digital_clock.v):
信号名 输入/输出 说明
clk_1Hz 输入 本模块的时钟信号,采用1Hz时钟
nrst 输入 复位信号,低电平有效
stop0 输入 暂停信号,高电平有效
switch 输入 显示切换信号,低电平显示数字时钟
set_m1 输入 分的个位置数信号,高电平有效
set_m10 输入 分的十位置数信,高电平有效
set_h 输入 时的置数信号,高电平有效
c_s1 输出 秒的个位
c_s10 输出 秒的十位
c_m1 输出 分的个位
c_m10 输出 分的十位
c_h 输出 小时
在M1时/分/秒模式中,可以进行时的24内循环自增设置;分别可以进行分的十位和个位60内同时循环自增设置;而秒则不用进行循环按键自增,等待即可。其中,数字时钟模块所用到的时钟是1HZ(clk_1Hz)的时钟,使该模块的数据传输达到准确无误。可知,该模块基本功能已实现。
数码管显示模块(display.v):
信号名 输入/输出 说明
clk_50M 输入 50MHz基准时钟信号
nrst 输入 复位信号,低电平有效
switch 输入 模块显示选择
低电平显示数字时钟,高电平显示秒表计时器
c_s1 输入 数字时钟秒的个位(数码管第四位)
c_s10 输入 数字时钟秒的十位(数码管第三位)
c_m1 输入 数字时钟分的个位(数码管第二位)
c_m10 输入 数字时钟分的十位(数码管第一位)
c_10ms 输入 秒表的10毫秒位(数码管第四位)
c_100ms 输入 秒表的百毫秒位(数码管第三位)
c_s 输入 秒表的秒位(数码管第二位)
c_10s 输入 秒表的十秒位(数码管第一位)
out5~out0 输出 6个7段数码管的输出(h/m/s)
数码管显示模块仿真图中来看,可以得出,且当switch为1时,数码管显示模块无响应,只有switch为0时,数码管显示模块才进行相应的变化,体现了switch开关转换的灵活性;当数字时钟模块和秒表计时模块送过来数据时,数码管显示模块可以进行正确的数码管段内显示。数码管显示模块功能完全实现。
四、 功能验证
系统上电,复位键未工作时,模式选择M1时钟模式,置数00:00:00,按下开始键时钟开始计时,整点时蜂鸣器报警,LED闪烁,随后时钟由00:00:00—23:59:59进行自增循环。然后选择M2秒表模式,按下开始键,秒表开始工作,按下暂停键,秒表停止,按下清零键,秒表归零。
综上,功能和仿真结果相符,实验得证。
实物图:
实物图是系统处于M1时钟模式显示整时05:00:00,led亮并且蜂鸣器报警。
五、 总结
遇到的问题:
a.在程序正常运行过程中进行置数,结果混乱不清,不知是否成功置数;
b. 时/分/秒中秒的置数结果不明显;
c. 例化的使用、顶层文件与其他文件的结合有问题等等。
解决方法:
a. 以停止按键处于有效状态为前提,进行置数,可以清晰观察结果;
b.人性化处理,舍弃秒的置数结果;
c.各成员分别上网查找资料,最后一起讨论得出解决方法。
心得体会:本次实验中,用verilog语言进行设计仿真。通过本次实验,让我对verilog硬件描述语言的语法、理解、以及应用层面又熟练了很多。特别是对模块划分,又有更加清晰的认识。并且对开发板上的数码管模块、led等模块进行了应用级别的掌握。本次实验的难度在于数码管的动态扫描显示,其通过对时钟分频的方式对数码管进行动态扫描。本次实验不足的地方是功能实现花样还不够灵活,将会在以后的实验中注意并完善此问题。
以上就是本次设计的介绍,如有人需要word或者源代码,请在下方评论,欢迎各位来交流。