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

数字时钟FPGA设计Verilog Vivado

7小时前
47
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:数字时钟 FPGA 设计 Verilog Vivado

软件:Vivado

语言:Verilog

开发板/平台:Basys 3

功能介绍

本设计实现了一个基于 FPGA 的数字时钟系统,采用 Verilog 编写,在 Vivado 环境下完成工程搭建、仿真、综合实现和 bit 文件生成。系统主要功能包括小时、分钟、秒钟计时显示,按键设置时间,确认设置,以及在时分秒设置项之间切换。

顶层模块 digital_clock 面向 Basys 3 开发板接口设计,输入端包含 100MHz 系统时钟和三个板载按键,输出端包含 8 位 LED、两组数码管段选和两组数码管位选。数码管用于显示当前时间信息,LED 用于输出 PWM 控制效果,适合用于 FPGA 数字系统课程设计、计时器实验、按键消抖实验和数码管动态扫描实验。

工程结构按功能模块划分,包含分频、计时、按键消抖、数码管显示、占空比控制和 PWM 输出等部分。各模块之间通过清晰的时钟、控制信号和时间数据连接,便于阅读、修改和二次扩展,例如调整显示格式、扩展按键功能或改变 PWM 控制策略。

运行环境

开发语言:Verilog

开发软件:Vivado

适配开发板:Basys 3

顶层模块:digital_clock

工程包含 Vivado 工程文件、Verilog 源码、Testbench、Basys 3 管脚约束文件以及已生成的实现结果文件。

设计思路

系统以 100MHz 输入时钟为基准,先通过分频模块产生 1Hz 秒脉冲,作为数字时钟计时更新的核心节拍。计时模块围绕时、分、秒三个计数量设计,并结合设置、确认、切换三个按键输入,实现正常走时与手动校时之间的状态切换。

按键部分采用独立消抖模块处理,BTNL、BTNR、BTNU 分别生成稳定的按键上升沿信号,避免机械按键抖动造成重复触发。这样顶层模块只需要接收消抖后的单脉冲控制信号,逻辑层次清晰,也便于在仿真和上板时定位按键相关问题。

显示部分由数码管动态扫描模块完成,将小时、分钟、秒钟数据送到两组数码管段选和位选端口进行显示。PWM 相关逻辑由占空比控制模块和 PWM 控制模块组成,占空比信号与当前小时信息相关联,最终将 PWM 波形同步输出到 8 位 LED,用于形成可观察的亮灭控制效果。

模块结构

顶层模块:digital_clock,负责连接时钟输入、按键控制、计时数据、数码管显示和 LED PWM 输出。

主要子模块包括:fenping 分频模块,用于产生 1Hz 时钟;jishi 计时模块,用于完成时分秒计数与设置控制;key_jitter 按键消抖模块,用于处理设置、确认和切换按键;display_num 数码管显示模块,用于完成时分秒数据显示和动态扫描;duty_ctrl 占空比控制模块,用于生成 PWM 占空比控制信号;PWM_ctrl PWM 控制模块,用于输出 PWM 波形。

开发板验证

工程包含 Basys 3 开发板对应的管脚约束文件,按键、LED 与数码管接口均已完成约束分配,可用于 Vivado 综合、实现和生成 bit 文件后进行上板验证。

开发板验证图片展示了实物运行效果,数字时钟可在 Basys 3 板载数码管上显示时、分、秒信息,并通过按键完成时间设置、确认以及时分秒切换操作。LED 端口输出 PWM 波形状态,可结合时钟运行状态观察亮灭变化。

演示视频

配套演示视频展示了数字时钟在开发板上的运行效果,可直观看到数码管显示、按键设置和 LED 输出状态,便于下载前了解工程实际功能。

演示视频请点击左下角阅读原文查看。

仿真图/仿真说明/设计文档图片

设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、管脚分配、Testbench 和仿真图,可用于了解工程搭建流程、模块连接关系和仿真验证方式。

仿真工程中包含 test_bench.v 和 Vivado XSIM 相关仿真结果文件,可作为学习数字时钟计时逻辑、按键控制流程和数码管显示逻辑的参考。

部分代码

以下展示顶层模块 digital_clock 的部分代码,完整源码请下载压缩包查看。

module digital_clock(
input clk_100M,
input BTNL,//设置时间
input BTNR,//确认
input BTNU,//设置时分秒
//PWM输出
output[7:0] led,
//数码管显示
output   [7:0] dig_led_1,//数码管段选
output   [3:0] wei_led_1,//数码管位选
output   [7:0] dig_led_2,//数码管段选
output   [3:0] wei_led_2//数码管位选
    );
wire set_time_key;//设置时间
wire confirm_key;//确认
wire change_time_key;//设置时分秒
wire clk_1Hz;
wire [6:0] duty;//占空比控制信号,最大100
wire [7:0] hour_time;//时
wire [7:0] minute_time;//分
wire [7:0] second_time;//秒
wire PWM_wave;
key_jitter key_set_time_key(
     . clkin(clk_100M),
     . key_in(BTNL),//输入
	 . key_posedge(set_time_key),//消抖后按键上升沿
	 . key_negedge(),//消抖后按键下降沿
     . key_value()//消抖后按键
);

key_jitter key_confirm_key(
     . clkin(clk_100M),
     . key_in(BTNR),//输入
	 . key_posedge(confirm_key),//消抖后按键上升沿
	 . key_negedge(),//消抖后按键下降沿
     . key_value()//消抖后按键
);

key_jitter key_change_time_key(
     . clkin(clk_100M),
     . key_in(BTNU),//输入
	 . key_posedge(change_time_key),//消抖后按键上升沿
	 . key_negedge(),//消抖后按键下降沿
     . key_value()//消抖后按键
);

fenping i_fenping(
. clk_100M(clk_100M),
. clk_1Hz(clk_1Hz)
);

jishi i_jishi(
. clk_100M(clk_100M),
. clk_1Hz(clk_1Hz),
. set_time_key(set_time_key),//设置时间
. confirm_key(confirm_key),//确认
. change_time_key(change_time_key),//设置时分秒
. hour_time(hour_time),//时
. minute_time(minute_time),//分
. second_time(second_time)//秒
);

display_num i_display_num(
. clk(clk_100M),
. duty(duty),
. hour_time(hour_time),//时
. minute_time(minute_time),//分
. second_time(second_time),//秒
. dig_led_1(dig_led_1),
. wei_led_1(wei_led_1),
. dig_led_2(dig_led_2),
. wei_led_2(wei_led_2)
);

//占空比控制模块
duty_ctrl i_duty_ctrl(
. clk_100M(clk_100M),//输入100MHz
. hour_time(hour_time),//时
. duty(duty)
);

//PWM波控制模块
PWM_ctrl i_PWM_ctrl(
. clk_100M(clk_100M),//输入100MHz
. duty(duty),//占空比控制信号,最大100
. PWM_wave(PWM_wave)//输出占空比
);

assign led={PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave,PWM_wave};

endmodule

代码获取:点击【来源:www.hdlcode.com

相关推荐

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

本站代码库拥有大量 Verilog/VHDL的FPGA代码资源:hdlcode.com。代码有详细注释、演示视频、仿真图等资料,适合入门学习

微信公众号