VGA驱动原理

信号线 定义
HS 行同步信号(3.3V 电平)
VS 场同步信号(3.3V 电平)
R 红基色 (0~0.714V 模拟信号)
G 绿基色 (0~0.714V 模拟信号)
B 蓝基色 (0~0.714V 模拟信号)

显示扫描轨迹

每扫描完一行,重新开始下一行;每扫描完一场,重新开始下一场;直到像素点扫描完成。

行场扫描

场扫描时序分析

  • a~b:场消隐期 即同步,相当于还原扫描坐标
  • b~c:场消隐后肩 相当于准备开始扫描
  • c~d:场显示期 扫描中,数据有效区域
  • d~e:场消隐前肩 完成扫描,相当于准备同步

行扫描时序

  • a~b:行消隐期 即同步,相当于还原扫描坐标
  • b~c:行消隐后肩 相当于准备开始扫描
  • c~d:行显示期 扫描中,数据有效区域
  • d~e:行消隐前肩 完成扫描,相当于准备同步

三原色

VGA接口:R,G,B三通道,直接赋给数字信号,RGB,最多产生8种色彩。

真彩显示

通过构建电阻网络进行连接,即通过电阻网络分流模拟DAC控制电压大小来控制R,G,B的输入电压。

驱动代码

//----------------------------------------------------------------------------------------
// Modified by:         正点原子
// Modified date:       2018/1/30 11:12:36
// Version:             V1.1
// Descriptions:        vga驱动
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//module vga_driver(input           vga_clk,      //VGA驱动时钟input           sys_rst_n,    //复位信号//VGA接口                          output          vga_hs,       //行同步信号output          vga_vs,       //场同步信号output  [15:0]  vga_rgb,      //红绿蓝三原色输出input   [15:0]  pixel_data,   //像素点数据output  [ 9:0]  pixel_xpos,   //像素点横坐标output  [ 9:0]  pixel_ypos    //像素点纵坐标    );                             //parameter define
parameter  H_SYNC   =  10'd96;    //行同步
parameter  H_BACK   =  10'd48;    //行显示后沿
parameter  H_DISP   =  10'd640;   //行有效数据
parameter  H_FRONT  =  10'd16;    //行显示前沿
parameter  H_TOTAL  =  10'd800;   //行扫描周期parameter  V_SYNC   =  10'd2;     //场同步
parameter  V_BACK   =  10'd33;    //场显示后沿
parameter  V_DISP   =  10'd480;   //场有效数据
parameter  V_FRONT  =  10'd10;    //场显示前沿
parameter  V_TOTAL  =  10'd525;   //场扫描周期//reg define
reg  [9:0] cnt_h;
reg  [9:0] cnt_v;//wire define
wire       vga_en;
wire       data_req; //*****************************************************
//**                    main code
//*****************************************************
//VGA行场同步信号
assign vga_hs  = (cnt_h <= H_SYNC - 1'b1) ? 1'b0 : 1'b1;
assign vga_vs  = (cnt_v <= V_SYNC - 1'b1) ? 1'b0 : 1'b1;//使能RGB565数据输出
assign vga_en  = (((cnt_h >= H_SYNC+H_BACK) && (cnt_h < H_SYNC+H_BACK+H_DISP))&&((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))?  1'b1 : 1'b0;//RGB565数据输出
assign vga_rgb = vga_en ? pixel_data : 16'd0;//请求像素点颜色数据输入
assign data_req = (((cnt_h >= H_SYNC+H_BACK-1'b1) && (cnt_h < H_SYNC+H_BACK+H_DISP-1'b1))&& ((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))?  1'b1 : 1'b0;//像素点坐标
assign pixel_xpos = data_req ? (cnt_h - (H_SYNC + H_BACK - 1'b1)) : 10'd0;
assign pixel_ypos = data_req ? (cnt_v - (V_SYNC + V_BACK - 1'b1)) : 10'd0;//行计数器对像素时钟计数
always @(posedge vga_clk or negedge sys_rst_n) begin         if (!sys_rst_n)cnt_h <= 10'd0;                                  else beginif(cnt_h < H_TOTAL - 1'b1)                                               cnt_h <= cnt_h + 1'b1;                               else cnt_h <= 10'd0;  end
end//场计数器对行计数
always @(posedge vga_clk or negedge sys_rst_n) begin         if (!sys_rst_n)cnt_v <= 10'd0;                                  else if(cnt_h == H_TOTAL - 1'b1) beginif(cnt_v < V_TOTAL - 1'b1)                                               cnt_v <= cnt_v + 1'b1;                               else cnt_v <= 10'd0;  end
endendmodule

常见VGA显示刷新率时序

VGA显示程序

//****************************************************************************************//module vga_display(input             vga_clk,                  //VGA驱动时钟input             sys_rst_n,                //复位信号input      [ 9:0] pixel_xpos,               //像素点横坐标input      [ 9:0] pixel_ypos,               //像素点纵坐标    output reg [15:0] pixel_data                //像素点数据,);    //parameter define
parameter  H_DISP = 10'd640;                    //分辨率——行
parameter  V_DISP = 10'd480;                    //分辨率——列localparam WIDTH  = 10'd160;                    //字符区域宽度
localparam HEIGHT = 10'd22;                     //字符区域高度
localparam SIDE_W = 10'd40;                     //边框宽度
localparam BLACK  = 16'b00000_000000_00000;     //RGB565 黑色
//localparam PINK   = 16'b11010_010111_10101;     //RGB565 粉色
//localparam RED    = 16'b11111_000000_00000;     //RGB565 红色
//localparam GREEN  = 16'b00000_111111_00000;     //RGB565 绿色//reg define
reg  [159:0] char[22:0];                         //字符数组
reg [ 9:0] block_x;                             //字符左上角横坐标
reg [ 9:0] block_y;                             //字符左上角纵坐标
reg [21:0] div_cnt;                             //时钟分频计数器
reg        h_direct;                            //字符水平移动方向,1:右移,0:左移
reg        v_direct;                            //字符竖直移动方向,1:向下,0:向上reg [16:0] color[10:0];                         //颜色数组
reg [ 9:0] flag;//wire define
wire [ 9:0] x_cnt;
wire [ 9:0] y_cnt;wire move_en;                                   //方块移动使能信号,频率为100hz//*****************************************************
//**                    main code
//*****************************************************assign move_en = (div_cnt == 22'd300000 - 1'b1) ? 1'b1 : 1'b0;assign x_cnt = pixel_xpos - block_x;              //像素点相对于字符区域起始点水平坐标
assign y_cnt = pixel_ypos - block_y;              //像素点相对于字符区域起始点竖直坐标//给字符数组赋值,显示汉字“I LOVE YOU”,汉字大小为32*32
always @(posedge vga_clk) beginchar[0]  <= 160'h3FFC00007E0003C07C1E7FFC00007E3E03C0FC3E;char[1]  <= 160'h03C0000018000C30180C180C000038080C303008;char[2]  <= 160'h03C0000018001818180818040000180818183008;char[3]  <= 160'h03C0000018001008180818020000181010083008;char[4]  <= 160'h03C000001800300C1808180200000C10300C3008;char[5]  <= 160'h03C000001800300C0C10180000000C10300C3008;char[6]  <= 160'h03C00000180060040C10180000000C2060043008;char[7]  <= 160'h03C00000180060060C1018100000062060063008;char[8]  <= 160'h03C00000180060060C1018100000062060063008;char[9]  <= 160'h03C00000180060060C2018300000034060063008;char[10] <= 160'h03C000001800600606201FF00000034060063008;  char[11] <= 160'h03C0000018006006062018300000038060063008;char[12] <= 160'h03C0000018006006062018100000018060063008;char[13] <= 160'h03C0000018006006064018100000018060063008;char[14] <= 160'h03C0000018006006034018000000018060063008;char[15] <= 160'h03C0000018002006034018000000018020063008;char[16] <= 160'h03C000001800300C0340180000000180300C3008;char[17] <= 160'h03C000001802300C0380180200000180300C3008;char[18] <= 160'h03C0000018021008018018020000018010083008;char[19] <= 160'h03C0000018041818018018040000018018181810;char[20] <= 160'h03C00000180C0C300100180C000001800C301C20;char[20] <= 160'h3FFC00007FFC03C001007FFC000007E003C007C0;
end
always @(posedge vga_clk) begincolor[0] <= 16'b11010_010111_10101;     //RGB565 粉色color[1] <= 16'b11111_000000_00000;     //RGB565 红色color[2] <= 16'b00000_111111_00000;     //RGB565 绿色color[3] <= 16'b00000_000000_11111;     //RGB565 蓝色color[4] <= 16'b11111_111111_11111;     //RGB565 白色color[5] <= 16'b00000_011111_01111;     //RGB565 深青色color[6] <= 16'b01111_000000_01111;     //RGB565 紫色 color[7] <= 16'b00000_111111_11111;     //RGB565 青色color[8] <= 16'b11111_111111_00000;     //RGB565 黄色color[9] <= 16'b00000_000000_01111;     //RGB565 深蓝色
end
//通过对vga驱动时钟计数,实现时钟分频
always @(posedge vga_clk or negedge sys_rst_n) begin         if (!sys_rst_n)div_cnt <= 22'd0;else beginif(div_cnt < 22'd300000 - 1'b1) div_cnt <= div_cnt + 1'b1;elsediv_cnt <= 22'd0;                   //计数达10ms后清零end
end//当方块移动到边界时,改变移动方向
always @(posedge vga_clk or negedge sys_rst_n) begin         if (!sys_rst_n) beginh_direct <= 1'b1;                       //方块初始水平向右移动v_direct <= 1'b1;                       //方块初始竖直向下移动flag     <= 10'd0;endelse beginif(block_x == SIDE_W - 1'b1)            //到达左边界时,水平向右h_direct <= 1'b1;else                                    //到达右边界时,水平向左if(block_x == H_DISP - SIDE_W - WIDTH)h_direct <= 1'b0;elseh_direct <= h_direct;if(block_y == SIDE_W - 1'b1)            //到达上边界时,竖直向下v_direct <= 1'b1;   else                                    //到达下边界时,竖直向上if(block_y == V_DISP - SIDE_W - HEIGHT)v_direct <= 1'b0;elsev_direct <= v_direct;if((block_x == SIDE_W - 1'b1)||(block_x == H_DISP - SIDE_W - WIDTH)||(block_y == SIDE_W - 1'b1)||(block_y == V_DISP - SIDE_W - HEIGHT))flag <= flag + 1'b1;elseflag <= flag;   if (flag > 10'd9)flag <= 1'b0;else if(flag < 1'b0)flag <= 10'd9;end
end//根据方块移动方向,改变其纵横坐标
always @(posedge vga_clk or negedge sys_rst_n) begin         if (!sys_rst_n) beginblock_x <= 22'd100;                     //字符初始位置横坐标block_y <= 22'd100;                     //字符初始位置纵坐标endelse if(move_en) beginif(h_direct) block_x <= block_x + 1'b1;          //字符向右移动elseblock_x <= block_x - 1'b1;          //字符向左移动if(v_direct) block_y <= block_y + 1'b1;          //字符向下移动elseblock_y <= block_y - 1'b1;          //字符向上移动endelse beginblock_x <= block_x;block_y <= block_y;end
end//给不同的区域绘制不同的颜色
always @(posedge vga_clk or negedge sys_rst_n) begin         if (!sys_rst_n) pixel_data <= BLACK;else beginif((pixel_xpos < SIDE_W) || (pixel_xpos >= H_DISP - SIDE_W)|| (pixel_ypos < SIDE_W) || (pixel_ypos >= V_DISP - SIDE_W))pixel_data <= color[ flag - 1'b1];                 //绘制边框颜色elseif((pixel_xpos >= block_x) && (pixel_xpos < block_x + WIDTH)&& (pixel_ypos >= block_y) && (pixel_ypos < block_y + HEIGHT)) beginif(char[y_cnt][10'd159 - x_cnt])pixel_data <= color[  flag ];              //绘制字符颜色elsepixel_data <= BLACK;             //绘制字符区域背景为黑色      endelsepixel_data <= BLACK;                //绘制屏幕背景为黑色end
endendmodule

效果图



基于FPGA的VGA显示实验相关推荐

  1. 基于FPGA的VGA显示对贪吃蛇游戏的设计

    基于FPGA的VGA显示对贪吃蛇游戏的设计 摘要 目前,电子数码产品已经进入了人生活的方方面面,而大多数电子产品都依靠显示屏来传递信息,由此可见用电路对显示屏进行控制的研究有很大的实用价值和市场需求. ...

  2. 【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分

    目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 × 600@60Hz,分别显示三种 ...

  3. 基于FPGA的VGA显示彩条、字符、图片

    目录 一.VGA介绍 (一) VGA协议 (二) VGA端口介绍 (三) 色彩原理 (四)VGA显示原理 VGA通信协议: VGA时序解析 时钟分频 二.实现 ​1.彩条显示 2.字符显示 3.图片显 ...

  4. 基于FPGA的VGA显示设计(一)

    前言 FPGA主要运用于芯片验证.通信.图像处理.显示VGA接口的显示器是最基本的要求了. 原理 首先需要了解 : (1)VGA接口协议:VGA端子_维基百科 .VGA视频传输标准_百度 引脚1 RE ...

  5. 基于FPGA的VGA显示

    目录 VGA原理 代码 VGA原理 VGA概念 什么是VGA?VGA不是用来显示的那块屏幕,而是用来传输信号的接口.VGA全称是Video Graphics Array,即视频图形阵列,是模拟信号的一 ...

  6. 基于FPGA的VGA显示图片

    一.显示一张彩色图片 设计需求: 在VGA接口的显示屏上显示一张180*120彩色图片. 需求分析 (1)对图片裁剪及取数据 a.使用画图软件/美图秀秀将图片像素裁剪成180*120大小. b.取数据 ...

  7. FPGA学习——VGA显示

    FPGA学习--VGA显示 一.VGA原理 (一)VGA协议 (二)VGA端口结构 (三)⾊彩原理 (四)扫描原理 1.扫描方式 2.逐行扫描 3.隔行扫描 (五)⾏场信号 二.显示姓名学号 (一)实 ...

  8. imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊

    写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...

  9. FPGA--(基于Quartus的FPAG程序下载与固化教程)VGA显示实验之上板测试

    本节内容旨在教会大家如何下载程序进入FPGA并且验证我们前几节所做的VGA显示实验. 材料 EP4CE10F17C8N FPGA .USB_Blaster 下载器 完整Verilog代码.Quartu ...

最新文章

  1. 线性布局上的一个小错误
  2. 快速了解微信小程序的使用,一个根据小程序的框架开发的todos app
  3. Eclipse装了插件之后插件没反应启用不了或不显示问题的解决办法
  4. jQuery 属性操作——案例:购物车案例模块
  5. 用python做数据分析(行列转换)
  6. mysql innodb索引覆盖_Mysql InnoDB 覆盖索引与回表
  7. 音量已经调到100%,如何再调整
  8. Java Servlet web xml 配置详解
  9. 黑马博客——详细步骤(四)项目功能的实现之数据分页
  10. Android课设电台论文,基于Android的超短波电台多媒体传输系统
  11. C++ Maps 映射
  12. 信号与系统与数字信号处理丹梅老师公众号笔记
  13. breakall lisp文件_CAD图导入SU中一次成面的方法
  14. VB的阶乘和伽马函数
  15. Oracle标准建表语句
  16. Excel VBA生成SQL建表语句
  17. c语言编程中分数怎么表示,用C语言编程平均分数
  18. Part Ⅴ Entertainment 娱乐活动??
  19. 搞笑新闻联播之老公岗位制度(上)铃声 搞笑新闻联播之老公岗...
  20. 坚果nuts 加速 官网_#我的坚果R2# 开箱照大赛,现已正式开启

热门文章

  1. 小团队?大团队?优缺点对比
  2. java品尝饮料代码_求解各位高手:用java解决品尝饮料问题
  3. win10批量新建文件夹并命名,方法介绍
  4. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.elk.elkweb.mapp
  5. 阿里程序员自述:入职才两个月,我决定离职
  6. java mixin_理解Dart的Mixin继承机制
  7. 【转】《基于MFC的OpenGL编程》Part 2 Setting up OpenGL on Windows(1)
  8. RTL8188CUS WIFI模块的使用方式
  9. 118358-38-6,Fmoc-L-Ser(β-D-Glc(Ac)4)-OH,葡萄糖丝氨酸的纯度以及结构式介绍
  10. 电信天翼宽带,自备路由器经常断网