2-DE10-Nano的HDMI彩条显示案例(分辨率可切换)—— VGA显示控制器模块设计

VGA显示控制器模块vga_generator.v(位于Demonstrations\FPGA\HDMI_TX\vpg_source路径下)可生成符合DMT(Display Monitor Timing 显示器时序)时序的视频信号。该模块的RTL Viewer视图如下:

该模块根据输入的时序参数生成VGA的行同步信号(vga_hs)、场同步信号(vga_vs)、数据有效信号(vga_de)以及24位真彩色(RGB888)数据(vga_r, vga_g, vga_b)。本案例利用该模块生成测试图案(彩条颜色渐变和边框)用于HDMI显示验证。

输入信号

clk:像素时钟PCLK输入。

reset_n:低电平有效的异步复位信号。

h_total:一行像素的总数(包括消隐区)。

h_sync:行同步脉冲的宽度(以像素数为单位)。

h_start:行有效数据开始的像素位置。

h_end:行有效数据结束的像素位置。

v_total:一帧的总行数(包括消隐区)。

v_sync:场同步脉冲的宽度(以行为单位)。

v_start:场有效数据开始的行位置。

v_end:场有效数据结束的行位置。

v_active_14,v_active_24, v_active_34:将像素有效显示区域分为4等分,每一部分显示一种颜色。

输出信号

vga_hs:行同步信号(低电平有效)。

vga_vs:场同步信号(低电平有效)。

vga_de:数据有效信号(高电平表示有效像素区域)。

vga_r,vga_g, vga_b:8位RGB颜色输出。

关键内部信号

h_count:水平像素计数器。

v_count:垂直行计数器。

pixel_x:当前行内的像素索引(用于颜色生成)。

h_act,v_act:行和场的有效区域标志。

color_mode:颜色模式控制信号(4位,分别代表4种颜色区域)。

boarder:边框标志(用于绘制白色边框)。

逻辑代码分析

1.水平控制逻辑(Horizontal Control)

水平控制信号对应时序如下:

  • 使用h_count计数像素位置,在达到h_total时归零。

  • 生成行同步信号vga_hs:当h_count >= h_sync且未到行末时,同步信号为高(同步脉冲结束),否则为低(同步脉冲期间)。

  • 控制行有效区域h_act:在h_start到h_end之间置位。

  • pixel_x在有效区域内递增,用于生成颜色渐变。

水平控制信号对应的Signaltap 波形如图,可见pixel_x信号比h_act信号延迟二拍。因为第 一拍h_act 变高,但 h_act_d 还是旧值(低电平);第二拍h_act 的高电平被锁存到 h_act_d 中,此时 h_act_d 变高电平,于是第三拍时pixel_x 值可以从0变1。

2.垂直控制逻辑(Vertical Control)

垂直控制信号对应时序如下:

  • 在每行结束时(h_max为真)更新v_count。

  • 生成场同步信号vga_vs:当v_count >= v_sync且未到帧末时,同步信号为高(同步脉冲结束),否则为低。

  • 控制场有效区域v_act:在v_start到v_end之间置位。

  • 根据垂直位置设置color_mode:v_active_14、v_active_24、v_active_34将有效区域分为4部分,分别对应不同的颜色模式。

Signaltap 波形如下:

3.图像生成与数据有效(Pattern Generator and DE)

  • vga_de(数据有效)由pre_vga_de延迟一拍产生,pre_vga_de是h_act和v_act的逻辑与。

  • 绘制白色边框:当进入或退出有效区域时(行或场的边界),boarder置位,输出白色(RGB=0xFF)。

  • 在非边框区域,根据color_mode输出渐变颜色:

0001:由黑向红色渐变(红色分量随pixel_x递增)。

0010:由黑向绿色渐变。(绿色分量随pixel_x递增)。

0100:由黑向蓝色渐变。(蓝色分量随pixel_x递增)。

1000:由黑向白色渐变(三通道同时递增)。

默认状态:黑色(RGB=0x000000)。

Signaltap 波形如下:

\Demonstrations\FPGA\HDMI_TX\vpg_source\vpg.v模块里面给出了各个分辨率参数:

以上代码的这些参数数据参考1-DE10-Nano的HDMI方块移动案例------显示器时序(DMT)标准介绍 里面的显示器时序中不同分辨率刷新率的参数章节的表格。以640x480@60 为例,根据表格参数可以画出VGA有效显示区域如下:

读者可能觉得vpg.v模块里面给出了各个分辨率参数跟表格的数据有不同,是因为时钟节拍从0开始计数,所以每个数据都减一, 另外h_start提前 2 拍其实是全局时序补偿,目标是抵消 "h_act信号到vga_de信号的总延迟(2 拍),让最终显示位置对齐 VGA 标准。具体的计算请参考vpg.v模块里面的注释部分:

往期阅读

1-DE10-Nano的HDMI方块移动案例------显示器时序(DMT)标准介绍

2-DE10-Nano的HDMI方块移动案例------HDMI接口介绍(含TMDS)

3-DE10-Nano的HDMI方块移动案例------ADV7513芯片解读

4-DE10-Nano的HDMI方块移动案例------I2C通信协议

5-DE10-Nano的HDMI方块移动案例------基于FPGA的I2C控制模块设计

6-DE10-Nano的HDMI方块移动案例------使用Modelsim仿真I2C控制器

7-DE10-Nano的HDMI方块移动案例的整体实现(含Quartus完整工程免费下载)

Altera FPGA 的 Avalon MM总线接口规范介绍(精简版)

1- DE10-Nano的HDMI彩条显示案例(分辨率可切换)(含Quartus完整工程免费下载)

相关推荐
仲南音13 小时前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20201 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy1 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia2 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20202 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安3 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议