文章目录

  • 一、VGA
  • 二、VGA接口及引脚定义
  • VGA原理
  • VGA时序标准
  • VGA显示模式及相关参数
  • 设计
    • 1.实验内容
    • 2.分析
    • 3.模块
    • 4.总体设计框图如下
  • 编码测试
  • 结果

一、VGA

VGA,全称“Video Graphics Array”,及就是视频图形阵列,是一种使用模拟信号进行视频传输的标准协议,由IBM公司于1987年推出

二、VGA接口及引脚定义


EGO1上VGA接口


VGA原理

VGA显示器采用 图像扫描 的方式进行图像显示,将构成图像的像素点,在行同步信号和场同步信号的同步下,按照从上到下、由左到右的顺序扫描到显示屏上。

VGA时序标准


行扫描周期分为六个部分,分别是同步、后沿、左边框、有效图像、右边框和前沿。

场扫描也一样

但是真正显示的部分是行、场扫描相交的部分

也就是中间红黄相间的地方

VGA显示模式及相关参数


时钟频率=行扫描周期x场扫描周期x帧(及就是@后的那个数字)
时钟频率的单位为MHz


设计

1.实验内容

在EGO1的实验板上输出VGA数据到显示器上,效果应如下所示

2.分析

目标显示模式为640x480@60
通过上面的表可以查到其时钟频率是25.175MHz,因为系统时钟是100MHz,想用100MHz来实现25.175MHz的分频无论是使用PLL锁相环还是使用RTL代码来实现都不是很方便,为了便于分频,选择25MHz,影响不大。

3.模块

根据实际需要,总共分为四个模块:

  • vga_colobar:该模块为顶层模块,主要接受系统时钟和复位信号,输出12位rgb,因为EGO1的VGA接口是444类型的,所以总共是12位,该模块还输出hsync和vsync信号
  • clk_gen:该模块输入的是系统时钟,还有areset信号,输出clk_out和locked。该模块实现了分频,将系统时钟100MHz分频为25MHz,并通过clk_out输出
  • vga_ctrl:该模块是vga驱动模块,在25MHz的工作时钟下,产生横纵坐标信号(pix_x,pix_y)---->(639,479),并且将该横纵坐标信号输出给vga_pic模块,生成行场、同步信号,再把pix_data像素点信息传输到rgb输出端口
  • vga_pic:根据输入的时钟信号、复位信号,以及坐标信号,产生pix_data像素信息

每个模块的框图如下:



4.总体设计框图如下


编码测试

vga_ctrl.v:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/08/25 21:49:05
// Design Name:
// Module Name: vga_ctrl
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vga_ctrl(input wire             vga_clk   ,input wire             sys_rst_n ,input wire    [11:0]   pix_data  ,output wire    [9:0]   pix_x    ,output wire    [9:0]   pix_y    ,output wire            hsync    ,output wire            vsync    ,output wire    [11:0]  vga_rgb
);parameter H_SYNC   = 10'd96,H_BACK   = 10'd40,H_LEFT   = 10'd8,H_VALID  = 10'd640,H_RIGHT  = 10'd8,H_FRONT  = 10'd8,H_TOTAL  = 10'd800;parameter V_SYNC   = 10'd2,V_BACK   = 10'd25,V_TOP    = 10'd8,V_VALID  = 10'd480,V_BOTTOM = 10'd8,V_FRONT  = 10'd2,V_TOTAL  = 10'd525;reg [9:0]   cnt_h     ;
reg [9:0]   cnt_v     ;
wire        rgb_valid ;
wire        pix_data_req;always @(posedge vga_clk or negedge sys_rst_n) beginif (sys_rst_n == 1'b0) begincnt_h <= 10'd0;endelse if (cnt_h == (H_TOTAL - 1'b1)) begincnt_h <= 10'd0;endelse begincnt_h <= cnt_h + 10'd1;end
endalways @(posedge vga_clk or negedge sys_rst_n) beginif (sys_rst_n == 1'b0) begincnt_v <= 10'd0;endelse if ((cnt_h == (H_TOTAL - 1'b1)) && (cnt_v == (V_TOTAL - 1'b1))) begincnt_v <= 10'd0;endelse if (cnt_h == (H_TOTAL-1'b1)) begincnt_v <= cnt_v + 10'd1;endelse begincnt_v <= cnt_v;end
endassign rgb_valid = ((cnt_h >= H_SYNC + H_BACK + H_LEFT)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID)&& (cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID))?  1'b1 : 1'b0;assign pix_data_req = ((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1)&& (cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID))?  1'b1 : 1'b0;assign pix_x = (pix_data_req == 1'b1) ? (cnt_h - (H_SYNC + H_BACK + H_LEFT) - 1'b1) : 10'd0;
assign pix_y = (pix_data_req == 1'b1) ? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 10'd0;
assign hsync = (cnt_h <= H_SYNC - 1'b1) ? 1'b1 : 1'b0;
assign vsync = (cnt_v <= V_SYNC - 1'b1) ? 1'b1 : 1'b0;
assign vga_rgb = (rgb_valid == 1'b1) ? pix_data : 12'h000;endmodule

vga_pic.v:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/08/26 19:53:47
// Design Name:
// Module Name: vga_pic
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vga_pic(input wire         vga_clk     ,input wire         sys_rst_n   ,input wire  [9:0]  pix_x       ,input wire  [9:0]  pix_y       ,output reg   [11:0]    pix_data
);parameter H_VALID = 10'd640,V_VALID = 10'D480;parameter   RED     = 12'hF80,ORANGE  = 12'hFC0,YELLOW  = 12'hFFE,GREEN   = 12'h07E,CYAN    = 12'h07F,BLUE    = 12'h01F,PURPPLE = 12'hF81,BLACK   = 12'h000,WHITE   = 12'hFFF,GRAY    = 12'hD69;always@ (posedge vga_clk or negedge sys_rst_n) beginif (sys_rst_n == 1'b0) beginpix_data <= BLACK;endelse if (pix_x >= 0 && pix_x < (H_VALID / 10) * 1) beginpix_data <= RED;endelse if (pix_x >= ((H_VALID / 10) * 1) && pix_x < ((H_VALID / 10) * 2) ) beginpix_data <= ORANGE;endelse if (pix_x >= ((H_VALID / 10) * 2) && pix_x < ((H_VALID / 10) * 3) ) beginpix_data <= YELLOW;endelse if (pix_x >= ((H_VALID / 10) * 3) && pix_x < ((H_VALID / 10) * 4) ) beginpix_data <= GREEN;endelse if (pix_x >= ((H_VALID / 10) * 4) && pix_x < ((H_VALID / 10) * 5) ) beginpix_data <= CYAN;endelse if (pix_x >= ((H_VALID / 10) * 5) && pix_x < ((H_VALID / 10) * 6) ) beginpix_data <= BLUE;endelse if (pix_x >= ((H_VALID / 10) * 6) && pix_x < ((H_VALID / 10) * 7) ) beginpix_data <= PURPPLE;endelse if (pix_x >= ((H_VALID / 10) * 7) && pix_x < ((H_VALID / 10) * 8) ) beginpix_data <= BLACK;endelse if (pix_x >= ((H_VALID / 10) * 8) && pix_x < ((H_VALID / 10) * 9) ) beginpix_data <= WHITE;endelse if (pix_x >= ((H_VALID / 10) * 9) && pix_x < (H_VALID)) beginpix_data <= WHITE;endelse beginpix_data <= BLACK;end
end
endmodule

vga_colorbar.v:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/08/26 20:23:04
// Design Name:
// Module Name: vga_colorbar
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vga_colorbar(input wire        sys_clk,input wire        sys_rst_n,output wire       hsync,output wire       vsync,output wire  [11:0] vga_rgb
);wire        vga_clk;
wire        locked;
wire        rst_n;wire    [9:0]    pix_x;
wire    [9:0]    pix_y;
wire    [11:0]   pix_data;assign  rst_n = (sys_rst_n && locked);clk_wiz_0 clk_wiz_inst
(// Clock out ports  .clk_out1(vga_clk),// Status and control signals               .reset(~sys_rst_n), .locked(locked),// Clock in ports.clk_in1(sys_clk)
);vga_ctrl vga_ctrl_inst
(.vga_clk  (vga_clk) ,.sys_rst_n(rst_n) ,.pix_data (pix_data) ,.pix_x    (pix_x  ),.pix_y    (pix_y  ),.hsync    (hsync  ),.vsync    (vsync  ),.vga_rgb  (vga_rgb)
);vga_pic vga_pic_inst
(.vga_clk(vga_clk),.sys_rst_n(rst_n),.pix_x(pix_x),.pix_y(pix_y),.pix_data(pix_data)
);
endmodule

PLL:


结果

VGA驱动实现并下板EGO1相关推荐

  1. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--VGA驱动(十)

    声明:本文转载于http://www.cnblogs.com/kingst,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有. 实验九:VGA驱动 实验九之一:驱 ...

  2. ir2104s的自举电容_电赛必备,IR2104S半桥驱动MOS管电机驱动板(PCB工程文件+磁悬浮代码)...

    IR2104S半桥驱动MOS管电机驱动板设计心得: (1)驱动电路方案为经典的半桥驱动IR2104S加N沟道MOS管IR7843,MOSEFT内部有续流二极管,听说是寄生的(不知对不对),所以外加了肖 ...

  3. 从入门到精通ARM(4412)-Linux内核驱动编程【下】-李志勇-专题视频课程

    从入门到精通ARM(4412)-Linux内核驱动编程[下]-247人已学习 课程介绍         嵌入式绝对是当前IT领域最炙手可热的话题了.其主要应用领域涵盖与人类相关的各行各业: * 消费电 ...

  4. mt7601u linux驱动编译,移植MT7601U AP Linux 驱动至Orangepi-PC2开发板

    简单一下记录移植MT7601U AP Linux 驱动至Orangepi-PC2开发板的过程. 二  环境描述 1.Orangpi-PC2开发板(Linux Orangepi 3.10.65 #12 ...

  5. 高压放大器在驱动压电陶瓷进行铝板无损检测中的应用研究

    想要达成在不损害或不影响被测对象使用性能及自身性质的前提下,对被测对象内部进行缺陷,结构,失效分析,就得用到无损检测(Non Destructive Testing)技术,最常用的无损检测方法有很多, ...

  6. linux显卡驱动mxm,linux下我的FX5200显卡驱动安装

    linux下我的FX5200显卡驱动安装 发布时间:2008-09-20 16:42:33来源:红联作者:Keiboc 一.为什么要装驱动 一般情况下,只要你下载了LINUX的最新发行版本,比如Fed ...

  7. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)...

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)--初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  8. 第五篇:mig读写时序下板实现

    FPGA开源工作室将通过五篇文章来给大家讲解xilinx FPGA 使用mig IP对DDR3的读写控制,旨在让大家更快的学习和应用DDR3. 本实验和工程基于Digilent的Arty Artix- ...

  9. CREE第二代SiC MOSFET驱动电路原理图及PCB板设计)

    CREE第二代SiC MOSFET驱动电路原理图及PCB板设计 电路原理图 光耦隔离电路和功率放大电路原理图 隔离电源电路原理图 PCB layout 第一层layout 第二层layout(负电层) ...

  10. 驱动 | 在linux下DPDK的部署及使用

    本文列出可用于在linux系统上安装.编译.初步使用DPDK的不完全参考. Last Modified: 2022/1/22 驱动 | 在linux下DPDK的部署及使用 安装 参考链接 安装 概念 ...

最新文章

  1. Nature子刊封面:浙大王蒙岑组揭示水稻种子内生菌抗病新功能
  2. 【控制】盖尔圆盘定理
  3. NoSQL入门第一天——NoSQL入门与基本概述
  4. 菜鸟要做架构师——java性能优化之for循环
  5. python如何更改entry属性_如何在Python3中更改Gtk3 Entry文本颜色?
  6. 电脑技术吧_干货!12年技术员从零开始讲电脑硬件之攒机
  7. 什么是jQuery?
  8. Day6-------BOM
  9. jquery 读取页面load get post ajax 四种方式代码写法
  10. 2021年广东新高考学业水平考试成绩查询,2021年1月广东高中学业水平考试成绩查询时间及入口...
  11. Neo4j 语法帮助文档
  12. 破解windows7系统密码
  13. IBM服务器远程管理模块IMM配置
  14. java并发机制_Java并发机制的底层实现原理.PDF
  15. python猴子分桃_猴子分桃 - Ryan in C++ - 博客园
  16. Day9 化学方程式配平
  17. 记录docker failed to initialize docker desktop is shutting down解决办法
  18. 数据库原理——实验二《数据查询》
  19. win10安装linux虚拟机并配置shell工具连接
  20. cadence学习资料整理

热门文章

  1. Angular纯前端实现table表格导出excel的xls格式
  2. windows10+Ubuntu双系统卸载旧Ubuntu并重装Ubuntu(绝对安全)
  3. 微信支付指纹上传服务器,指纹安全吗,支付宝、微信支付会上传用户的指纹吗...
  4. LED点阵屏动画展示
  5. 基于SpringBoot的在线学生请假管理系统的设计与实现毕业设计源码060935
  6. Hello I am whiter. Nice to meet you!!!
  7. 编程语言的分类与关系
  8. 华为路由与交换 eSight基本概述学习笔记
  9. 如何将confluence表格的第一行或者第一列固定
  10. Awesome Blockchain 区块链技术导航