多功能数字时钟 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_up=1;
reg [1:0] div;//???
always @(posedge clk_100m or negedge rst) begin
if(!rst)
div<=2'b00;
else
div<=div+1;
end
always @(posedge clk_100m or negedge rst) begin
if(!rst)
clk_25m<=0;
else if(div==2'b00||div==2'b10)
clk_25m<=~clk_25m;
else
clk_25m<=clk_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)
// ... 以下代码略,完整源码请下载压缩包查看
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 多功能数字时钟 FPGA 设计 Verilog Vivado
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 多功能数字时钟 FPGA 设计 Verilog Vivado