名称:电子万年历 FPGA 设计 Verilog Quartus FPGA代码工程源码下载
软件:Quartus
语言:Verilog
开发板/平台:Cyclone IV FPGA开发板
功能介绍
本设计实现一个基于 FPGA 的电子万年历系统,使用 Verilog 语言编写,工程环境为 Quartus。系统以 FPGA 时钟为基础完成日期与时间计数,并通过数码管输出显示年月日、时分秒以及星期信息,适合用于 FPGA 数字系统设计、课程设计和 Verilog 时序逻辑综合练习。 系统支持两种显示内容切换:当显示切换信号为高电平时,数码管显示年月日;当显示切换信号为低电平时,数码管显示时分秒。星期信息由独立数码管输出,便于观察当前日期对应的星期状态。 设计还加入了手动调整功能。通过调整使能信号进入设置状态后,可分别对年/小时、月/分钟、日/秒以及星期进行按键调整。按键输入经过消抖和上升沿提取后再送入计时模块,降低机械按键抖动对计数逻辑的影响。
运行环境
开发语言:Verilog 开发软件:Quartus 顶层模块:calendar_top 主要工程:calendar_top.qpf、calendar_top.qsf 仿真文件:tb_calendar_top.v 目标验证平台:Cyclone IV FPGA开发板
设计思路
整体设计采用“顶层连接 + 计时控制 + 显示译码 + 按键消抖”的结构。顶层模块 calendar_top 负责连接外部时钟、复位、显示切换、调整使能、各路按键输入以及 7 位数码管输出,同时例化按键消抖模块、万年历计时模块和显示模块,使各功能边界清晰,便于综合、仿真和移植。 按键部分由 key_jitter 模块完成消抖处理,并输出按键有效脉冲。年/小时、月/分钟、日/秒、星期调整按键分别进入独立的消抖实例,顶层将消抖后的脉冲送入 calendar 计时模块,避免直接使用原始机械按键信号引起重复触发。 calendar 模块承担万年历的核心计数与调整逻辑,输出年、月、日、时、分、秒和星期等数据。显示模式由 display_SW 控制,在日期显示模式下输出年月日,在时间显示模式下输出时分秒。调整使能 change_en 用于区分正常计时和人工设置状态。 显示部分由 display 模块完成数据到数码管输出的组织,将 calendar 模块输出的 BCD/数值信息映射到 HEX0 至 HEX6。该结构把计时逻辑与显示逻辑分离,后续如需修改显示位数、显示格式或切换到其他显示器件,也更容易定位相关代码。
模块结构
主要模块包括: calendar_top:顶层模块,连接时钟、复位、按键、显示切换信号和数码管输出,并完成各子模块例化。 calendar:万年历计时与调整控制模块,产生年、月、日、时、分、秒、星期等输出。 display:数码管显示模块,根据显示切换信号选择日期或时间内容,并驱动 HEX0 至 HEX6 输出。 key_jitter:按键消抖模块,将机械按键输入转换为稳定的按键脉冲。 tb_calendar_top:顶层仿真 Testbench,用于对 calendar_top 进行仿真验证。
开发板验证
工程包含面向 Cyclone IV FPGA开发板的管脚约束与分配文件,数码管、按键、时钟和复位等外设信号已按开发板资源进行约束。该设计可用于开发板下载验证,重点观察数码管日期/时间切换显示、按键调整年月日时分秒及星期等功能。
演示视频
配有演示视频,可直观看到电子万年历在 FPGA 开发板上的运行效果,包括数码管显示和按键交互过程。
仿真图/仿真说明/设计文档图片
设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、管脚分配、仿真图、Testbench、顶层仿真、控制模块、显示模块和按键模块等部分,可用于理解工程结构、仿真流程与模块连接关系。
部分代码
以下展示顶层模块 calendar_top 的部分代码,完整源码请下载压缩包查看。
module calendar_top( input sysclk,//时钟20M input reset_p,//高电平复位--键1 input change_en,//调整使能信号,为高电平表示调整信号,低电平不调整--键2 input display_SW,//显示切换开关,高电平显示年月日,低电平显示时分秒--键3 input year_hour_key,//年调整信号、小时调整信号--键4 input month_minute_key,//月调整信号、分钟调整信号--键5 input day_second_key,//日调整信号、秒调整信号--键6 input week_key,//星期调整--键7 output [3:0] HEX0,//数码管 output [3:0] HEX1,//数码管 output [3:0] HEX2,//数码管 output [3:0] HEX3,//数码管 output [3:0] HEX4,//数码管 output [3:0] HEX5,//数码管 output [3:0] HEX6 //数码管 星期 ); wire [7:0] year_l_O ; wire [7:0] month_O ; wire [7:0] day_O ; wire [7:0] hour_O ; wire [7:0] minute_O ; wire [7:0] second_O ; wire [3:0] week_O ; wire reset_n; wire year_hour_p;//年调整信号、小时调整信号--键4 wire month_minute_p;//月调整信号、分钟调整信号--键5 wire day_second_p;//日调整信号、秒调整信号--键6 wire week_p;//星期调整--键7 assign reset_n =~ reset_p; //按键消抖 key_jitter i0_key_jitter( . clkin(sysclk), . key_in(year_hour_key),//输入 . key_p(year_hour_p)//按键上升沿 ); key_jitter i1_key_jitter( . clkin(sysclk), . key_in(month_minute_key),//输入 . key_p(month_minute_p)//按键上升沿 ); key_jitter i2_key_jitter( . clkin(sysclk), . key_in(day_second_key),//输入 . key_p(day_second_p)//按键上升沿 ); key_jitter i3_key_jitter( . clkin(sysclk), . key_in(week_key),//输入 . key_p(week_p)//按键上升沿 ); //万年历计时模块 calendar i_calendar ( . sysclk(sysclk), . reset_n(reset_n), . change_en(change_en),//调整使能信号,为高电平表示调整信号,低电平不调整 . display_SW(display_SW),//显示切换开关,高电平显示年月日,低电平显示时分秒 . year_hour_key(year_hour_p),//年调整信号、小时调整信号 . month_minute_key(month_minute_p),//月调整信号、分钟调整信号 . day_second_key(day_second_p),//日调整信号、秒调整信号 . week_key(week_p),//星期 . week_O (week_O), . year_l_O (year_l_O), . month_O (month_O), . day_O (day_O), . hour_O (hour_O), . minute_O (minute_O), . second_O (second_O) ); //数码管显示模块 display i_display( . sysclk(sysclk),//时钟50M . reset_n(reset_n),//低电平复位 . display_SW(display_SW),//显示切换开关,高电平显示年月日,低电平显示时分秒 . year_l_O (year_l_O), . month_O (month_O), . day_O (day_O), . hour_O (hour_O), . minute_O (minute_O), . second_O (second_O), . week_O (week_O), . HEX0(HEX0),//数码管 . HEX1(HEX1), . HEX2(HEX2), . HEX3(HEX3), . HEX4(HEX4), . HEX5(HEX5), . HEX6(HEX6) ); endmodule
代码文件:查看原文
71