文章目录

  • 一、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. MySQL面试题 | 附答案解析(四)
  2. 第五章 软件下载与安装(二、Ubuntu安装Mininet)
  3. C语言 | 结构体指针
  4. ai钢笔工具怎么描线_AI中钢笔工具绘图的实战操作技巧!(干货满满)
  5. qt 背景和控件布局_Qt编写自定义控件26-平铺背景控件
  6. C++指针参数如何传递内存?
  7. android中在java代码中设置Button按钮的背景颜色
  8. 简单的Tomcat中配置访问本地资源(含idea配置)
  9. cve20190708补丁的kb名称_2019-6微软安全更新补丁KB4503269
  10. java程序员和java架构师有什么区别呢?
  11. linux geos 动态库,未经sudo许可在linux上安装GEOS库
  12. Android百度地图+OSS图片拍照上传+导航+idea
  13. 这个神器让我的 Bug 少了一半
  14. Linux软件管理与vim实验报告,LinuxVi编辑器的使用实验报告.doc
  15. 程序员读《三体》后看到了什么?
  16. 图片裁剪cropperjs的使用
  17. Android NDK 中堆栈日志 add2line 的分析实践
  18. 主成分分析、因子分析及其有关的数学基础
  19. nlp算法工程师英语
  20. Fisher Vector费舍尔向量and FIsher Kernel费舍尔核

热门文章

  1. 几种常见的4K高清视频信号传输方案对比
  2. Mac电脑没声音了怎么办?
  3. jsmy97时间控件,时间范围选择
  4. my97日期范围限制
  5. matlab三次方程求根,如何用matlab求一元三次方程的最小正根?
  6. 如何让MAC只显示外接屏幕!
  7. java做界面_java怎么做出界面?实例讲解
  8. android 手机2k分辨率,2K屏幕手机有哪些 2016六款2K分辨率手机推荐
  9. manjaro修改锁屏壁纸
  10. PHP一句话木马后门