VGA(Video Graphics Array)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。不支持热插拔,不支持音频传输。

VGA接口

行同步时序

场同步时序

分辨率

硬件简介

   VGA接口信号HS(1bit),VS(1 bit), R(8bit), G(8bit), B(1bit)。VGA显示器常用的分辨率为640x480,即操作的时候FPGA想办法向VGA显示器输出640行480列个点位数据(共307200个数据)。那具体是如何操作的呢?
基本操作流程:VS叫场扫描信号或者帧扫描信号,首先VS发一个负脉冲,告诉显示器我要开始发送一副图片了,你准备接收。然后,HS行扫描信号,发一个负脉冲,告诉显示器我要开始发送第一行数据了,准备接受。跟在HS负脉冲信号后,接着就每个一个时钟周期发送一组R,G,B点位的数据,一直发送640组。接下来HS再发一个负脉冲,告诉显示器我要开始发送第二行数据了,准备接收,然后发送第2行的640组R,G,B数据,以此类推,第3行,第4行。一直发送到第480行结束后,所有307200个数据就发送完全了。然后VS信号再发一个负脉冲,发第二幅图片的信息。以此类推。
具体时序数据:下图就对应了具体行扫描和场扫描阶段每个操作具体所需要的周期数。一目了然。注意HS,VS负脉冲后要等待几个周期才正式发送数据这是为了满足VGA的器件要求而定的。下图给了周期数,然后计算VGA的时钟频率。一般VGA显示器的刷新频率为60帧/s,每一秒显示60幅图片,即一帧数据需要1/60s发送。由下图可知,完整发送一帧数据(一副图片)需要800*525=420000个周期。则VGA时钟频率为420000/(1/60)=25.2MHZ。近似等于25MHZ。开发板上的主频时钟为50MHZ,所以只要二分频就OK啦。
代码如下:
module vga(
output [7:0] VGA_B,
output VGA_BLANK_N,
output VGA_CLK,
output [7:0] VGA_G,
output VGA_HS,
output [7:0] VGA_R,
output VGA_SYNC_N,
output VGA_VS,
input CLOCK_50,
input KEY ); wire[8:0] q;
rom2 rom_inst (
.address( address ),
.clock( CLOCK_50 ),
.rden( ~rdn ),
.q ( q )
); assign VGA_BLANK_N=~rdn;
wire[23:0]datain={q[8:6],5'd0,q[5:3],5'd0,q[2:0],5'd0};
wire[18:0]rd_a;
wire[18:0]address=(rd_a[18:10]*640)+rd_a[9:0];
wire rdn;
wire vga_clk;
assign VGA_CLK=vga_clk;
vga_c u0(
.clk(CLOCK_50),//50MHZ
.clrn(KEY),
.datain(datain),
.h_count(),
.v_count(),
.vga_clk(vga_clk),
.rdn(rdn), //read enable"0"active
.rd_a(rd_a),//read_address={row(9),col(10bit)}
.hs(VGA_HS),
.vs(VGA_VS),
.r(VGA_R),
.g(VGA_G),
.b(VGA_B));
endmodule

  

`timescale 1ns/1ns
module vga_c(
input clk, // 系统时钟50MHZ
input clrn, //复位信号
input [:]datain, //输入R,G,B数据24bit
output rdn, //读使能信号,低电平有效。
output [:]rd_a, //读地址,read_address={row(9),col(10bit)}
output reg[:]h_count='d0, //列计数器 0-799
output reg[:]v_count='d0, //行计数器 0-524
output reg vga_clk='b0, //vga时钟 25MHZ
//VGA接口信号
output hs, //行扫描信号
output vs, //场扫描信号
output [:]r,g,b //R,G,B输出信号
); //refreshrate=25*10^6/((96+48+640+16)*(480+2+33+10))=59.5=60 //1.VGA时钟生成,vga_clk:25MHZ
always @( negedge clrn or posedge clk )
vga_clk<=(!clrn)?'b0: ~vga_clk; //2.计数器v_count(0-524) and h_count(0-799)
always @( negedge clrn or posedge vga_clk )
if(!clrn) begin v_count<='d0;
h_count<='d0;
end
else if(v_count=='d524)
v_count<='d0;
else
begin
if(h_count=='d799)
begin h_count<='d0;
v_count<=v_count+'b1;
end
else
h_count<=h_count+'b1;
end // 3.锁存输入数据data_in,rdn=0时,外部有存储器有40ns的时间提供datain数据
reg video_out='b0;
reg [:]data_reg='d0; always @(negedge clrn or posedge vga_clk)
if(!clrn)
begin video_out<='b0;
data_reg<='d0;
end
else
begin video_out<=~rdn;
data_reg<=datain;
end //4.接口信号生成
assign hs=(h_count>=); //HS波形输出
assign vs=(v_count>=); //VS波形输出
wire [:]rol=v_count-'d35; //计算行地址
wire [:]col =h_count-'d143; //计算列地址
assign rd_a={rol[:],col[:]}; //行列地址拼接成一个rd_a
assign rdn=~(((h_count>='d143)&&(h_count<10'd783))&&((v_count>='d35)&&(v_count<10'd515))); //只有在有效的数据位rdn才置0
assign r=(video_out)?data_reg[:]:'d0;
assign g=(video_out)?data_reg[:]:'d0;
assign b=(video_out)?data_reg[:]:'d0; endmodule

rom ip设置

图片数据mif文件生成:可以使用工具或MATLAB

 

fpga vga 显示的更多相关文章

  1. 基于FPGA的VGA显示静态图片

    终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...

  2. 基于FPGA的Uart接收图像数据至VGA显示

    系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...

  3. 纠错:基于FPGA串口发送彩色图片数据至VGA显示

    今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...

  4. FPGA驱动VGA显示静态图片

    一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...

  5. 基于FPGA的VGA显示设计(二)

    上一篇:基于FPGA的VGA显示设计(一)     参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码  的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...

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

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

  7. 从FPGA搞定OV7670 VGA显示 移植到 STM32F10x TFT显示 总结及疑问(高手请进)

    OV7670不愧是最便宜的摄像头了最大显示像素:640*480(在VGA显示器上显示效果还不赖,用usb模块采集显示依然显著) 第一步:VGA显示 视频图像(实时)FPGA+SDRAM+OV7670= ...

  8. 基于FPGA的VGA显示实验设计

    基于FPGA的VGA显示实验设计 成果展示(优酷视频): 视频: 基于FPGA的VGA显示技术(手机控制) http://v.youku.com/v_show/id_XNjk4ODE3ODUy.htm ...

  9. 基于FPGA驱动VGA显示图片的小问题

    学习VGA显示图片的过程中,遇到了一个小问题,我在显示屏上开了一个60x60的框,放了一张图片进去显示,但是最终的结果如下图所示. 出现了一个竖黑边,看了看代码,分析了一下逻辑没问题,然而看这个显示那 ...

随机推荐

  1. E11000 duplicate key error index: test.collection.$a.b_1 dup key: { : null } 报错记录

    这个一般分为两种情况,第一新增数据出现约束.而你在orm里面写了唯一约束.这种情况就比较简单,添加数据时保证数据字段唯一性就好了. 第二种情况比较难找,因为你发现你在orm里面并没有写约束,但是还是插 ...

  2. github的版本控制master和branch develop

    一.git版本控制原理 master(主分支), develop(分支),虽然是主分支和分支,却是平级关系,develop可以理解为开发库,master为生产库. 本地版本:master, devel ...

  3. MySQL数据库优化(一)

    1.1.1. 慢查询日志当查询超过一定的时间没有返回结果的时候,才会记录到慢查询日志中.默认不开启.采样的时候手工开启.可以帮助我们找出执行慢的 SQL 语句查看慢 SQL 日志是否启用(on 表示启 ...

  4. 2级搭建类203-Oracle 19c SI ASM 静默搭建(OEL7.7)

    Oracle 19c 单实例 ASM UDEV 方式在 OEL 7.7 上的安装

  5. Docker 镜像仓库为什么要分库分权限?

    先说一个事故案例: 场景:某大型互联网电商公司,使用一个镜像仓库管理所有Docker镜像.开发者打出的镜像上传到唯一的镜像库,测试通过后,运维环境的 Kubernetes 直接从这个库里拉取镜像,所有 ...

  6. 基于Dapper的开源Lambda扩展LnskyDB 3.0已支持Mysql数据库

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.,现在已经支持MySql和Sql serv ...

  7. jQuery---自定义动画 animate();

    自定义动画 animate(); 第一个参数:{对象},里面可以传需要动画的样式 第二个参数:speed 动画的执行时间 第三个参数:easing 动画的执行效果 第四个参数:callback 回调函 ...

  8. centos7最小版配置

    配置启用dns cd /etc/sysconfig/network-scripts/ vi ifcfg-ens33 # 修改ONBOOT为yes ONBOOT=yes 重启系统 reboot 安装ne ...

  9. vue 多组件路由处理方法

    实现页面: 实现效果: 实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  10. python3练习100题——028

    原题链接:http://www.runoob.com/python/python-exercise-example28.html 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4 ...