流水灯 FPGA 设计 Verilog Vivado
名称:流水灯 FPGA 设计 Verilog Vivado
软件:Vivado
语言:Verilog
功能介绍
本设计实现一个 8 位 LED 流水灯控制系统,顶层模块为 led_top,输入包括系统时钟 clk 和低有效复位 rst_n,输出为 8 位 led 信号。系统通过分频模块产生固定节拍 tick,再由 LED 控制模块根据 tick 推动灯效状态变化,实现按节奏步进的流水灯显示效果。 工程采用模块化 Verilog 结构,适合用于 FPGA 入门实验、时钟分频练习、LED 外设控制以及 Vivado 工程流程学习。设计重点覆盖顶层例化、参数化分频、复位控制、时序逻辑状态更新和 Testbench 仿真验证,便于学习者理解从 RTL 编写到仿真观察的完整过程。 顶层参数 DIVIDE 默认设置为 50_000_000,用于将输入时钟转换为约 1Hz 的单周期 tick 脉冲。实际使用时可根据板载时钟频率或仿真速度调整该参数,从而改变 LED 流水切换速度。
运行环境
开发软件:Vivado 设计语言:Verilog 工程类型:Vivado FPGA 工程 主要文件包括 led_top.v、clk_divider.v、led_controller.v 和 led_top_tb.v,工程中包含行为仿真相关文件,可用于查看整体仿真、分频模块和 LED 控制模块的运行效果。
设计思路
系统采用“时钟分频 + LED 花型控制”的设计思路。顶层 led_top 只负责端口组织和子模块连接,将时钟节拍生成与 LED 输出控制拆分为两个独立模块,降低模块耦合度,也方便单独理解和调试。 clk_divider 模块根据参数 DIVIDE 对输入时钟进行计数,当计数达到设定周期后输出一个单周期 tick 脉冲。该 tick 不直接替代系统时钟,而是作为 LED 控制模块的节拍使能信号,这种写法能让核心逻辑仍然工作在同一个 clk 时钟域下,结构更清晰,也更符合常见 FPGA 同步设计习惯。 led_controller 模块在复位后初始化 LED 状态,并在每次 tick 到来时更新 led[7:0] 输出。通过将 LED 状态变化集中在控制模块中,后续若需要调整流水方向、增加花型或扩展显示模式,只需要修改控制逻辑,不影响分频器和顶层连接。
模块结构
顶层模块:led_top 分频模块:clk_divider,负责将输入时钟转换为周期性 tick 脉冲。 LED 控制模块:led_controller,负责根据 tick 节拍更新 8 位 LED 输出花型。 测试模块:led_top_tb,用于对顶层设计进行行为仿真。
演示视频
包含流水灯效果演示视频,可用于直观看到 LED 按节拍变化的运行表现。
演示视频请关注公众号后获取对应资料查看。
仿真图/仿真说明/设计文档图片
设计文档包含工程文件、程序文件、程序编译、RTL 图、Testbench、整体仿真图、分频模块仿真说明以及 LED 控制模块相关内容。仿真部分可用于观察 tick 节拍产生过程、复位后的 LED 输出变化,以及顶层模块中分频器与 LED 控制器之间的连接关系。
部分代码
以下展示顶层模块led_top的部分代码,完整代码可关注下方公众号卡片获取。
module led_top #(parameter DIVIDE = 50_000_000) ( input clk, input rst_n, output [7:0] led ); // 分频器输出的 1Hz 单周期脉冲 wire tick; // 实例化分频器:将 clk 转换为 1Hz tick clk_divider #(.DIVIDE(DIVIDE)) u_div ( .clk(clk), .rst_n(rst_n), .tick(tick) ); // 实例化 LED 控制器:根据 tick 触发花型步进 led_controller u_led_ctrl ( .clk(clk), .rst_n(rst_n), .tick(tick), .led(led) ); endmodule
代码获取:点击下方公众号卡片
