日历数字时钟多功能设计 Verilog Vivado

名称:日历数字时钟多功能设计 Verilog Vivado

软件:Vivado

语言:Verilog

功能介绍

这是一个基于 Verilog 和 Vivado 的多功能日历数字时钟设计。系统支持时间与万年历显示、24/12 小时制切换、时间和日期调节,并集成秒表、倒计时、DS18B20 温度显示以及 LED 流水灯等应用模式。各模式通过独立按键切换,状态结果由八位数码管和四路 LED 输出。\n\n工程提供完整的顶层模块、功能子模块、仿真测试平台和 Vivado 工程文件。按键消抖、模式路由、时基计数、数码管扫描和温度接口均已模块化,适合用于多功能时钟、FPGA 外设控制和 Verilog 层次化设计学习。参数化的计数上限与温度仿真选项也方便根据时钟频率、仿真需求或硬件连接进行调整。

运行环境

Verilog HDL,Vivado 工程环境,顶层模块为 calendar_digital_clock。设计按 50MHz 系统时钟配置计时参数,包含 Vivado 仿真测试平台及可直接打开的工程文件。

设计思路

顶层以 50MHz 系统时钟为基础,通过参数化计数器产生 1 秒、秒表 10ms、LED 流水灯 0.5 秒以及按键消抖等时间基准。按键先转换为单周期脉冲,再由模式控制与按键路由模块分配到对应功能,避免不同工作模式之间的按键误触发。大功能模式包含时间万年历、秒表、倒计时、温度显示和 LED 流水灯五类状态;在时间万年历模式中,还可切换年月日与时分秒显示,并选择 24 小时制或 12 小时制。时间、日期、秒表和倒计时分别由独立核心模块处理,DS18B20 驱动负责温度采集,显示控制模块统一完成数码管动态扫描和段码输出,LED 模块提供状态指示。顶层通过参数 TEMP_SIM_USE_MODEL、TEMP_SIM_CENTI 与 TEMP_SIM_SIGN 支持温度仿真模型切换,便于在仿真环境中验证显示和控制逻辑。

模块结构

顶层模块 calendar_digital_clock 负责系统时钟、复位、按键、DS18B20、LED 和数码管接口,并协调各个功能模块。clock_app_mode_ctrl 管理五类应用模式,clock_mode_ctrl 处理时间显示子模式和 24/12 小时制,clock_key_router 与 clock_key_bank 完成按键功能映射,key_jitter 提供按键消抖。\n\nclock_time_core 和 calendar 分别实现时间及日期计数调节,clock_stopwatch_core 实现秒表,clock_countdown_core 实现倒计时,clock_temperature_sensor 与 ds18b20_dri 完成温度采集,clock_led_flow 驱动流水灯。clock_display_ctrl、smg 负责显示数据到数码管的动态扫描和段码输出,tb_calendar_digital_clock 用于顶层仿真验证。

开发板验证

工程提供完整的管脚约束文件,并配有开发板实物图片,可用于将顶层输入输出连接到实际硬件进行验证。设计包含系统时钟、低电平复位、模式切换与显示切换按键、复用调节按键、DS18B20 数据线、4 路 LED 以及八位数码管接口,便于在开发板上观察时钟、日期和各功能模式的运行状态。

日历数字时钟多功能设计 Verilog Vivado 开发板验证图片 开发板1.png

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

工程包含 tb_calendar_digital_clock.v 顶层测试文件,以及 Vivado XSim 生成的仿真工程、波形数据库和 VCD 文件,可用于观察模式切换、时间计数、按键控制、倒计时、秒表及显示信号的时序变化。顶层还提供温度固定值、温度符号和仿真模型开关,便于在未连接真实 DS18B20 时进行功能仿真。

部分代码

以下展示顶层模块 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,

    // 秒表 10ms 计数上限。
    // 对于 50MHz 时钟,计满 499_999 共 500_000 个时钟周期,约等于 10ms。
    parameter integer STOPWATCH_TICK_CNT_MAX = 32'd499_999,

    // LED 流水灯 0.5 秒计数上限。
    // 对于 50MHz 时钟,计满 24_999_999 共 25_000_000 个时钟周期,约等于 0.5 秒。
    parameter integer LED_FLOW_CNT_MAX       = 32'd24_999_999,

    // 按键消抖计数上限。
    parameter integer DEBOUNCE_CNT_MAX       = 20'd999_999,

    // 温度模块仿真开关。
    // 0:真实例化 DS18B20 驱动
    // 1:使用固定温度模型,方便顶层仿真
    parameter integer TEMP_SIM_USE_MODEL     = 0,

    // 仿真温度值,单位是摄氏度的百分之一。
    // 例如 25.34 摄氏度写成 2534。
    parameter integer TEMP_SIM_CENTI         = 20'd2534,

    // 仿真温度符号位。
    // 0:正温度
    // 1:负温度
    parameter integer TEMP_SIM_SIGN          = 0
)
(
    input         clk_in,             // 50MHz 系统时钟
    input         rst_n,              // 低电平复位
    input         mode_key_n,         // 大功能模式切换键,低电平按下
    input         dis_switch_key_n,   // 时间/日期显示切换键,低电平按下
    input         hour_switch_key_n,  // 24/12 小时制切换键,低电平按下
    input         add_key1,           // 复用按键 1
    input         sub_key1,           // 复用按键 2
    input         add_key2,           // 复用按键 3
    input         sub_key2,           // 复用按键 4
    input         add_key3,           // 复用按键 5
    input         sub_key3,           // 复用按键 6
    inout         ds18b20_dq,         // DS18B20 数据线
    output [3:0]  led,                // 4 路板载 LED
    output [7:0]  sm_bit,             // 数码管位选
    output [7:0]  sm_seg              // 数码管段选
);

localparam [2:0] APP_MODE_CLOCK       = 3'd0;
localparam [2:0] APP_MODE_STOPWATCH   = 3'd1;
localparam [2:0] APP_MODE_COUNTDOWN   = 3'd2;
localparam [2:0] APP_MODE_TEMPERATURE = 3'd3;
localparam [2:0] APP_MODE_LED_FLOW    = 3'd4;

// -------------------------------------------------------------------------
// 一、按键消抖后的单周期脉冲信号
// -------------------------------------------------------------------------
wire mode_switch_pulse;
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;

// -------------------------------------------------------------------------
// 二、大功能模式控制信号
// -------------------------------------------------------------------------
wire [2:0] app_mode;

// 只有在"时间/万年历模式"下,日期/时间切换和 24/12 小时制切换才有效。
wire clock_dis_switch_pulse;
wire clock_hour_switch_pulse;

assign clock_dis_switch_pulse  = (app_mode == APP_MODE_CLOCK) ? dis_switch_pulse  : 1'b0;
assign clock_hour_switch_pulse = (app_mode == APP_MODE_CLOCK) ? hour_switch_pulse : 1'b0;

// -------------------------------------------------------------------------
// 三、时间/日期子模式控制
// 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;

// -------------------------------------------------------------------------
// 五、日期调整脉冲
// -------------------------------------------------------------------------
wire year_add_pulse;
wire year_sub_pulse;
wire month_add_pulse;
wire month_sub_pulse;
wire day_add_pulse;
wire day_sub_pulse;

// -------------------------------------------------------------------------
// 六、秒表按键脉冲
// -------------------------------------------------------------------------
wire stopwatch_start_pulse;
wire stopwatch_stop_pulse;
wire stopwatch_reset_pulse;

// -------------------------------------------------------------------------
// 七、倒计时按键脉冲
// -------------------------------------------------------------------------
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

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

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

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