基于FPGA的VGA图像显示:时序参数怎么算、Verilog代码怎么写 时间:2026-10-10 来源:小宸 浏览:79 VGA图像显示是FPGA入门阶段最经典的项目,也是面试高频考点。但真正动手时,大多数人卡在两个地方:像素时钟频率没算对、帧缓冲区架构没想通。下面把这两块拆清楚。
以640×480@60Hz为例,像素时钟约25.175MHz,通常用PLL从板载主时钟(如100MHz)分频得到。
时序分三个维度理解:
水平方向:每行共768个像素时钟,其中前640为有效显示区,后128为消隐区(含前肩、Hsync脉冲、后肩)。
垂直方向:每帧共561行,前480为有效区,后81为消隐区(含Vsync脉冲)。
像素时钟周期:约40ns,每个时钟输出一个RGB像素。
Verilog核心就是一个二维计数器:
列计数器(0→767)溢出时拉低Hsync一个周期;
行计数器(0→560)溢出时拉低Vsync两行;
只有"列<640 且 行<480"时,RGB输出帧缓冲区数据,否则输出全黑。
一个容易踩的坑:消隐区不是"浪费",CRT/液晶显示器需要这段时间做水平回扫和垂直回扫。省略消隐区,画面会直接撕裂。
图像不是逐像素"算"出来的,而是从帧缓冲区(Frame Buffer) 中"读"出来的。
容量计算:640×480×16bit(5-6-5色)≈ 1.2MB。片内BRAM通常只有几百KB到几MB,超容量就外挂SDRAM或走PS端DDR(如ZYNQ的MIG接口)。
数据流路径:
1. 像素时钟驱动读地址从0递增到604799,循环往复;
2. 读出的RGB值直接锁存到VGA的R、G、B输出引脚;
3. 写地址由图像源决定——PS端通过AXI写新帧、FPGA内部逻辑生成滚动图案、或摄像头采集数据灌入。
关键设计:写和读必须分离,用双缓冲(ping-pong)结构。奇数帧写A区、读B区,偶数帧反过来,切换在Vsync下降沿完成。否则观众看到的是"上半屏新画面、下半屏旧画面"的撕裂效果。
如果你用的是Xilinx器件,可以用UltraScale的URAM或外部DDR4,配合AXI DMA把PS端图像数据批量搬到帧缓冲区,PL端只管按像素时钟读,互不阻塞。
VGA显示的本质 = 二维时序计数器 + 帧缓冲区读取。把这两块吃透,换分辨率、换色彩空间、加滚动效果只是改参数。
思考题:把分辨率换成1024×768@75Hz,像素时钟大约多少?帧缓冲需要多大?如果片内BRAM装不下,你会怎么设计PL与PS之间的数据通路?(欢迎点右下角会话窗口,把你的参数算法和方案思路发给我们,讲师帮你逐条过。)
宸极教育FPGA课程从时序基础一路讲到高速接口,21个实战项目覆盖VGA显示、以太网UDP、JESD204B DAC等企业级场景,全程直播带练,讲师逐行写代码、逐拍看波形。不确定自己该从哪个阶段切入?点击官网右下角会话窗口,把你的基础和卡点告诉客服,我们帮你规划最短路径,不浪费时间在"看了视频还是不会写"的循环里。