多功能数字时钟 FPGA 设计 Verilog Vivado

多功能数字时钟 FPGA 设计 Verilog Vivado 名称多功能数字时钟 FPGA 设计 Verilog Vivado软件Vivado语言Verilog功能介绍本设计实现了一个多功能数字时钟 FPGA 系统顶层模块为 clock输入包含 100MHz 系统时钟、复位信号以及模式切换、确认、选择、加减调节等按键信号输出包含蜂鸣器 beep 信号。整体功能围绕数字计时、时间调整、闹钟设置和提示输出展开适合用于 FPGA 数字钟、按键控制状态机、分频计时和闹钟逻辑等课程设计或工程学习。 工程内部通过分频模块把输入时钟转换为秒脉冲、2Hz、4Hz 等控制节拍为计时器、控制器、时间调整和闹钟相关模块提供基础时序。用户可以通过 switch_mode、switch_enter、switch_pick、switch_up、switch_down 等输入完成不同工作模式下的选择与调整控制器根据按键状态输出模式信号和使能信号协调各个功能模块工作。 设计还包含 clock_set、time_adjust、timer、hour_alarm、clock_alarm、clock_music、output_pick 等功能模块能够体现较完整的模块化数字系统设计思路。配套 testbench 覆盖 clock_set、controller、time_adjust、clock_alarm 等模块便于在 Vivado 仿真环境中观察关键逻辑行为。运行环境开发语言Verilog 开发软件Vivado 工程文件clock.xpr 仿真环境Vivado Simulator / xsim包含 clock_set_test、controller_test、time_adjust_test、clock_alarm_test 等 testbench 文件。设计思路系统采用顶层集成加功能模块分层的设计方式。clock 作为顶层模块负责连接外部时钟、复位、按键输入和蜂鸣器输出并在内部例化控制器、计时器、时间调整、闹钟设置、整点提示、分频等模块。各子模块之间通过小时、分钟、秒、模式、使能、进入信号等内部连线进行数据和控制交互使系统结构清晰便于单独仿真与后续扩展。 时钟处理部分先由顶层对 100MHz 输入时钟进行基础分频形成 25MHz 等内部时钟再由 fre_divider 进一步生成秒脉冲、2Hz 和 4Hz 等低频节拍。秒脉冲用于正常计时2Hz 节拍用于按键调整和模式控制等低速逻辑4Hz 等节拍可用于显示选择或提示类逻辑。通过这种方式系统把高速 FPGA 时钟转换为适合人机交互和时间计数的稳定时序。 控制部分由 controller 根据模式键和确认键输出当前工作模式、时间调整使能、调整确认和闹钟设置使能等信号。timer 模块负责维护当前时分秒计数并能接收 time_adjust 输出的调整值clock_set 模块负责设置闹钟小时和分钟hour_alarm、clock_alarm、clock_music 等模块负责根据当前时间和设置时间产生提示或蜂鸣相关输出。整体设计重点在于多模块协同、按键模式控制和计时逻辑的组合应用。 仿真设计按模块划分分别为 clock_set、controller、time_adjust、clock_alarm 等关键功能提供 testbench。这样的验证方式可以先确认单个模块的状态变化、按键响应和输出逻辑再结合顶层工程理解完整数字时钟系统的工作流程。模块结构顶层模块clock 主要功能模块包括 fre_divider分频模块产生秒脉冲、2Hz、4Hz 等时钟节拍。 controller控制模块根据模式、确认等按键产生工作模式和控制使能信号。 timer计时模块维护当前小时、分钟、秒计数并支持调整后的时间写入。 time_adjust时间调整模块根据选择键、加减键调整时分秒。 clock_set闹钟设置模块用于设置闹钟小时和分钟。 hour_alarm整点或时间提示相关模块结合当前计时信号产生提示输出。 clock_alarm闹钟判断相关模块。 clock_music蜂鸣或音乐提示相关模块。 output_pick输出选择相关模块。 仿真模块包括clock_set_test、controller_test、time_adjust_test、clock_alarm_test。演示视频提供仿真演示视频可用于查看工程仿真过程和关键功能演示效果文件名为“仿真视频.mp4”。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片设计文档内容围绕 clock_set、Controller、time_adjust 等模块展开包含对应 testbench 说明和仿真图可作为理解模块输入输出关系、按键控制流程和仿真验证方法的参考。 仿真文件覆盖 clock_set_test、controller_test、time_adjust_test、clock_alarm_test 等模块适合在 Vivado 中分别运行观察闹钟设置、控制状态、时间调整和闹钟逻辑的时序变化。部分代码以下展示顶层模块clock的部分代码完整代码可关注下方公众号卡片获取。module clock(clk_100m, rst,switch_down, switch_enter,switch_mode, switch_pick,switch_up, beep);//?????100MHz input clk_100m; input rst;//??? input switch_enter;//?????? input switch_mode;//???????????????????? input switch_pick;//???????????????? input switch_up;//???? input switch_down;//???? output beep;//??? wire [7:0] XLXN_4;//??????????????? wire [7:0] XLXN_5; wire [7:0] XLXN_6; wire [7:0] XLXN_7; wire [7:0] XLXN_8; wire [7:0] XLXN_9; wire [7:0] XLXN_10; wire [7:0] XLXN_11; wire [2:0] XLXN_14; wire XLXN_15; wire XLXN_16; wire XLXN_17; wire XLXN_19; wire [5:0] XLXN_20; wire [5:0] XLXN_21; wire [5:0] XLXN_22; wire XLXN_24; wire [5:0] XLXN_33; wire [5:0] XLXN_34; wire XLXN_36; wire [5:0] XLXN_37; wire [5:0] XLXN_39; wire [5:0] XLXN_40; wire XLXN_50; wire XLXN_51; reg clk_25m; reg clk_50m; wire switch_up; assign switch_up1; reg [1:0] div;//??? always (posedge clk_100m or negedge rst) begin if(!rst) div2b00; else divdiv1; end always (posedge clk_100m or negedge rst) begin if(!rst) clk_25m0; else if(div2b00||div2b10) clk_25m~clk_25m; else clk_25mclk_25m; end controller XLXI_2 (.clk_2hz(XLXN_24), .rst(rst), .switch_enter(switch_enter), .switch_mode(switch_mode), .clock_set(XLXN_15), .mode(XLXN_14[2:0]), .time_adjust_enable(XLXN_16), .time_adjust_enter(XLXN_17) );//???? timer XLXI_3 (.clk_sec(XLXN_19), .rst(rst), .time_adjust_enter(XLXN_17), .time_adjust_hou(XLXN_22[5:0]), .time_adjust_min(XLXN_21[5:0]), .time_adjust_sec(XLXN_20[5:0]), .timer_hou(XLXN_33[5:0]), .timer_min(XLXN_34[5:0]), .timer_sec(XLXN_37[5:0]) );//???? time_adjust XLXI_4 (.clk_2hz(XLXN_24), .rst(rst), .switch_down(switch_down), .switch_pick(switch_pick), .switch_up(switch_up), .time_adj_enable(XLXN_16), .hour(XLXN_22[5:0]), .min(XLXN_21[5:0]), .sec(XLXN_20[5:0]) );//?????? clock_set XLXI_5 (.clk_2hz(XLXN_24), .clock_set(XLXN_15), .rst(rst), .switch_down(switch_down), .switch_pick(switch_pick), .switch_up(switch_up), .clock_hour(XLXN_40[5:0]), .clock_min(XLXN_39[5:0]) );//?????? hour_alarm XLXI_6 (.clk_sec(XLXN_19), .clk_25m(clk_25m), .rst(rst), .timer_min(XLXN_34[5:0]), .timer_sec(XLXN_37[5:0]), .hour_alarm(XLXN_51) );//?????? fre_divider XLXI_9 (.clk_25m(clk_25m), .rst(rst), .clk_sec(XLXN_19), .clk_2hz(XLXN_24), .clk_4hz(XLXN_36) // ... 以下代码略完整源码请下载压缩包查看代码获取点击下方公众号卡片