数字时钟 FPGA 设计 Verilog Vivado
名称:数字时钟 FPGA 设计 Verilog Vivado
软件:Vivado
语言:Verilog
开发板/平台:Basys 3
功能介绍
本设计实现了一个基于 FPGA 的数字时钟系统,采用 Verilog 编写,在 Vivado 环境下完成工程搭建、仿真、综合实现和 bit 文件生成。系统主要功能包括小时、分钟、秒钟计时显示,按键设置时间,确认设置,以及在时分秒设置项之间切换。 顶层模块 digital_clock 面向 Basys 3 开发板接口设计,输入端包含 100MHz 系统时钟和三个板载按键,输出端包含 8 位 LED、两组数码管段选和两组数码管位选。数码管用于显示当前时间信息,LED 用于输出 PWM 控制效果,适合用于 FPGA 数字系统课程设计、计时器实验、按键消抖实验和数码管动态扫描实验。 工程结构按功能模块划分,包含分频、计时、按键消抖、数码管显示、占空比控制和 PWM 输出等部分。各模块之间通过清晰的时钟、控制信号和时间数据连接,便于阅读、修改和二次扩展,例如调整显示格式、扩展按键功能或改变 PWM 控制策略。运行环境
开发语言:Verilog 开发软件:Vivado 适配开发板:Basys 3 顶层模块:digital_clock 工程包含 Vivado 工程文件、Verilog 源码、Testbench、Basys 3 管脚约束文件以及已生成的实现结果文件。设计思路
系统以 100MHz 输入时钟为基准,先通过分频模块产生 1Hz 秒脉冲,作为数字时钟计时更新的核心节拍。计时模块围绕时、分、秒三个计数量设计,并结合设置、确认、切换三个按键输入,实现正常走时与手动校时之间的状态切换。 按键部分采用独立消抖模块处理,BTNL、BTNR、BTNU 分别生成稳定的按键上升沿信号,避免机械按键抖动造成重复触发。这样顶层模块只需要接收消抖后的单脉冲控制信号,逻辑层次清晰,也便于在仿真和上板时定位按键相关问题。 显示部分由数码管动态扫描模块完成,将小时、分钟、秒钟数据送到两组数码管段选和位选端口进行显示。PWM 相关逻辑由占空比控制模块和 PWM 控制模块组成,占空比信号与当前小时信息相关联,最终将 PWM 波形同步输出到 8 位 LED,用于形成可观察的亮灭控制效果。模块结构
顶层模块:digital_clock,负责连接时钟输入、按键控制、计时数据、数码管显示和 LED PWM 输出。 主要子模块包括:fenping 分频模块,用于产生 1Hz 时钟;jishi 计时模块,用于完成时分秒计数与设置控制;key_jitter 按键消抖模块,用于处理设置、确认和切换按键;display_num 数码管显示模块,用于完成时分秒数据显示和动态扫描;duty_ctrl 占空比控制模块,用于生成 PWM 占空比控制信号;PWM_ctrl PWM 控制模块,用于输出 PWM 波形。开发板验证
工程包含 Basys 3 开发板对应的管脚约束文件,按键、LED 与数码管接口均已完成约束分配,可用于 Vivado 综合、实现和生成 bit 文件后进行上板验证。 开发板验证图片展示了实物运行效果,数字时钟可在 Basys 3 板载数码管上显示时、分、秒信息,并通过按键完成时间设置、确认以及时分秒切换操作。LED 端口输出 PWM 波形状态,可结合时钟运行状态观察亮灭变化。
演示视频
配套演示视频展示了数字时钟在开发板上的运行效果,可直观看到数码管显示、按键设置和 LED 输出状态,便于下载前了解工程实际功能。仿真图/仿真说明/设计文档图片
设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、管脚分配、Testbench 和仿真图,可用于了解工程搭建流程、模块连接关系和仿真验证方式。 仿真工程中包含 test_bench.v 和 Vivado XSIM 相关仿真结果文件,可作为学习数字时钟计时逻辑、按键控制流程和数码管显示逻辑的参考。








部分代码
以下展示顶层模块 digital_clock 的部分代码,完整源码请下载压缩包查看。
module digital_clock(
input clk_100M,
input BTNL,//设置时间
input BTNR,//确认
input BTNU,//设置时分秒
//PWM输出
output[7:0] led,
//数码管显示
output [7:0] dig_led_1,//数码管段选
output [3:0] wei_led_1,//数码管位选
output [7:0] dig_led_2,//数码管段选
output [3:0] wei_led_2//数码管位选
);
wire set_time_key;//设置时间
wire confirm_key;//确认
wire change_time_key;//设置时分秒
wire clk_1Hz;
wire [6:0] duty;//占空比控制信号,最大100
wire [7:0] hour_time;//时
wire [7:0] minute_time;//分
wire [7:0] second_time;//秒
wire PWM_wave;
key_jitter key_set_time_key(
. clkin(clk_100M),
. key_in(BTNL),//输入
. key_posedge(set_time_key),//消抖后按键上升沿
. key_negedge(),//消抖后按键下降沿
. key_value()//消抖后按键
);
key_jitter key_confirm_key(
. clkin(clk_100M),
. key_in(BTNR),//输入
. key_posedge(confirm_key),//消抖后按键上升沿
. key_negedge(),//消抖后按键下降沿
. key_value()//消抖后按键
);
key_jitter key_change_time_key(
. clkin(clk_100M),
. key_in(BTNU),//输入
. key_posedge(change_time_key),//消抖后按键上升沿
. key_negedge(),//消抖后按键下降沿
. key_value()//消抖后按键
);
fenping i_fenping(
. clk_100M(clk_100M),
. clk_1Hz(clk_1Hz)
);
jishi i_jishi(
. clk_100M(clk_100M),
. clk_1Hz(clk_1Hz),
. set_time_key(set_time_key),//设置时间
. confirm_key(confirm_key),//确认
. change_time_key(change_time_key),//设置时分秒
. hour_time(hour_time),//时
. minute_time(minute_time),//分
. second_time(second_time)//秒
);
display_num i_display_num(
. clk(clk_100M),
. duty(duty),
. hour_time(hour_time),//时
. minute_time(minute_time),//分
. second_time(second_time),//秒
. dig_led_1(dig_led_1),
. wei_led_1(wei_led_1),
. dig_led_2(dig_led_2),
. wei_led_2(wei_led_2)
);
//占空比控制模块
duty_ctrl i_duty_ctrl(
. clk_100M(clk_100M),//输入100MHz
. hour_time(hour_time),//时
. duty(duty)
);
//PWM波控制模块
PWM_ctrl i_PWM_ctrl(
. clk_100M(clk_100M),//输入100MHz
. duty(duty),//占空比控制信号,最大100
. PWM_wave(PWM_wave)//输出占空比
);
assign led={PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave};
endmodule
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 数字时钟 FPGA 设计 Verilog Vivado
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 数字时钟 FPGA 设计 Verilog Vivado