前言
什么是VGA?
VGA(视频图形阵列)是IBM公司制定的一种视频数据传输标准。
接口信号主要有5个:R(Red),G(Green),B(Blue),HS(Horizontal synchronization水平同步),VS(Vertical synchronization垂直同步)。水平同步也叫行(line)同步,垂直同步也叫帧(frame)同步。信号都是模拟信号。
用途:连接CRT显示器或者带VGA接口的LCD液晶显示器。
VGA的接口原理是什么?行消隐,场消隐?
逐行扫描的方式,电子束从屏幕左上角一点开始,从左向右逐行扫描。每扫描完一行,电子束回到屏幕的左边下一行的起始位置。当所有行扫描完毕后,电子束回到屏幕的左上角起始位置,开始下一次扫描。水平方向电子束从右侧回到左侧所需的时间叫行消隐;电子束从右下角回到左上角起始位置所需的时间叫场消隐。
听大佬说缩短消隐区,但太短测试我未通过,还是按标准来吧。
VGA时序参数?
可以从网站上查询到你所需要的参数:http://tinyvga.com/vga-timing
本次进行1024*768分辨率下的VGA三道杠条纹显示开发:
VGA接口的工作时序?
图像的显示是以像素为单位的,行同步信号hs的负脉冲到来时要由RGB送出在当前行显示的像素,下一个负向脉冲用来显示下一行。当整个屏幕显示一遍后,由帧同步信号vs送出一个负向脉冲,又从左上角显示。
功能划分:(懒到不想画图了)
编码实现:
系统时钟确定:T=刷新hz*总像素点
总像素点=水平计数*垂直计数=1344*806
推得:T=60*1344*806=65mhz(约等于)
坐标与hs、vs信号产生。
1 //************************************************ 2 // Filename : coo_out.v 3 // Author : kingstacker 4 // Company : School 5 // Email : kingstacker_work@163.com 6 // Device : Altera cyclone4 ep4ce6f17c8 7 // Description : product the coodinate and hs vs; 8 //************************************************ 9 module coo_out #(parameter WIDTH = 10)( 10 //input; 11 input wire clk, //65mhz; 12 input wire rst_n, 13 //output; 14 output wire hs, //horizontal synchronization; 15 output wire vs, //vertical syn; 16 output reg [WIDTH-1:0] line_coo, //line coodinate; 17 output reg [WIDTH-1:0] ver_coo //vertical coodinate; 18 ); //1024*768; 19 localparam HTA = 11'd136, //sync pulse; 20 HTB = 11'd160, //back porch; 21 HTC = 11'd1024, //visible area; 22 HTD = 11'd24, //front porch; 23 VTA = 11'd6, //sync pulse; 24 VTB = 11'd29, //back porch; 25 VTC = 11'd768, //visible area; 26 VTD = 11'd3, //front porch; 27 LINE_CNTMAX = HTA+HTB+HTC+HTD-1'b1, //max line count; 28 VER_CNTMAX = VTA+VTB+VTC+VTD-1'b1, //max ver count; 29 HSTART = HTA+HTB, 30 VSTART = VTA+VTB; 31 reg [WIDTH+1:0] line_cnt; 32 reg [WIDTH+1:0] ver_cnt; 33 always @(posedge clk or negedge rst_n) begin 34 if (~rst_n) begin 35 line_cnt <= 11'd0; 36 end //if 37 else begin 38 if (line_cnt == LINE_CNTMAX) begin 39 line_cnt <= 11'd0; 40 end //if 41 else begin 42 line_cnt <= line_cnt + 1'b1; 43 end //else 44 end //else 45 end //always 46 always @(posedge clk or negedge rst_n) begin 47 if (~rst_n) begin 48 ver_cnt <= 11'd0; 49 end //if 50 else begin 51 if ((ver_cnt == VER_CNTMAX)&&(line_cnt == LINE_CNTMAX)) begin 52 ver_cnt <= 11'd0; 53 end //if 54 else begin 55 ver_cnt <= (line_cnt == LINE_CNTMAX)? (ver_cnt + 1'b1) : ver_cnt; 56 end //else 57 end //else 58 end //always 59 assign hs = (line_cnt < HTA) ? 1'b0 : 1'b1; 60 assign vs = (ver_cnt < VTA) ? 1'b0 : 1'b1; 61 always @(posedge clk or negedge rst_n) begin 62 if (~rst_n) begin 63 line_coo <= 0; 64 ver_coo <= 0; 65 end //if 66 else begin 67 if((line_cnt >= HSTART)&&(line_cnt < HSTART + HTC)&&(ver_cnt >=VSTART)&&(ver_cnt < VSTART + VTC)) begin 68 line_coo <= line_cnt - HSTART; 69 ver_coo <= ver_cnt - VSTART; 70 end 71 end //else 72 end //always 73 74 75 endmodule
三道杠产生:
1 //************************************************ 2 // Filename : color_out.v 3 // Author : kingstacker 4 // Company : School 5 // Email : kingstacker_work@163.com 6 // Device : Altera cyclone4 ep4ce6f17c8 7 // Description : 8 //************************************************ 9 module color_out #(parameter WIDTH = 10)( 10 //input; 11 input wire clk, 12 input wire rst_n, 13 input wire [WIDTH-1:0] line_coo, 14 input wire [WIDTH-1:0] ver_coo, 15 //output; 16 output reg [15:0] rgb_o 17 ); 18 always @(posedge clk or negedge rst_n) begin 19 if (~rst_n) begin 20 rgb_o <= 16'd0; 21 end //if 22 else begin 23 if(ver_coo < 10'd255) begin 24 rgb_o <= {5'b11111,6'd0,5'd0}; 25 end 26 else begin 27 if (ver_coo < 10'd511) begin 28 rgb_o <= {5'd0,6'b111111,5'd0}; 29 end 30 else begin 31 rgb_o <= {5'd0,6'd0,5'b11111}; 32 end 33 end 34 end //else 35 end //always 36 37 endmodule
综合资源使用:
抓波:
接显示器看看:三道杠少年
修改color_out:九宫格(很无聊的东西hhhhhh)
图片放rom显示:100*100
mif文件可由matalb生成,也可以用下面两个软件生成(更方便):
用lmage2Lcd生成bin文件:
bin文件转换为mif文件:
再把mif文件放rom即可。
显示器显示图片:
以上。