日历数字时钟多功能设计 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 以及八位数码管接口,便于在开发板上观察时钟、日期和各功能模式的运行状态。
仿真图/仿真说明/设计文档图片
工程包含 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
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 日历数字时钟多功能设计 Verilog Vivado