用FPGA在DE2-115开发板上驱动VGA显示器:从时序理解到彩色条纹生成(Quartus II 工程分享)
在DE2-115开发板上实现VGA彩色条纹显示从时序解析到硬件调试全指南第一次接触FPGA驱动VGA显示时最让我困惑的不是Verilog语法而是那些看似简单的时序参数背后隐藏的硬件交互逻辑。本文将带你用DE2-115开发板完成一个经典的彩色条纹生成实验重点解决三个核心问题如何将VGA时序参数转化为可执行的硬件描述如何正确配置ADV7123视频DAC芯片以及调试过程中可能遇到的坑如何规避1. VGA显示核心时序参数与硬件接口的深度解析VGA显示的本质是一场精密的时序舞蹈。以640x48060Hz模式为例每个时钟周期25MHz需要精确控制parameter H_SYNC 10d96, // 行同步脉冲宽度(像素数) H_BACK 10d40, // 行后沿 H_VALID 10d640, // 行有效数据 H_FRONT 10d8; // 行前沿这些参数决定了DE2-115开发板上的ADV7123芯片何时接收RGB数据。实际调试时我用示波器捕获到的信号波形显示信号阶段像素时钟数对应物理时间(μs)同步脉冲963.84后沿401.60有效数据64025.60前沿80.32注意DE2-115的ADV7123芯片要求RGB数据在时钟上升沿稳定因此Verilog代码中必须使用寄存器输出2. Quartus II工程搭建从PLL配置到引脚约束创建工程时最容易出错的是时钟配置。DE2-115板载50MHz晶振需要通过PLL生成精确的25MHz VGA像素时钟pll clk_gen_inst ( .areset(~sys_rst_n), .inclk0(sys_clk), // 50MHz输入 .c0(vga_clk), // 25MHz输出 .locked(locked) );引脚分配是另一个关键点特别是ADV7123相关信号必须严格对应set_location_assignment PIN_A12 -to vga_clk set_location_assignment PIN_B12 -to rgb[23] set_location_assignment PIN_C12 -to rgb[22] ...我在首次尝试时忽略了vga_clk_dis信号ADV7123的时钟使能导致屏幕无显示。正确的配置应该是assign vga_clk_dis ~vga_clk; // 生成相位相反的时钟信号3. Verilog实现分层模块设计与调试技巧3.1 时序控制模块(vga_ctrl)这个模块的核心是两个计数器行计数器和场计数器。调试时发现常见的两个问题计数器溢出未正确处理always (posedge vga_clk) begin if (cnt_h H_TOTAL-1) cnt_h 0; else cnt_h cnt_h 1; if (cnt_h H_TOTAL-1) begin if (cnt_v V_TOTAL-1) cnt_v 0; else cnt_v cnt_v 1; end end有效区域判断错误导致图像偏移assign rgb_valid (cnt_h H_SYNCH_BACK) (cnt_h H_SYNCH_BACKH_VALID) (cnt_v V_SYNCV_BACK) (cnt_v V_SYNCV_BACKV_VALID);3.2 图像生成模块(vga_pic)彩色条纹的实现逻辑看似简单但优化空间很大。初始版本使用case语句always (posedge vga_clk) begin case (pix_x[9:7]) // 取高3位实现80像素宽条纹 3b000: pix_data WHITE; 3b001: pix_data RED; // ...其他颜色 endcase end优化后版本采用查找表(LUT)方式节省逻辑资源reg [23:0] color_rom [0:7]; initial begin color_rom[0] WHITE; color_rom[1] RED; // ...初始化其他颜色 end assign pix_data color_rom[pix_x[9:7]];4. 硬件调试实战从无显示到完美图像的排查指南当第一次烧录程序后屏幕无显示时建议按照以下步骤排查时钟检查用示波器测量ADV7123的CLK引脚应为25MHz确认vga_clk_dis信号存在且相位相反同步信号验证HSYNC频率应为31.47kHz周期≈31.77μsVSYNC频率应为59.94Hz周期≈16.68ms数据通路测试// 临时修改图像生成模块输出测试图案 assign pix_data {pix_x[7:0], pix_y[7:0], 8h00};ADV7123配置确认检查开发板上J6跳线帽设置应选择3.3V供电测量VREF电压典型值1.23V最终成功时屏幕上应显示8种颜色的垂直条纹每种颜色宽度均匀。若出现以下现象条纹宽度不均 → 检查pix_x计数逻辑颜色错位 → 确认RGB引脚分配顺序画面抖动 → 检查PLL锁定信号和复位时序通过SignalTap II嵌入式逻辑分析仪捕获的内部信号显示实际有效数据窗口比理论值小约2个时钟周期这是由ADV7123的采样保持特性导致的。解决方法是在Verilog代码中将有效区域缩小2个像素assign rgb_valid (cnt_h H_SYNCH_BACK2) (cnt_h H_SYNCH_BACKH_VALID-2);