FPGA基础入门【14】开发板VGA视频输出控制 | 您所在的位置:网站首页 › vga可以连接电脑显示器吗 › FPGA基础入门【14】开发板VGA视频输出控制 |
前两篇教程讲了通过USB控制鼠标和键盘的方法,顺便挖了个VGA的大坑,找了很久都没找到VGA转HDMI的转接器,好在在其中一个显示器后面发现了VGA接口。用VGA画一个大·害怕 FPGA基础入门【14】开发板VGA视频输出控制 VGA基础CRT显示器VGA控制与时序 逻辑设计IP配置代码设计 模拟仿真Testbench仿真脚本仿真结果 编译烧写总结 VGA基础在NEXYS 4开发板文档中写着,该板用14个引脚控制VGA,RGB红绿蓝三色各用4位数,加上HS - Horizontal Sync横向同步和VS - Vertical Sync纵向同步两个引脚。接口形式和连接如下,接口不对称用来防呆
VGA是为老式的CRT阴极射线显示器使用,核心是加热的阴极发射电子(电视机开过后面会发热,过去熊孩子偷看电视必须知道的常识),经过格栅聚焦成电子束,经过偏转电场偏转后被高压加速,打在铺好三色荧光粉的显示屏上发光,其结构如下 屏幕上的扫描分行和列,一般有240到1200行,320到1600列,行列相乘是像素数,每个像素对应RGB各4位即12位,因此逻辑设计时最好使用一个比较深的RAM。 VGA控制与时序VGA控制电路需要生成有特定周期的HS和VS信号,用来校准偏转电场。VS决定了刷新率一般在50Hz到120Hz,而HS的周期则是扫完一整行用的时间。如下图所示,HS每个周期输出一次低电平脉冲,除了线性扫过一行的有效时间,还要留出偏转电场回到初始位置的时间retrace time,在低电平脉冲的前后都有一段 其中一张时序图可以更清楚的看出HS和VS之间的时序关系,对此我们要对文档中给出的逻辑结构做出一点改进,HS拉高的时机从0改到800-48=752,拉低的时机从3.84us也就是96改到800-48-96=656 这篇教程计划使用一张480x640@60Hz的图片显示,使用开发板推荐的时序配置。 理论上来说,这样的图片显示需要一个宽度为12位,深度为480640=307200的RAM存储器,但从横向计数器和纵向计数器的结构中看,用来给纵向计数器计数的时间是HS为高电平的时间,这里面包括了偏转电场的回复时间。我们可以设计一些额外的逻辑来专门排除回复时间,但这样会增加逻辑复杂度,并且还要给RGB输出也加上输出选择,不能直接用RAM的输出,因此决定这里浪费一些RAM空间,在相应空间填入0。这样设计使用的深度为521(800-96)=366784 IP配置新建vivado工程,名为vga,配置选择开发板NEXYS 4,到IP catalog中搜索RAM,双击下面这个 存储器的选择要看存储数据的深度和宽度,一般来说宽而浅的,不常变化且需要经常读取的,使用LUTRAM;稍微深且窄一点,需要持续读取的,使用BRAM;非常深,并且窄则使用外部存储器。VGA需要的是图片数据,一般都在MB量级,使用外部存储器是最好的选择,但这里为了展示RAM IP的配置方法,同时也是图方便,使用了BRAM(自然会用好多个) IP的配置如下 coe文件包含两部分,第一行是数据格式,是十六进制、十进制或者其他;第二行以后是数据具体内容。示例如下: memory_initialization_radix=16; memory_initialization_vector=3f, 1f;从时序图中看,头31行为空,尾10行为空,并且尾64列为空 这里打算用MATLAB(如果没有license可以搜索Octave,相当于一个免费版本的MATLAB,大概功能都有)来生成coe文件。首先随便下载一张图片保存为pic.jpg,配置好MATLAB路径到图片的根目录后,使用如下脚本: pic = imread('fear.jpg'); subplot(1,2,1); imshow(pic); pkg load image; pic = imresize(pic, [480 640]); pic = uint8(floor(double(pic)/16)); subplot(1,2,2); imshow(pic*16); pic = double(pic); pic = pic(:,:,1)*256 + pic(:,:,2)*16 + pic(:,:,3); data = zeros([521,704]); data(30:509,1:640) = pic; data = reshape(data', [521*704 1]); fileID = fopen('picture.coe','w'); fprintf(fileID,'memory_initialization_radix=10;\n'); fprintf(fileID,'memory_initialization_vector=\n'); fprintf(fileID,'%d,\n',data(1:end-1)); fprintf(fileID,'%d;\n',data(end)); fclose(fileID);可以把fear.jpg改成下载的图片名称,最终生成一个picture.coe文件 JPEG图片都是8位RGB,这里要降低到4位,所以看起来会比较失真,另外所有图片都会被转为480x640,原本不是这个比例的图片都会变形: 代码vga.v如下: 引脚定义,除了时钟和复位,就是VGA的14根引脚 module vga( input clk, input rst, // VGA port output reg [3:0] VGA_R, output reg [3:0] VGA_G, output reg [3:0] VGA_B, output reg VGA_HS, output reg VGA_VS );资源定义 reg clk_pixel; reg clk_count; (* dont_touch = "true" *)reg [9:0] hor_count; (* dont_touch = "true" *)reg hor_zero_detect; (* dont_touch = "true" *)reg hor_3_84_us_detect; (* dont_touch = "true" *)reg hor_effective; reg [18:0] ver_count; (* dont_touch = "true" *)reg ver_zero_detect; (* dont_touch = "true" *)reg ver_64_us_detect; (* dont_touch = "true" *)reg ver_effective;用100MHz放慢四倍形成25MHz // generation of 25MHz pixel clock always @(posedge clk or posedge rst) begin if(rst) begin clk_pixel |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |