VGA硬件接口

到zedboard官方给出的原理图中查看:

RGB信号,各四位;这里的设计是使用了电阻分压模拟了DAC芯片实现了4X4X4的RGB信号,如果要更好的显示效果还是建议使用专门的DAC。


上面给出了所有的引脚分配。

信号 功能 引脚分配
Red 红色视频信号 V20, U20, V19, V18
Green 绿色视频信号 AB22, AA22, AB21, AA21
Blue 蓝色视频信号 Y21, Y20, AB20, AB19
Hsync 行同步信号 AA19
Vsync 列同步信号 Y19

VGA时序分析


如上图所示,就是VGA时序的表示。按照这个时序图,编写程序。

Hsync是行同步信号,表示一行的开始和上一行的结束;
Vsync是列同步信号,表示一场的开始和上一场的结束;
行时序是以像素为单位的, 场时序是以行为单位的;
像素点从左到右算一行,行数从上到下算一场。

在图上定义了很多区间,而根据这些区间我们可以看到整个时序图被分为了三个矩形:中间的Adressable Video,其外面的Border,还有最外面的Blanking。
传输数据的时间就是中间的Adressable Video的这段时间,同步到每个像素即可。中间的那个矩形就对应显示器显示的范围,其他的矩形可以看做是不可见的。

VGA的时序我只是简单介绍了下,详细的介绍可以查看:[笔记]VGA时序及其原理

列出几个常用的时序:
640×480 @60HZ

800×600@60HZ

上面给出了几个示例,图中给出了时序参数的计算步骤以及最后结果,可以到这下载:VGA时序标准
现在我们只提取出最后要用到的时序参数:

(这个图是我直接在网上截图的,不保证全部正确,最好参考VGA时序标准确认一遍,以手册为准)

编写代码

新建工程,添加Verilog代码,这些步骤不再赘述。
直接上代码了,代码中添加了注释。我选取的是800×600@60HZ。
程序的结构:

产生vga信号的代码:
vga_data_gen.v

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2017/07/27 23:15:37
// Design Name:
// Module Name: vga_data_gen
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vga_data_gen(input pixel_clk,        //像素时钟input rst,              //复位按键,高电平复位output [7:0] vga_r,     //vga信号红色视频信号output [7:0] vga_g,     //vga信号绿色视频信号output [7:0] vga_b,     //vga信号蓝色视频信号output vga_hs,          //行同步信号output vga_vs,          //场同步信号output vga_de,          //vga信号有效,如当前时刻传输数据有效,即为1;否则为0;input turn_mode,        //按键。按下为高电平,切换vga显示模式output [3:0] mode       //当前显示模式,用4位编码);//---------------------------------//
// 水平扫描参数的设定 800*600 60HZ
//--------------------------------//
parameter H_Total = 1056 - 1;
parameter H_Sync = 128 - 1;
parameter H_Back = 88 - 1;
parameter H_Active = 800 - 1;
parameter H_Front = 40 - 1;
parameter H_Start = 216 - 1;
parameter H_End = 1016 - 1;//-------------------------------//
// 垂直扫描参数的设定 1280*720 60HZ
//-------------------------------//
parameter V_Total = 628 - 1;
parameter V_Sync = 4 - 1;
parameter V_Back = 23 - 1;
parameter V_Active = 600 - 1;
parameter V_Front = 1 - 1;
parameter V_Start = 27 - 1;
parameter V_End = 627 - 1;//行信号计数器
reg [11:0] x_cnt;
always @(posedge pixel_clk or posedge rst)
beginif(rst)x_cnt <= 12'd0;else if(x_cnt == H_Total)x_cnt <= 12'd0;elsex_cnt <= x_cnt + 1'b1;
end//根据时序图参数,产生行同步信号
reg hsync_r;
always @(posedge pixel_clk or posedge rst)
beginif(rst)hsync_r <= 1'b1;else if(x_cnt>=0 && x_cnt < H_Sync)hsync_r <= 1'b0;elsehsync_r <= 1'b1;
end//行信号有效,即当前数据有效
reg hs_de;
always @(posedge pixel_clk or posedge rst)
beginif(rst)hs_de <= 1'b0;else if(x_cnt>=H_Start && x_cnt<H_End)hs_de <= 1'b1;elsehs_de <= 1'b0;
end//场信号计数器
reg [11:0] y_cnt;
always @(posedge pixel_clk or posedge rst)
beginif(rst)y_cnt <= 12'd0;else if(y_cnt == V_Total)y_cnt <= 12'd0;else if(x_cnt == H_Total)y_cnt <= y_cnt + 1'b1;
end//根据时序图参数,产生场同步信号
reg vsync_r;
always @(posedge pixel_clk or posedge rst)
beginif(rst)vsync_r <= 1'b1;else if(y_cnt>=0 && y_cnt<V_Sync)vsync_r <= 1'b0;elsevsync_r <= 1'b1;
end//列信号有效,即当前数据有效
reg vs_de;
always @(posedge pixel_clk or posedge rst)
beginif(rst)vs_de <= 1'b0;else if(y_cnt>=V_Start && y_cnt<V_End)vs_de <= 1'b1;elsevs_de <= 1'b0;
end//按键消抖,按下后延时一段时间,再检测是否按下
reg [16:0] key_counter;
always @(posedge pixel_clk)
beginif(turn_mode)key_counter <= 17'd0;else if((turn_mode == 1'b0) && (key_counter <= 17'h11704))key_counter <= key_counter + 1'b1;
end//显示模式技术,每次按下按键,模式改变,最多有12种显示模式
reg [3:0] dis_mode;
assign mode = dis_mode;
always @(posedge pixel_clk)
beginif(key_counter == 17'h11704)beginif(dis_mode == 4'd12)dis_mode <= 4'd0;else dis_mode <= dis_mode +1'b1;end
end//产生小格子,黑白棋盘
reg [7:0] grid_data_1;
always @(posedge pixel_clk)
beginif((x_cnt[4] == 1'b0) ^ (y_cnt[4] == 1'b0))grid_data_1 <= 8'h00;elsegrid_data_1 <= 8'hff;
end//产生大格子,黑白棋盘
reg [7:0] grid_data_2;
always @(posedge pixel_clk)
beginif((x_cnt[6] == 1'b0) ^ (y_cnt[6] == 1'b0))grid_data_2 <= 8'h00;elsegrid_data_2 <= 8'hff;
end//产生彩条
reg [23:0] color_bar;
always @(posedge pixel_clk)
beginif(x_cnt>=216 && x_cnt<316)color_bar <= 24'hff0000;else if(x_cnt>=316 && x_cnt<416)color_bar <= 24'h00ff00;else if(x_cnt>=416 && x_cnt<516)color_bar <= 24'h0000ff;else if(x_cnt>=516 && x_cnt<616)color_bar <= 24'hff00ff;else if(x_cnt>=616 && x_cnt<716)color_bar <= 24'hffff00;else if(x_cnt>=716 && x_cnt<816)color_bar <= 24'h00ffff;else if(x_cnt>=816 && x_cnt<916)color_bar <= 24'hffffff;else if(x_cnt>=916 && x_cnt<1016)color_bar <= 24'h000000;elsecolor_bar <= color_bar;
end//根据显示模式传输rgb信号到缓存器中
reg [7:0] vga_r_reg;
reg [7:0] vga_g_reg;
reg [7:0] vga_b_reg;
always @(posedge pixel_clk or posedge rst)
beginif(rst)beginvga_r_reg <= 8'd0;vga_g_reg <= 8'd0;vga_b_reg <= 8'd0;endelsebegincase(dis_mode)4'd0:                   //全黑beginvga_r_reg <= 8'd0;vga_g_reg <= 8'd0;vga_b_reg <= 8'd0;end4'd1:                   //全白beginvga_r_reg <= 8'b1111_1111;vga_g_reg <= 8'b1111_1111;vga_b_reg <= 8'b1111_1111;end4'd2:                   //全红beginvga_r_reg <= 8'b1111_1111;vga_g_reg <= 8'd0;vga_b_reg <= 8'd0;end4'd3:                   //全绿beginvga_r_reg <= 8'd0;vga_g_reg <= 8'b1111_1111;vga_b_reg <= 8'd0;end4'd4:                   //全蓝beginvga_r_reg <= 8'd0;vga_g_reg <= 8'd0;vga_b_reg <= 8'b1111_1111;end4'd5:                   //小格子,黑白棋盘beginvga_r_reg <= grid_data_1;vga_g_reg <= grid_data_1;vga_b_reg <= grid_data_1;end4'd6:                   //大格子,黑白棋盘beginvga_r_reg <= grid_data_2;vga_g_reg <= grid_data_2;vga_b_reg <= grid_data_2;end4'd7:                   //根据行信号渐变,周期性从黑到白beginvga_r_reg <= x_cnt[7:0];vga_g_reg <= x_cnt[7:0];vga_b_reg <= x_cnt[7:0];end4'd8:                   //根据场信号渐变,周期性从黑到白beginvga_r_reg <= y_cnt[7:0];vga_g_reg <= y_cnt[7:0];vga_b_reg <= y_cnt[7:0];end4'd9:                   //根据行信号渐变,周期性红色从浅到深beginvga_r_reg <= x_cnt[7:0];vga_g_reg <= 8'd0;vga_b_reg <= 8'd0;end4'd10:                  //根据列信号渐变,周期性绿色从浅到深beginvga_r_reg <= 8'd0;vga_g_reg <= x_cnt[7:0];vga_b_reg <= 8'd0;end4'd11:                  //根据行信号渐变,周期性蓝色从浅到深beginvga_r_reg <= 8'd0;vga_g_reg <= 8'd0;vga_b_reg <= x_cnt[7:0];end4'd12:                 //彩条信号beginvga_r_reg <= color_bar[23:16];vga_g_reg <= color_bar[15:8];vga_b_reg <= color_bar[7:0];enddefault:beginvga_r_reg <= 8'b1111_1111;vga_g_reg <= 8'b1111_1111;vga_b_reg <= 8'b1111_1111;endendcaseend
end//将这些寄存器中的信号输出
assign vga_hs = hsync_r;
assign vga_vs = vsync_r;
assign vga_de = hs_de & vs_de;  //只有当行信号和场信号同时有效时数据才有效
assign vga_r = (hs_de & vs_de) ? vga_r_reg : 8'h0;
assign vga_g = (hs_de & vs_de) ? vga_g_reg : 8'h0;
assign vga_b = (hs_de & vs_de) ? vga_b_reg : 8'h0;endmodule

由于VGA信号是800×600@60HZ,我们还需要一个像素时钟40MHZ。zedboard的PL部分默认的时钟是100MHZ,所以我们还需要一个时钟单元来产生40MHZ的特定时钟。分频的方法不稳定,不推荐。

点击准备添加IP核。
如下图所示找到clocking wizard。打开它,开始配置其功能。

这些都默认不改动,时钟是100MHZ。

修改输出时钟为40MHZ,其他不做修改。

直接点击OK,创建IP核。

点击generate产生IP核。

最后会产生这个,我们可以通过Verilog调用这个模块。

最后编写顶层Verilog代码:只是把前面几个模块包进来。
vga_disp.v

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2017/07/27 23:12:46
// Design Name:
// Module Name: vga_disp
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vga_disp(input clk100M,input rst,input key,output [3:0] vga_r,output [3:0] vga_g,output [3:0] vga_b,output vga_hs,output vga_vs,output [3:0] led);wire pixel_clk;wire [7:0] R, G, B;wire HS, VS, DE;assign vga_r = R[7:4];assign vga_g = G[7:4];assign vga_b = B[7:4];assign vga_hs = HS;assign vga_vs = VS;vga_data_gen vga_data_gen(.pixel_clk(pixel_clk),.rst(rst),.vga_r(R),.vga_g(G),.vga_b(B),.vga_hs(HS),.vga_vs(VS),.vga_de(DE),.turn_mode(key),.mode(led));clk_wiz_0 clk(.clk_out1(pixel_clk),.reset(1'b0),.locked(),.clk_in1(clk100M));endmodule

编写引脚约束文件,在官方给出的原理图中都可以查到。
pins.xdc

# Clk(板子上的GCLK)
set_property PACKAGE_PIN Y9 [get_ports {clk100M}]
set_property IOSTANDARD LVCMOS33 [get_ports {clk100M}]# Rst(板子上的BTNU)
set_property PACKAGE_PIN T18 [get_ports {rst}]
set_property IOSTANDARD LVCMOS33 [get_ports {rst}]# key 板子上的按键
set_property PACKAGE_PIN P16 [get_ports {key}]
set_property IOSTANDARD LVCMOS33 [get_ports {key}]# Led0
set_property PACKAGE_PIN T22 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]# Led1
set_property PACKAGE_PIN T21 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]# Led2
set_property PACKAGE_PIN U22 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]# Led3
set_property PACKAGE_PIN U21 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]set_property PACKAGE_PIN  Y19  [get_ports {vga_vs}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_vs}]set_property PACKAGE_PIN  AA19  [get_ports {vga_hs}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_hs}]set_property PACKAGE_PIN  V20   [get_ports {vga_r[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[0]}]
set_property PACKAGE_PIN    U20 [get_ports {vga_r[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[1]}]
set_property PACKAGE_PIN   V19  [get_ports {vga_r[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[2]}]
set_property PACKAGE_PIN   V18  [get_ports {vga_r[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[3]}]set_property PACKAGE_PIN  AB22   [get_ports {vga_g[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[0]}]
set_property PACKAGE_PIN   AA22  [get_ports {vga_g[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[1]}]
set_property PACKAGE_PIN   AB21  [get_ports {vga_g[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[2]}]
set_property PACKAGE_PIN   AA21  [get_ports {vga_g[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[3]}]set_property PACKAGE_PIN   Y21  [get_ports {vga_b[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[0]}]
set_property PACKAGE_PIN   Y20  [get_ports {vga_b[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[1]}]
set_property PACKAGE_PIN   AB20  [get_ports {vga_b[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[2]}]
set_property PACKAGE_PIN   AB19  [get_ports {vga_b[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[3]}]

分析综合产生比特流文件,后进行下载。

按键设置:
图中BTNU键位复位键;BTNC键位模式切换键,每按一次切换显示模式。

连上vga线,可以看到现象如下:

Zedboard学习(七):VGA显示相关推荐

  1. FPGA学习.4——VGA显示驱动设计

    前言 图像显示设备在日常生活中随处可见,例如家庭电视机.计算机显示屏幕等,这些设备之所以能够显示我们需要的数据图像信息,归功于视频传输接口.常见的视频传输接口有三种:VGA接口.DVI接口和HDMI接 ...

  2. 【四 zedboard】 VGA显示彩条

    观看开源骚客第二季并结合自己手上的zedboard板子,实现了VGA彩条显示. 首先打开zedboard的用户手册查看vga相关的接口.zedboard的资料可以到digilent官网下载(https ...

  3. 【Zedboard】FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现

    [Zedboard]FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现 在项目开始到目前为止已经完成了在Zedboard的PL部分即FPG ...

  4. FPGA学习——VGA显示

    FPGA学习--VGA显示 一.VGA原理 (一)VGA协议 (二)VGA端口结构 (三)⾊彩原理 (四)扫描原理 1.扫描方式 2.逐行扫描 3.隔行扫描 (五)⾏场信号 二.显示姓名学号 (一)实 ...

  5. ddr传输 pl ps_Vitis ZYNQ开发秘籍 PS 端任意控制 VGA 显示画面最终实现

    上一篇文章,<Vitis ZYNQ开发秘籍>- PS 端任意控制 VGA 显示画面的硬件架构,已经介绍了在 Vivado 中需要调用的 IP 已经各 IP 间的连线.而在实现显示的功能,咱 ...

  6. OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)

    OpenCV与图像处理学习七--传统图像分割之阈值法(固定阈值.自适应阈值.大津阈值) 一.固定阈值图像分割 1.1 直方图双峰法 1.2 OpenCV中的固定阈值分割 二.自动阈值图像分割 2.1 ...

  7. FPGA实现VGA显示(一)——————屏幕驱动及color_bar显示

    VGA显示,就是屏幕应用VGA接口线点亮屏幕.同样需要遵守一定的条件.符合时序,才能点亮屏幕,控制屏幕的显示. 这里参考 http://dengkanwen.com/70.html 感谢,同时这里还有 ...

  8. VmodCAM图像采集 VGA显示

    先上图 总体框图 效果图 效果不是很好,因为暂时用的是zedboard自带的VGA,其只能RGB只有3*3*3的彩色度 VmodCAM原理图 VmodCAM的zedboard管脚约束见:http:// ...

  9. 【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分

    目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 × 600@60Hz,分别显示三种 ...

  10. 常见硬件术语手册!绝对权威!(转!)七、显示卡术语解释

    七.显示卡术语解释 EDO DRAM (Extended Data Out DRAM):扩展数据输出DRAM.对DRAM的访问模式进行一些改进,缩短内存有效访问的时间. VRAM (Video DRA ...

最新文章

  1. tableau必知必会之如何将 Tableau Server 从 Windows 迁移到 Linux 的方法
  2. 工业用微型计算机(23)-汇编语言基本结构
  3. [TCP/IP] TCP如何保证可靠性
  4. RecyclerView加载不同view实现效果--IT蓝豹
  5. Jquery ajax 学习笔记
  6. MySQL:日期函数、时间函数总结
  7. java 异步_聊聊java高并发系统之异步非阻塞
  8. Windows常用快捷键整理
  9. SqlServer2008r2卸载
  10. python降维可视化 自编码_deep learning 自编码算法详细理解与代码实现(超详细)...
  11. 软件工程师如何应对面试的可怕“反乌托邦世界”?
  12. AngularJS+ASP.NET MVC+SignalR实现消息推送
  13. 请教 indy 中的 tldUdpServer 如何实现对本地端口6100进行监听!
  14. 测测你的杀毒软件强弱等级吧!!!!!
  15. Configuration Opennebula3.8 4.x Virtual Machines Contextualizing
  16. 射频电路习题解答(一)——利用电子smith图解题
  17. 怎么用计算机算化学,化学计算机
  18. 分块上(下)三角矩阵的行列式
  19. 【SpringBoot项目实战】之Chrome谷歌浏览器全屏
  20. PyQt5,一个好的qt教程。

热门文章

  1. 进制转换(sdut1252)_JAVA
  2. 第四讲、Linux常用命令
  3. Sharding-JDBC(二)2.0.3版本实践
  4. 数据结构与算法(4)——优先队列和堆
  5. Java模块化之路 —— OSGI介绍
  6. alibaba JSON TypeReference 复杂类型转换
  7. Eclipse、NetBeans、IntelliJ集成开发工具 Java IDE
  8. 老鼠怕猫是鼻子决定的?!
  9. 第六章 深度学习(中下)
  10. 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.2. 鸟哥的Linux苦难经验全都录)