当前位置: 首页 > article >正文

FPGA中级项目5——VGA part1

FPGA中级项目5——VGA part1

VGA简介


首先呀,观众老爷大概率对这个东西一筹莫展,这啥,啥,啥!VGA到底是个啥!其实就在你我身边,每天爱不释手看的视频,图片之前都要用到它!好的接下来我分几个维度来讲解

VGA 的定义与历史


全称与起源:VGA(Video Graphics Array)是由 IBM 于 1987 年推出的一种视频接口标准,最初用于其 PS/2 系列计算机。它是继 CGA(Color Graphics Adapter)和 EGA(Enhanced Graphics Adapter)之后的第三代图形接口,革命性地提升了显示质量。
历史意义:VGA 是首个广泛普及的彩色图形标准,奠定了现代计算机显示的基础。它的开放标准使其被第三方厂商广泛采用,成为跨平台兼容的接口。也就是说,市面上全部的显示器全部都要支持VGA格式标准!

核心技术规格


分辨率与刷新率
标准模式:640×480 像素,60Hz 刷新率。
扩展模式:通过硬件支持可提升至更高分辨率(如 800×600、1024×768),但需显卡和显示器共同支持。
颜色深度:初期支持 16 位色(65536 色),后期扩展为 24 位真彩色(1677 万色)。
信号类型:模拟信号:通过红、绿、蓝(RGB)三基色模拟电压传输,易受干扰但兼容性强。


接口类型与物理特性


接口外观
D-sub 15 针:梯形接口,分三排排列(5+5+5 针),通常为蓝色。
针脚定义:
第 1-3 针:红、绿、蓝模拟信号;
第 4 针:ID 位(用于识别显示器类型);
第 5 针:接地;
第 6-8 针:红、绿、蓝信号地;
第 9 针:保留(部分设备用于 DDC 通信);
第 10 针:同步信号地;
第 11-15 针:行同步、场同步、数据通道等。
线缆类型
使用屏蔽双绞线(STP)或同轴电缆,支持最长约 15 米传输(高质量线缆可达 30 米)。


应用场景


主流时期(1990-2010):计算机显示器、投影仪、笔记本电脑外接显示的标准接口。
当前应用
老旧设备兼容(如工控机、监控系统);
低成本解决方案(线缆价格低,无需额外转换);
长距离传输(模拟信号抗衰减能力优于早期数字接口)


优缺点分析


优点
兼容性强:支持几乎所有操作系统和显示设备;
成本低廉:线缆和接口硬件价格极低;
长距离传输:适合对画质要求不高的远距离场景。
缺点
模拟信号限制:易受电磁干扰,导致画质损失;
分辨率瓶颈:标准模式仅支持 640×480,扩展模式受限于硬件;
不支持 HDCP:无法传输加密内容(如蓝光)。


与其他接口的对比



VGA 作为经典接口,在数字时代仍有其生存空间,尤其在兼容性和成本敏感的场景中。但随着 HDMI、DisplayPort 等数字接口的普及,VGA 逐渐退出主流市场,但是仍有一席之地!


问题分析


1. 在 FPGA中进行 VGA设计,主要是要实现通过 FPGA 产生符合 VGA 标准的信号,从而驱动 VGA 接口的显示器显示图像。VGA 采用模拟信号进行图像传输,主要包含红(R)、绿(G)、蓝(B)三基色信号以及行同步信号(HSYNC)和场同步信号(VSYNC)。VGA 显示器根据行同步和场同步信号来确定每个像素的位置,然后根据 R、G、B 信号来显示相应颜色。

2. 首先要确认VGA的时序,然后才能进行相应的代码设计。不同的分辨率和刷新率对应不同的 VGA 时序参数,例如常见的 640x480@60Hz 分辨率,其行时序和场时序有特定的参数要求。行时序包括行同步脉冲宽度、行显示后沿、行显示时间、行显示前沿;场时序包括场同步脉冲宽度、场显示后沿、场显示时间、场显示前沿。

3. 紧接着根据 VGA 时序要求,在 FPGA 中使用计数器来生成相关的信号。例如此项目中若要实现一个图像的显示。需有行同步脉冲开始信号HS_begin;行同步脉冲结束信号HS_end; 行数据开始输出信号Hdat_begin;行数据停止输出信号Hdat_end;行同步信号的结束信号Hsync_end;同时场相关信号也如出一辙,两者的时序信号如下:

4. 关于设计的RGB颜色问题,在代码中一般以8位二进制数来表示亮度;例如红色:0的时候表示表示最暗,255的时候表示最亮;我们所看到的一切颜色都是由红,绿,蓝三原色组成,每一个颜色占八位,即一共24位,所以位宽为【23:0】data_in;由高到低的8位分别表示红,绿,蓝的数据。

5. 同样的,有了具体的时序要求。我们便可以来编写Verilog代码显得轻而易举了。


代码展示

//定义输入输出端口
module VGA(
        clk,
        reset_n,
        data_in,//用户输入数据
        VGA_HS,//行同步信号
        VGA_VS,//场同步信号
        hcount,//行扫描位置
        vcount,//场扫描位置
        VGA_BLK,//数据输出时间段
        VGA_CLK,
        data_out
    );
        input clk;
        input reset_n;
        input [23:0]data_in;
        output VGA_HS;
        output VGA_VS;
        output [10:0]hcount;//行同步的信号最大值为1056
        output [10:0]vcount;
        output VGA_BLK;
        output VGA_CLK;
        output data_out;
 
 
 //定义时序中相关信号       
        parameter VGA_HS_end =  11'd127;
        parameter hdat_begin = 11'd216;//行数据开始输出位置
        parameter hdat_end = 11'd1016;//行数据停止输出位置
        parameter hpixel_end = 11'd1055;//行扫描的最大位置处
        
        parameter VGA_VS_end =  11'd1;
        parameter vdat_begin = 11'd35;
        parameter vdat_end = 11'd515;
        parameter vline_end = 11'd524; 
                   
 
 //定义计数器,开始行扫描信号,场扫描信号计数       
        reg [10:0]hcount_r;
        reg [10:0]vcount_r;
always@(posedge clk or negedge reset_n)
if(!reset_n)
        hcount_r <= 11'd0;
else if(hcount_r  == hpixel_end)       
        hcount_r <= 11'd0;
else
        hcount_r <= hcount_r + 1'd1;
    
    
always@(posedge clk or negedge reset_n)
if(!reset_n) 
        vcount_r <= 11'd0;
else if(hcount_r  == hpixel_end)  begin
        if(vcount_r == vline_end)  
        vcount_r <= 11'd0;
        else
        vcount_r <= vcount_r + 1'd1;
        end
else
        vcount_r <= vcount_r;
                
              
//定义相关信号    
assign  VGA_HS = (hcount_r > VGA_HS_end) ?1'b1:1'b0;
assign  VGA_VS = (vcount_r > VGA_VS_end) ?1'b1:1'b0;  
assign  VGA_BLK =((hcount_r >= hdat_begin) &&(hcount_r < hdat_end ) &&(vcount_r >= vdat_begin )&&(vcount_r < vdat_end))?1'b1:1'b0;
assign  hcount = VGA_BLK ? (hcount_r - hdat_begin) :10'd0;
assign  vcount = VGA_BLK ? (vcount_r - vdat_begin) :10'd0;
assign  data_out = (VGA_BLK) ? data_in : 24'h000000;
assign  VGA_CLK = ~clk;    
    

    
endmodule

综合出来的底层系统逻辑图schematic如下:



http://www.kler.cn/a/592993.html

相关文章:

  • ChatGPT推理模型通用模型大解析!
  • v-on=“$listeners“ 这个写法已经废弃了,如进行代替
  • 基于python+django+mysql的小区物业管理系统源码+运行步骤
  • 点点-一款超级强大AI生活搜索助手
  • 人工智能之数学基础:矩阵的降维
  • 使用Streamlit快速构建数据应用程序
  • YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析
  • 误杀!微软道歉了!
  • (四)Reactor核心-前置知识3
  • 【MySQL】MySQL如何存储元数据?
  • html css js网页制作成品——HTML+CSS+js圣罗兰口红网页设计(4页)附源码
  • 【机器学习】特征工程
  • 《交互式线性代数》
  • C#本地将labelme数据集转换为机器视觉yolo数据集格式
  • 2025年 cocosCreator 1.8 定制 JavaScript 引擎
  • Debian 系统命令集合 |Debian 和 CentOS常见命令的异同
  • `fetch` 和 `axios`的前端使用区别
  • 设计模式(创建型)-工厂模式
  • Vue + CSS实现渐变栅格进度条
  • 压缩Docker虚拟磁盘空间CMD命令