复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado

名称:复合视频显示与按键蜂鸣控制 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 等配置结果,便于参考实现流程与硬件调试。

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 开发板验证图片 开发板.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 开发板验证图片 上板测试.jpg

演示视频

提供仿真视频和演示视频,可直观看到工程运行与验证过程。视频内容适合在下载前了解工程现象,并在复现实验时对照按键、显示、蜂鸣器和视频输出相关表现。

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

设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、管脚分配、Testbench 和仿真图等部分。配套文档图片可用于查看工程结构、编译过程、RTL 连接关系、管脚约束分配以及仿真波形说明,便于理解从源码到仿真验证、再到板级实现的完整流程。

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image1.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image2.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image3.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image4.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image5.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image6.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image7.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image8.png

复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado 设计文档图片 image9.png

部分代码

以下展示顶层模块 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={8'b0000_0000,8'b0000_0011, 16'h0, d7_t, d7_E, d7_S, d7_t, 8'h0, 8'h2};

    // Synchronise the incoming raw reset signal
    synchroniser_3s synchroniser_3s_reset
    (
        .clk(clk),
        .reset(1'b0),
        .en(1'b1),
        .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(1'b0),
        .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(1'b1),
        .dis_data(d7_content0[63:0]),
        .dis_mode(d7_content0[71:64]),
        .dis_blink(d7_content0[79:72]),
        .negate_a(1'b0),            // we're 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
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 复合视频显示与按键蜂鸣控制 FPGA 设计 Verilog Vivado

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员