复杂数字钟设计及开发板硬件实验是Verilog与FPGA设计与应用的第一个综合训练,把已经学过的Verilog语法与FPGA的基本知识加以综合应用。本训练的内容主要包含如下几个部分:
1. 设计需求分析:
-
-
本设计需求如下:
- 数字钟显示内容如下:月、日、时、分、秒。用数码管显示各项内容。
- 具有简单按键校准功能。并能指示校准位置。
- 为了清晰易读,月、日、时、分、秒之间应做好显示分割。
-
2. 接口需求分析与设计:
在设计需求分析中首先要确定端口设计,也就是确定FPGA对外界的接口,接口设计原则一般遵循三个方面的内容,一是设计需求,而是已有的硬件系统,三是本着经济易用的原则。
本设计采用已有的开发板PRA006/010或PRX100-d的基础上进行,开发板上已有6个数码管,和4个按键(PRA006)或7个按键(PRX100-D),50MHz的时钟,因此输入、输出接口基本确定,为了兼容两个开发板的Verilog程序设计,确定接口如下:
-
- 50MHz的输入时钟:
- 6个数码管,其中7段用于显示数字,小数点用于显示分割和校准指示(采用闪动效果)。
- 4个按键:分别用于加、减、左移、右移。加、减用于校准(较时),左、右移由于移动闪烁的小数点,以便准确指示校准的位置
- 接口设计完成后,就进入程序设计阶段。
3. 程序设计阶段:
程序设计阶段一般分为功能划分,子模块接口对接,子模块程序实现,编译、硬件调试。在程序阶段一般会有反复修正的过程。
- 功能划分:
由于内部功能比较复杂,因此在程序设计之前要求对整体设计在结构上要有清晰的划分,将一个大的工程拆分成可以控制易于设计的子模块,功能划分一般遵循如下步骤:
- 对需求进行全面分析,确定要实现的要素
- 初步功能划分,实现各模块之间接口
- 逐步深入划分,在深入划分中,检查上级划分是否合理,如不合理对上级做出修正。
- 直到最后一级,完成Verilog程序设计。
图1
- 程序分割的原则
- 尽量使用已学过,调试过的程序,做到程序复用
- 抽象,模块的功能需要仔细研究与抽象,把多个层次或模块需要的功能抽象出来生成单独的模块,便于系统范围内程序共用。
- 抽象出来的模块有一定的适应性,如有必要引入参数化设计。
- 模块之间接口清晰,耦合要弱,能单向耦合就不做双向耦合(见计数模块与调度模块分析)
- 模块功能内聚,相似功能,强关联功能尽量在一个模块内实现(见计数模块中的计数与按键移动)
- 层数,模块数量应折中;过少层次之间不够清晰,模块不独立;过多程序庞大臃肿,一样不好维护。
- 如有通信,层间划分应实现收发之间对等(后续课程会有详解)。
初步设计的功能划分如图2
图2
修正后的功能划分,如图3:
图3
- 程序编译、仿真、硬件验证与调试。根据调试和验证结果可能会有如下调整:
- 可能调整模块间的功能微调
- 模块内程序修正
- 传递参数调整
- 往复上述过程,直到满足设计要求
4. 文档
- 修正设计文档、写出调试报告,及工程设计调试经验。
- 写出使用说明(书)。
- 整理程序,添加合理注释,以及修改部分变量名称,增加程序易读性。
5. 发布
- 发布程序(移交给委托方)
- 发布文档(移交给委托方)
6. 培训
- 内部培训
- 外部培训(委托方)
7. 改进与优化
按照设计要求,从最初的项目设计到代码编写,板载实验及调试(包括代码更新)都已经完成。经过使用体验,我们发现还有许多可以改进的地方。
- 改进的原则:
- 增强用户体验
- 易于使用,尽量做到所见即所得,缩短使用的学习时间
- 减少用户的设置错误
- 与现有市面上的成熟产品对比,尽量沿袭用户的使用习惯
- 修改代码使得二次开发用户易于理解和集成复用
- 降低成本,功耗
- 增强用户体验
- 优化内容:
- 时,分,秒,日,月的快速定位(界面切换更灵活)、
- 更改小数点闪动频率
- 将小数点每次移动两位、
- 计数器高低位联系起来校准
- 月份和天之间自动校准
- 通过蜂鸣器,增加整点报时
- 优化结果分析:
- 按键不能迅速调整秒,分钟。可以继续优化按键去抖模块,达到长按迅速增加或是减少
- 将校准的闪动小数点换成闪动数码管
- 增加闹钟功能
- 减少按键,降低成本
- 观察代码优化,是否可以进一步精简
PRA006工程代码(登录用户可见):
移植到PRX100-D的工程代码(登录用户可见):
优化后PRX100-D的工程代码(登录用户可见):