• 正文
  • 相关推荐
申请入驻 产业图谱

电子万年历FPGA 设计 Verilog Quartus

06/01 08:25
71
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:电子万年历 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

代码文件:查看原文

 

【来源:www.hdlcode.com

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录