文章目录
- 一、题目解析
- 二、代码模块化分析
- 1.分频模块(divider_module)
- 2.计数器模块(实现毫秒,秒,分钟的计数实现)
- 3.动态数码管显示模块(数码管段选和位选)
- 三、总结
一、题目解析
题目要求使用VerilogHDL设计一个数字跑表,需要具有CLR,PAUSE以及六位数码管的计时跑表,并编写测试代码实现其仿真验证。
二、代码模块化分析
从题目的任务分析我们可以看出:首先我们需要一个百分秒时钟,以实现最低位的时钟需求;其次需要计数器模块,将百分秒的计数输出信号转化给秒,分钟;然后需要将百分秒,秒,分钟的数据结果显示到动态数码管中,因此需要设计一个动态数码管显示以及数据转化的模块;最后利用top层将各模块相连接,实现题目要求。
1.分频模块:
通过公式计算出10ms对应的计数值,在always语句中设置计数累加,判断值达到后计数count清零,CLK取高电平,实现每10ms一次上升沿信号的分频模块。(注:一般的FPGA板内部晶振时钟为50MHz)
2.计数器模块
代码如下:
将分频模块中的输出时钟(即10ms时钟)作为计数模块的输入,在百分秒计数满100后,实现百分秒的清零,并给出一个高电平信号(即cn1==1),达到第二个always语句的触发条件,在接收60次cn1的触发之后(即秒位计数60秒),实现秒位的清零,并同理给出cn2==1的触发信号,实现分钟位的计数。
3.动态数码管显示模块
在实现动态数码管显示模块之前,我们需要了解的是,动态数码管是通过段选和位选实现,因此每次只能显示一个数码管上的值,但是在较快的刷新频率下使肉眼不能产生余晖效应,无法捕捉到数码管的变化(即用较快的速度骗过人们的眼睛),即可实现几位数码管同时显示的效果。
由于实验板的数码管是共阴,因此在位选信号时应该给予低信号驱动,段选时则应该使用高电平信号。
代码如下:
代码中的function用于实现计数器模块输出的sum值转化为数码管的段选值;选择合适的刷新频率完成简易的分频,实现位选信号的循环(即第一个always语句块);最后将所有的6位位选信号和8位段选信号统一赋值给DATA1,实现此模块的功能。
三、总结
我将最终整合的top层代码放到了总结处: