一、 实验目的
实现数码时钟的功能,要求能够进行24时制时、分、秒的显示,并能够通过按键调整时间。
二、 实验原理
通过对系统时钟进行计数,获得1S的标准信号,再以该信号为基础,进行时、分、秒的计数,通过数码管将该计数值显示出来,即可实现数字钟的功能。同时可以使用独立按键对时、分、秒计数器的初始值进行设置,即可实现时间的设定。
三、 硬件设计
本实验硬件电路简单,用到了8个数码管和4个独立按键。硬件电路如下:
图3-1 数字钟电路fficeffice" />
一、 架构设计
本实验设计架构模块较多,下图为数字钟的架构:
图4-1 数字钟实验模块组织结构图
由图可知本实验有16个输出端口和6个输入端口,各端口的意义如下
端口说明
|
端口名
|
端口功能或意义
|
Rst_n
|
全局复位
|
Clk
|
系统时钟输入端口
|
Key_in
|
按键输入端口
|
Seg
|
数码管段驱动输出
|
Sel
|
数码管位驱动输出
|
表4-1 数字钟实验端口说明
因为存在模块间的连接,因此有部分内部信号,下表为部分内部信号的名称和功能说明
内部信号说明
|
内部信号名
|
内部信号功能或意义
|
Time_Data
|
时间值,直接送往数码管显示
|
Key_Value
|
按键检测结果输出
|
Key_Flag
|
按键检测成功标志信号
|
Hour_Disp_en
|
数码管“时”显示使能信号,提供调时时候的闪烁效果
|
Min_Disp_en
|
数码管“分”显示使能信号,提供调分时候的闪烁效果
|
Sec_Disp_en
|
数码管“秒”显示使能信号,提供调秒时候的闪烁效果
|
表4-2 数字钟实验内部信号说明
图中存在较多的模块,因此在此将每个模块的功能做简单介绍:
|
|
normal_keys_detect
|
独立按键消抖模块
|
Dig_Led_Driver
|
数码管驱动模块
|
Clock_Control
|
时钟控制模块
|
Bin_to_BCD
|
二进制转BCD格式模块,将时、分、秒计数器的值转换为BCD格式,以送往数码管显示
|
MUX
|
最右侧三个多路选择器负责根据时分秒的显示使能信号进行对应数码管位的亮灭控制
|
表4-3 数字钟实验模块功能说明
另外,Clock_Control模块为综合模块,内部包含了时、分、秒、时钟计数器模块和时间设定模块,该模块的内部结构这里小梅哥不做过多介绍,详细请参看代码。
一、 代码组织方式
本实验主要学习由顶向下的设计流程,代码均为常见风格,这里不多做介绍。希望读者能够通过代码架构,学习领会这种自顶向下的设计结构的优势。
二、 关键代码解读
本设计中,顶层模块主要实现了各个模块的例化和数码管显示使能的多路控制,相信看了图4-1后,便能理解顶层代码的含义。由于本系统涉及到的模块较多,采用文档的形式很难简洁的讲解清楚,因此,综合实验,小梅哥以后将不再进行关键代码的解读。反之,小梅哥会尽快进行视频的录制,对综合实验采用视频的方式讲解,以使读者快速理解架构。
三、 测试平台设计
本系统为低速系统,采用Modelsim仿真耗时长,而且波形不便于观察。因此仿真略去。大家可以对每个子模块进行仿真,以验证其正确性。
四、 仿真分析
五、 下板验证
此次,小梅哥采用很早以前购买的21EDA的板子进行了下板测试,实测功能完备。以下为测试照片(渣渣像素,请各位谅解)。
一、 总结
本实验实现了数码钟的功能,并可以通过4个按键进行时间的设置,因为时间的关系,小梅哥没有在文档中进行详细的介绍,请大家谅解。
|