VGA驱动实现并下板EGO1
文章目录
- 一、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相关推荐
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--VGA驱动(十)
声明:本文转载于http://www.cnblogs.com/kingst,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有. 实验九:VGA驱动 实验九之一:驱 ...
- ir2104s的自举电容_电赛必备,IR2104S半桥驱动MOS管电机驱动板(PCB工程文件+磁悬浮代码)...
IR2104S半桥驱动MOS管电机驱动板设计心得: (1)驱动电路方案为经典的半桥驱动IR2104S加N沟道MOS管IR7843,MOSEFT内部有续流二极管,听说是寄生的(不知对不对),所以外加了肖 ...
- 从入门到精通ARM(4412)-Linux内核驱动编程【下】-李志勇-专题视频课程
从入门到精通ARM(4412)-Linux内核驱动编程[下]-247人已学习 课程介绍 嵌入式绝对是当前IT领域最炙手可热的话题了.其主要应用领域涵盖与人类相关的各行各业: * 消费电 ...
- mt7601u linux驱动编译,移植MT7601U AP Linux 驱动至Orangepi-PC2开发板
简单一下记录移植MT7601U AP Linux 驱动至Orangepi-PC2开发板的过程. 二 环境描述 1.Orangpi-PC2开发板(Linux Orangepi 3.10.65 #12 ...
- 高压放大器在驱动压电陶瓷进行铝板无损检测中的应用研究
想要达成在不损害或不影响被测对象使用性能及自身性质的前提下,对被测对象内部进行缺陷,结构,失效分析,就得用到无损检测(Non Destructive Testing)技术,最常用的无损检测方法有很多, ...
- linux显卡驱动mxm,linux下我的FX5200显卡驱动安装
linux下我的FX5200显卡驱动安装 发布时间:2008-09-20 16:42:33来源:红联作者:Keiboc 一.为什么要装驱动 一般情况下,只要你下载了LINUX的最新发行版本,比如Fed ...
- 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)...
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)--初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- 第五篇:mig读写时序下板实现
FPGA开源工作室将通过五篇文章来给大家讲解xilinx FPGA 使用mig IP对DDR3的读写控制,旨在让大家更快的学习和应用DDR3. 本实验和工程基于Digilent的Arty Artix- ...
- CREE第二代SiC MOSFET驱动电路原理图及PCB板设计)
CREE第二代SiC MOSFET驱动电路原理图及PCB板设计 电路原理图 光耦隔离电路和功率放大电路原理图 隔离电源电路原理图 PCB layout 第一层layout 第二层layout(负电层) ...
- 驱动 | 在linux下DPDK的部署及使用
本文列出可用于在linux系统上安装.编译.初步使用DPDK的不完全参考. Last Modified: 2022/1/22 驱动 | 在linux下DPDK的部署及使用 安装 参考链接 安装 概念 ...
最新文章
- MySQL面试题 | 附答案解析(四)
- 第五章 软件下载与安装(二、Ubuntu安装Mininet)
- C语言 | 结构体指针
- ai钢笔工具怎么描线_AI中钢笔工具绘图的实战操作技巧!(干货满满)
- qt 背景和控件布局_Qt编写自定义控件26-平铺背景控件
- C++指针参数如何传递内存?
- android中在java代码中设置Button按钮的背景颜色
- 简单的Tomcat中配置访问本地资源(含idea配置)
- cve20190708补丁的kb名称_2019-6微软安全更新补丁KB4503269
- java程序员和java架构师有什么区别呢?
- linux geos 动态库,未经sudo许可在linux上安装GEOS库
- Android百度地图+OSS图片拍照上传+导航+idea
- 这个神器让我的 Bug 少了一半
- Linux软件管理与vim实验报告,LinuxVi编辑器的使用实验报告.doc
- 程序员读《三体》后看到了什么?
- 图片裁剪cropperjs的使用
- Android NDK 中堆栈日志 add2line 的分析实践
- 主成分分析、因子分析及其有关的数学基础
- nlp算法工程师英语
- Fisher Vector费舍尔向量and FIsher Kernel费舍尔核