发布时间:2022-11-30 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

目录

实验 9 FPGA数字钟

?请使用SystemVerilog/Verilog实现一个数字钟。
要求:
(1)能够显示时分秒;
(2)能够设置开始时间;
(3)使用你自己的7段数码管显示译码电路实现;
(4)可以使用动态显示方法实现;
(5)依据实现的其他附加功能,酌情加分:秒表、倒计时、闹钟、…
(6)需要在Basys3 FPGA开发板上实现,并通过验收

实验分析:

该实验主要考察对使用硬件设计语言(HDL)进行编程设计,锻炼硬件设计能力。

实现思路:

采用模块化设计的思想,将整个数字钟分解为若干功能模块:

  1. 端口映射:约束文件(代码端口映射到硬件端口)

  2. 处理按键输入的io模块:消抖,判断按下

  3. 特定功能模块:时钟分频,24小时时钟,正/倒计时,秒表,闹钟,秒表,时间设置

  4. 显示模块:译码,选择输出

硬件支持:

FPGA开发板:Artix-7 Basys3 from Xilinx
数字逻辑实验 9 FPGA数字钟(Verilog)

学习步骤:

  1. 阅读手册,了解结构与功能:
    Basys 3 Reference Manual - Digilent Reference

  2. 若需要更详细的信息,则阅读所用模块的原理图
    Basys 3 Schematic - Digilent

数字逻辑实验 9 FPGA数字钟(Verilog)

数字逻辑实验 9 FPGA数字钟(Verilog)

数字逻辑实验 9 FPGA数字钟(Verilog)

硬件描述语言代码编写:

1 顶层模块

输入:板载时钟CLK,各种按键

输出:按键LED灯信号,数码管12位信号(4位用于位置选择,7位用于7段数码管显示,1位用于小数点显示)

内部:

1 分线接线,设置缓冲区等

2 例化各种子模块

3 选择数码管输出

2 时钟分频,(正/倒)计时器模块

时钟分频

将板载输入100MHz分频为所需频率:

1000Hz用于扫描

1Hz用于时钟计时

60Hz用于秒表计时

由分频公式\(f=\frac{p}{2^{N}} f_{0}\),得\(p=\frac{2^{N} f}{f_{0}}\)。采用32位计数器即可求得对应分频器的加数\(p\)

1位计时器

通过输入的进位计时增加,满量程后进位。带有设置时间和开始/暂停功能。

1位倒计时器

与计时器相仿,减一个数等价于加上其补码,-1→+15

3 输入处理模块in_out.v

输入:未处理的按键接线

输出:处理后按键接线

按键消抖

由于按键输入可能存在的抖动与对板载时钟的异步输入,所以要进行消抖与同步处理。

这里采用了简单的串联触发器构成的同步器,通过三级或更多级触发器,使得最终采样到的信号为亚稳态的概率尽可能小,即输出趋于稳定。

数字逻辑实验 9 FPGA数字钟(Verilog)

判断Button按下

按下,电位由低变高(或相反),存在一个上升沿,能不能用posedge检测上升沿来检测按键按下?

本着老师所说的控制信号与其他信号分开处理的要求,这里采取了连续采样寄存多次Button信号,通过判断临近两位是否出现相反的电位,来确定是否出现了上升沿。(相当于又做了一次同步??,感觉这里处理的不简练)

5 24小时时钟,计时,秒表模块

?输入:
各时钟与复位信号:CLK,clock_clk,scan_clk,Reset
设置时间,开始/暂停,高位显示信号

?输出:
设置时间值,输出时间值,数码管信号

正倒计时模块:正计时与24小时时钟模块相同,倒计时采用decounter即可

秒表:接入ms_clk即可,其他与时钟相同

6 闹钟

输入同上,另增一闹钟开关输入

输出另增一beep输出,用于响铃

思路:记录所设置的闹钟时间,与时钟时间比较,判断是否触发响铃。

7 时间设置

输入:各控制信号,按键信号

输出:所设置的时间

维护reg [5:0] setbit;通过左右按键调整设置哪一位,上下按键增减数值。

按键功能:

SW15显示高位
SW14闹钟开关
SW13功能归零reset高有效
SW6秒表
SW5闹钟
SW4倒计时
SW3正计时
SW2时钟
SW1设置时间
SW0全局复位

按键去抖动:

(154条消息) FPGA中的按键消抖_Super-fei的博客-CSDN博客_fpga按键消抖

Verilog——FPGA按键去抖操作_Footprints明轩的博客-CSDN博客