文章目录

  • 一、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. CCAI 2017 中国人工智能大会 6.4 折抢票倒计时!
  2. ADO与ADO.NET
  3. MySQL性能优化点记录
  4. js 设备条形码字体_蚌埠食品袋激光打码机设备-青岛博泰格睿特
  5. 在未来给我们看病的将是医疗机器人?
  6. 2019寒假第三次作业
  7. 18-Gm-TransH:Group-Constrained Embedding of Multi-fold Relations in Knowledge Bases,嵌入,transH,n-ary
  8. Vue生命周期-手动挂载理解
  9. MotoSimEG-VRC软件:安川机器人摆动焊接虚拟仿真操作方法
  10. C++ builder 添加资源文件
  11. 一个30岁的程序员无比挣扎的故事,连躺平都是奢望
  12. 在设备后台安装CAB而不让用户发觉
  13. 关于查看nginx的访问量的部分总结
  14. 如何用post方法请求数据?
  15. Excel 分组统计不重复项
  16. 软件项目管理——项目三角形
  17. 168 PHP中Notice: iconv(): Unknown error (84) 的解决办法
  18. 数字孪生输变电设备构建关键技术研究案例
  19. idea2022 创建aliyun 项目
  20. 手写Spring-第四章-为依赖的对象注入灵魂!

热门文章

  1. vue ionic css,Ionic vue 初探
  2. Android 自定义人体效果图之项目实战
  3. 怎么把证件照压缩在30K之内?教你三秒快速压缩证件照
  4. Ubuntu关机(shut down)(power off)后不断电的问题
  5. win10完美运行红警
  6. 数据库中的二维表—巧借Excel
  7. 【整理】【原创】 什么是一维表,什么是二维表?----不同于 1维数组,2维数组
  8. 华为鸿蒙系统发布会时间,华为“跑步”进场,鸿蒙发布时间确定,幸福来得太突然...
  9. 【FINAL】NOI
  10. 2022年31省市数字化转型路线图