万年历数字时钟设计 Verilog Vivado

名称:万年历数字时钟设计 Verilog Vivado

软件:Vivado

语言:Verilog

功能介绍

这是一个基于 Verilog 和 Vivado 的万年历数字时钟设计,顶层模块 calendar_digital_clock 使用 50MHz 输入时钟,能够显示年月日或时分秒,并通过 8 位数码管进行动态显示。系统提供日期/时间显示切换和 12/24 小时制切换,模式状态通过 LED 输出指示。 工程支持对年、月、日以及时、分、秒进行按键调整。日期模式下,三组加减按键分别对应年份、月份和日期;时间模式下,对应调整小时、分钟和秒。按键输入经过消抖处理并转换为单周期脉冲,避免机械抖动造成重复触发。 时钟核心按照秒、分、小时逐级进位,并在跨天时通知万年历模块自动更新日期。万年历逻辑包含大小月和闰年处理,显示控制模块再将数据转换为数码管段码和位选信号。工程同时配套 Testbench、仿真输出、Vivado 工程及管脚约束,适合学习数字时钟、按键控制、日历进位和数码管扫描等设计方法。

运行环境

开发工具:Xilinx Vivado;硬件描述语言:Verilog;输入时钟:50MHz;显示接口:8 位数码管动态扫描;复位方式:低电平复位。工程提供 .xpr 工程文件、Verilog 源文件、仿真 Testbench、XDC 管脚约束以及综合实现结果文件,可在 Vivado 中打开工程后进行仿真、综合、实现和生成比特流。

设计思路

本设计以 50MHz 系统时钟为基础,通过参数化的 1 秒计数器产生标准秒脉冲,再由时分秒计时核心完成秒、分、小时的进位处理。当时间从 23:59:59 回到 00:00:00 时输出跨天脉冲,驱动万年历模块更新日期。日期模块负责年份、月份和日期的加减,并处理大小月及闰年规则,使日期变化保持有效范围。 按键输入先经过统一消抖和单周期脉冲提取,再由模式控制与按键路由模块分发。当系统处于日期显示模式时,按键用于调整年、月、日;处于时间显示模式时,同一组按键用于调整时、分、秒。显示模式按键用于在年月日与时分秒之间切换,小时制按键用于选择 24 小时或 12 小时显示。 显示控制模块将当前日期或时间拆分为数码管所需的十位和个位数据,smg 模块采用 8 位动态扫描方式驱动数码管。各模块通过清晰的脉冲和数据接口连接,便于在 Vivado 中进行层次化阅读、仿真和综合实现。

模块结构

顶层模块 calendar_digital_clock 负责连接各功能模块并统一管理输入输出。clock_key_bank 完成 8 个按键的消抖和单脉冲提取;clock_mode_ctrl 管理日期/时间显示模式及 24/12 小时制切换;clock_key_router 根据当前模式将按键脉冲路由至日期或时间调整通道。 clock_time_core 负责 1 秒计数、时分秒运行和跨天脉冲生成;calendar 负责年份、月份、日期的调整以及大小月、闰年规则;clock_display_ctrl 将日期和时间数据转换为各数码管位的显示数字;smg 完成 8 位数码管动态扫描和段选输出。key_jitter 作为按键消抖相关模块参与输入处理。

开发板验证

工程已提供完整的 Vivado 管脚约束文件,可据此完成顶层时钟、复位、按键、模式指示灯及 8 位数码管接口的开发板连接与验证。顶层模块为 calendar_digital_clock,约束文件与工程文件配套,便于直接进行综合、实现和下载测试。

演示视频

配套演示视频展示该万年历数字时钟工程的运行效果,可结合日期/时间显示切换、12/24 小时制切换以及年月日和时分秒按键调整功能进行查看。

仿真图/仿真说明/设计文档图片

工程配套 tb_calendar_digital_clock.v Testbench,并提供 Vivado XSim 仿真工程文件、VCD 波形文件和仿真数据库,可用于观察按键脉冲、模式切换、时间进位、跨天日期更新及数码管显示数据变化。设计文档包含工程文件说明、程序编译、RTL 结构、管脚分配、仿真图、Testbench 和顶层仿真图等内容。

万年历数字时钟设计 Verilog Vivado 设计文档图片 image1.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image10.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image11.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image12.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image13.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image14.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image15.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image16.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image17.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image18.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image19.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image2.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image20.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image21.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image3.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image4.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image5.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image6.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image7.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image8.png

万年历数字时钟设计 Verilog Vivado 设计文档图片 image9.png

部分代码

以下展示顶层模块 calendar_digital_clock 的部分代码,完整源码请下载压缩包查看。

module calendar_digital_clock
#(
    // 1 秒计数上限。
    // 对于 50MHz 时钟,计满 49_999_999 共 50_000_000 个时钟周期,正好约 1 秒。
    parameter integer ONE_SEC_CNT_MAX  = 32'd49_999_999,

    // 按键消抖计数上限。
    // 该参数会传递给 key_jitter 模块。
    parameter integer DEBOUNCE_CNT_MAX = 20'd999_999
)
(
    input         clk_in,             // 50MHz 系统时钟
    input         rst_n,              // 低电平复位
    input         dis_switch_key_n,   // 日期/时间显示切换按键,低电平按下
    input         hour_switch_key_n,  // 24/12 小时制切换按键,低电平按下
    input         add_key1,           // 日期模式:年加;时间模式:时加
    input         sub_key1,           // 日期模式:年减;时间模式:时减
    input         add_key2,           // 日期模式:月加;时间模式:分加
    input         sub_key2,           // 日期模式:月减;时间模式:分减
    input         add_key3,           // 日期模式:日加;时间模式:秒加
    input         sub_key3,           // 日期模式:日减;时间模式:秒减
    output        led,                // 模式指示:1 表示显示日期,0 表示显示时间
    output [7:0]  sm_bit,             // 数码管位选
    output [7:0]  sm_seg              // 数码管段选
);

// -------------------------------------------------------------------------
// 一、按键消抖后的单周期脉冲信号
// -------------------------------------------------------------------------
wire dis_switch_pulse;
wire hour_switch_pulse;
wire add_key1_pulse;
wire sub_key1_pulse;
wire add_key2_pulse;
wire sub_key2_pulse;
wire add_key3_pulse;
wire sub_key3_pulse;

// -------------------------------------------------------------------------
// 二、模式控制信号
// show_date   = 1:显示年月日
// show_date   = 0:显示时分秒
// hour_mode_24= 1:24 小时制
// hour_mode_24= 0:12 小时制
// -------------------------------------------------------------------------
wire show_date;
wire hour_mode_24;

// -------------------------------------------------------------------------
// 三、时间调整脉冲
// 这些脉冲只在"时间显示模式"下有效
// -------------------------------------------------------------------------
wire time_add_hour;
wire time_sub_hour;
wire time_add_minute;
wire time_sub_minute;
wire time_add_second;
wire time_sub_second;

// -------------------------------------------------------------------------
// 四、日期调整脉冲
// 这些脉冲只在"日期显示模式"下有效
// 其中 day_add_pulse 还会叠加来自时钟核心的"跨天自动加 1"脉冲
// -------------------------------------------------------------------------
wire year_add_pulse;
wire year_sub_pulse;
wire month_add_pulse;
wire month_sub_pulse;
wire day_add_pulse;
wire day_sub_pulse;

// -------------------------------------------------------------------------
// 五、时间核心输出
// auto_day_add_pulse 在 23:59:59 -> 00:00:00 时产生一个单周期脉冲
// 用来通知 calendar 模块"日期需要加 1"
// -------------------------------------------------------------------------
wire [4:0] hour_24;
wire [5:0] minute;
wire [5:0] second;
wire       auto_day_add_pulse;

// -------------------------------------------------------------------------
// 六、万年历模块输出
// year_h / year_l 分别表示年份高两位、低两位,例如 2026:
// year_h = 20,year_l = 26
// -------------------------------------------------------------------------
wire [7:0] year_h;
wire [7:0] year_l;
wire [3:0] month;
wire [4:0] day;

// -------------------------------------------------------------------------
// 七、显示控制模块输出
// display_hour 是"最终要显示的小时值":
// - 24 小时制时,display_hour = hour_24
// - 12 小时制时,display_hour 会自动转换为 1~12
// disp_xxx 则是送往 smg 数码管模块的各位数字
// -------------------------------------------------------------------------
wire [4:0] display_hour;
wire [3:0] disp_shi3;
wire [3:0] disp_ge3;
wire [3:0] disp_shi2;
wire [3:0] disp_ge2;
wire [3:0] disp_shi1;
wire [3:0] disp_ge1;
wire [3:0] disp_shi0;
wire [3:0] disp_ge0;

// -------------------------------------------------------------------------
// 1. 8 个按键统一消抖
// -------------------------------------------------------------------------
clock_key_bank #(
    .DEBOUNCE_CNT_MAX(DEBOUNCE_CNT_MAX)
) u_key_bank (
    .clk_in(clk_in),
    .rst_n(rst_n),
    .dis_switch_key_n(dis_switch_key_n),
    .hour_switch_key_n(hour_switch_key_n),
    .add_key1(add_key1),
    .sub_key1(sub_key1),
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 万年历数字时钟设计 Verilog Vivado

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员