
名称复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado软件Vivado语言Verilog功能介绍本设计是一个基于 FPGA 的 Verilog 综合实验工程主要实现按键输入处理、七段数码管显示、蜂鸣器控制以及单色视频/复合视频信号输出等功能。工程顶层模块为 test02面向 Vivado 开发环境适合用于学习 FPGA 外设综合控制、视频时序信号组织、按键消抖和板级 I/O 约束配置。 工程通过左右按键和复用按键作为人机输入内部完成复位同步、100us 定时节拍生成、按键消抖、按键优先编码等处理。输出端可驱动 8 位七段数码管段选与位选信号并提供 blink 闪烁控制和 buz 蜂鸣器输出便于在开发板上观察交互状态。 视频输出部分提供 cv_lum、cv_chrom、cv_sync、cv_sync_h、cv_sync_v 等信号接口配合字符、字库访问、棋盘格/对角线等视频图形相关模块可用于复合视频显示控制实验。该工程不仅包含核心 RTL 模块也包含 testbench、约束文件、Vivado 工程结果和板级验证材料适合课程设计、实验报告和二次开发参考。运行环境开发语言Verilog。 开发软件Vivado。 工程包含 Vivado 项目文件、RTL 源码、testbench、XDC 管脚约束、bit/mcs 配置结果以及仿真脚本相关文件。约束文件中包含 Cmod A7 相关 master/config 约束适合在对应硬件环境下进行综合、实现、生成 bitstream 和上板测试。设计思路设计以 test02 顶层模块为核心将人机输入、七段数码管显示、蜂鸣器提示和复合视频输出整合在同一 FPGA 工程中。外部输入包括系统时钟、复位、左右按键以及复用按键输入输出侧包括数码管段选/位选、闪烁信号、蜂鸣器信号以及 CV 视频亮度、色度、同步、水平同步和垂直同步相关端口。 系统先对原始复位信号进行同步处理避免异步复位直接进入后级逻辑造成时序不稳定。随后通过可重载倒计数器产生 100us 采样节拍用于按键消抖等低速外设逻辑。工程中设置 turbosim 输入用于在仿真场景下缩短部分计数周期提高仿真观察效率。 按键部分采用独立消抖模块处理左右按键同时通过 mbutton 模块读取复用按键再将普通按键和复用按键组合成统一的按键向量。优先编码模块 prio_enc 对按键状态进行编码便于后级控制逻辑使用单一优先级结果判断当前有效输入。 显示与输出部分由 display_7s、buzzer02、cv_core、cv_control、cv_char、cv_charrom、cv_checkers、cv_diagonal 等模块协同完成。七段数码管用于显示固定测试内容和状态信息蜂鸣器根据控制逻辑输出音调复合视频相关模块负责字符、图案和同步信号生成适合作为 FPGA 视频输出、外设控制和板级验证的综合练习工程。模块结构顶层模块test02负责连接时钟复位、按键输入、数码管、蜂鸣器和复合视频输出接口。 主要功能模块包括synchroniser_3s 复位同步counter_down_rld 定时节拍debounce 按键消抖mbutton 复用按键读取prio_enc 按键优先编码display_7s 七段数码管动态扫描显示buzzer02 蜂鸣器驱动cv_core/cv_control 视频核心控制cv_char/cv_charrom/cv_charrom_access 字符与字库访问cv_checkers/cv_diagonal 图形显示辅助mux_8ch、counter_triangular 等通用逻辑模块。 工程还包含 fpga_wrapper_test02、clkgen_cmod_a7 等板级封装和时钟相关模块以及 tb01_test02 测试平台文件用于配合 Vivado 仿真和工程实现。开发板验证工程配套 Cmod A7 相关管脚约束文件并提供开发板实物与上板测试画面可用于核对时钟、复位、按键、七段数码管、蜂鸣器以及复合视频输出等外设连接。约束文件覆盖主工程 I/O 分配适合在 Vivado 完成综合、实现和 bitstream 生成后进行实际硬件验证。 上板验证重点包括按键输入响应、数码管显示内容、蜂鸣器输出以及 CV 视频同步/亮度/色度相关信号的外设表现。工程中同时保留 bit/mcs 等配置结果便于参考实现流程与硬件调试。演示视频提供仿真视频和演示视频可直观看到工程运行与验证过程。视频内容适合在下载前了解工程现象并在复现实验时对照按键、显示、蜂鸣器和视频输出相关表现。演示视频请关注公众号后获取对应资料查看。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、管脚分配、Testbench 和仿真图等部分。配套文档图片可用于查看工程结构、编译过程、RTL 连接关系、管脚约束分配以及仿真波形说明便于理解从源码到仿真验证、再到板级实现的完整流程。部分代码以下展示顶层模块test02的部分代码完整代码可关注下方公众号卡片获取。module test02 ( input wire clk, input wire reset, input wire turbosim, input wire [1:0] buttons, // {L, R} input wire muxpb, // multiplexed pushbutton output wire [7:0] d7_cathodes_n, // {DP,CG,CF,CE,CD,CC,CB,CA} output wire [7:0] d7_anodes, output wire blink, output wire buz, output wire [2:0] cv_lum, output wire cv_chrom, output wire cv_sync, output wire cv_sync_h, output wire cv_sync_v ); include display_7s.vh include buzzer02.vh wire reset_s; // synchronised reset signal wire clk_ev_100us; wire button_l; // debounced wire button_r; // debounced wire [7:0] mbuttons; wire [79:0] d7_content0; wire [BUZZER_NOTE_NOB-1:0] buzzer_note; wire [7:0] buttons_all; wire [2:0] buttons_prio; wire buttons_active; wire [7:0] cv_ctrl; // Assign display contents (blink, mode, data) // tESt02 assign d7_content0{8b0000_0000,8b0000_0011, 16h0, d7_t, d7_E, d7_S, d7_t, 8h0, 8h2}; // Synchronise the incoming raw reset signal synchroniser_3s synchroniser_3s_reset ( .clk(clk), .reset(1b0), .en(1b1), .in(reset), .out(reset_s) ); // Instantiate a down counter to provide 100us time base (for sampling of button, debounce) counter_down_rld #( .COUNT_MAX(9_999), .COUNT_MAX_TURBOSIM(9) ) counter_100us ( .clk(clk), .reset(reset_s), .turbosim(turbosim), .rld(1b0), .underflow(clk_ev_100us) ); // Instantiate a 7-segment display driver display_7s #( .PRESCALER_RLD(99_999), .BLINK_RLD(499) ) display_7s ( .clk(clk), .reset(reset_s), .turbosim(turbosim), .en(1b1), .dis_data(d7_content0[63:0]), .dis_mode(d7_content0[71:64]), .dis_blink(d7_content0[79:72]), .negate_a(1b0), // were using non-negating external drivers for anodes (npn emitter follower) .cathodes_n(d7_cathodes_n), .anodes(d7_anodes), .blink(blink) ); //Instantiate debounce for buttons[1] (left) debounce debounce_l ( .clk(clk), .reset(reset_s), .en(clk_ev_100us), .signal_in(buttons[1]), .signal_debounced(button_l) ); //Instantiate debounce for buttons[0] (right) debounce debounce_r ( .clk(clk), .reset(reset_s), .en(clk_ev_100us), .signal_in(buttons[0]), .signal_debounced(button_r) ); // multiplexed buttons mbutton #(.MUX_NOB(8)) mbutton ( .clk(clk), .reset(reset_s), .muxin(d7_anodes), .pbin(muxpb), .buttons(mbuttons) ); // assign all buttons to a vector assign buttons_all{mbuttons[5:0],button_l,button_r}; // prio encoder of button vector prio_enc #(.INPUT_NOB(8)) prio_enc_button ( .in(buttons_all), .out(buttons_prio), .out_active(buttons_active) ); // Instantiate a buzzer buzzer02 #(.BUZZER_RLD_1us(99) ) buzzer02 // ... 以下代码略完整源码请下载压缩包查看代码获取点击下方公众号卡片