Menu Close

利用Verilog 进行复杂数字钟设计(1)–程序功能划分技巧

在前几节课中讲解了PLL,分频器,计数器,数码管的译码显示,按键去抖等内容,本节内容主要利用已学过的内容进行复杂数字钟的设计,以达到对学过的知识进行复习、练习以及综合设计及应用的目的。

1.复杂数字钟设计要求如下:

  • 计数:设计月、日、时、分、秒计数器(为了简化设计,不考虑闰年效应, 2月统一为28天)。
  • 显示:
    • 分两个界面显示:第一个界面显示时、分、秒,之间每两位由小数点分隔;第二个界面显示字符“dd”,月份,日。字符“dd”用来区分这两个界面。
    • 界面之间的切换:由移动闪动的小数点完成。当闪动的小数点移动到小时,继续左移时,即从第一个界面切换到第二个界面。当闪动的小数点移动到日,继续右移时,可以从第二个界面返回到第一个界面。
  • 小数点:
    • 两种模式显示:一种是分隔小数点,即每两位有一个小数点分隔,位置固定,常亮;另一种是调整指示小数点,以一秒的频率闪动,用来指示对应计数值的修改位置。
  • 按键:使用4个按键,对应FII-006/010上的PB0 (+), PB3(-), PB1 (左移),PB2(右移)。当PB1(左移)按下时,闪动小数点左移,当PB2(右移)按下时,闪动小数点右移。当闪动的小数点移动到小时,继续左移时,即从第一个界面切换到第二个界面。当闪动的小数点移动到日,继续右移时,可以从第二个界面返回到第一个界面。在闪动的小数点指示位置,按动PB0(+),对应的数码管显示加1,按动PB3(-),对应的数码管显示减1。用于手动较准时间。
  • 整体设计要求:层次化、模块化、参数化,自顶向下实现。

 

2.设计分析:设计架构设计

  • 接口: 时钟,4个按键输入,6个数码管输出。
  • 模块:
    • 调度程序shdl(schedule,调度按键调整与计数显示之间的切换)
    • 计数器
    • 分频器
    • PLL
    • 扫描及显示译码
  • 组装:分析各个模块之间的关系,把共同部分提取出来,来决定层次之间的关系。如PLL模块生成时钟信号,该信号将会被各个功能模块使用,因此PLL的例化应放在顶层模块。再比如分频的输出ms_p,不仅被s_p的分频使用,按键去抖,数码管扫描等都会使用,因此分频程序也在顶层模块例化,方便信号的相互使用,这样整个程序脉络清晰、整洁。

 

图1

  • 自顶向下逐步实现各个底层模块。

 

 3.设计步骤

  1. 在Quartus II新建工程,工程名称 complex_counter, 顶层实体名称 complex_counter, 顶层文件的名称complex_counter.v, 器件Cyclone 10LP, 10CL006YE144CG, 仿真工具选择Modelsim-Altera
  2. 编写顶层文件


 

PLL 在编写顶层文件完成后可以利用向导(wizard)生成,输入时钟50Mhz, 输出时钟100Mhz,  例化如下:


 

4.在Quartus II 下编译,检查语法错误

修改过语法错误后,最后编译会因为没有底层的模块报错,如图2,

 

图2

图2中指出,scan_dis_7seg与schdl_adjust 没有定义底层模块,顶层模块的编写没有错误。一步步把底层实现后,该错误就会消除。底层模块的实现在下节内容介绍。

作业:在Quartus下利用图形输入法完成顶层模块设计。

 

Posted in FPGA, FPGA 教材教案, Quartus II, Verilog, 开发工具, 教材与教案, 文章