lcytms
发表于 2017-2-13 19:49:38
帧(竖直方向)同步时序:
lcytms
发表于 2017-2-13 19:51:22
说明:
VGA中定义行时序和帧时序都需要同步脉冲(a段),显示后沿(b段)、显示时序段(c段)和显示前沿(d段)四部分。
VGA工业标准显示模式要求:行同步、帧同步都为负极性,即同步脉冲要求是负脉冲。
由VGA行时序可知:每一行都有一个负极性行同步脉冲(a段),是数据行的结束标志,同时也是下一行的开始标志。
在同步脉冲之后为显示后沿(b段),在显示时序段(c段)显示器为亮的过程,RGB数据驱动一行上的每一个像素点,从而显示一行。
在一行的最后为显示前沿(d段)。
在显示时间段之外没有图像投射到屏幕是插入消隐信号。
同步脉冲、显示后沿和显示前沿都是在行消隐间隔内,当消隐有效时,RGB信号无效,屏幕不显示数据。
VGA的帧时序与行时序分析基本一样。
lcytms
发表于 2017-2-13 19:55:27
5)显示标准
VGA有许多的显示标准,如下表:
lcytms
发表于 2017-2-14 11:15:15
三、实验内容:
以本实验的显示标准800*600*60Hz为例。
(800为列数,600为行数,60Hz为刷新一屏的频率,即帧频)
行时序:每个显示行包括1056列(a+b+c+d=e段),其中800(c段)为有效显示区,每一行有一个行同步信号(a段),为128个行周期的低电平。
帧时序:屏幕对应的行数为628(a+b+c+d=e段),其中600(c段)为显示行;每行均有行同步信号(a段),为4个行周期的低电平。
由此可知:帧频为60Hz,行频为628*60=37680Hz,单点需要的时钟频率:1056*628*60约为39.79MHz,约为40MHz。
屏幕显示有效区域如下图:
lcytms
发表于 2017-2-14 11:17:02
四、实验步骤
原理清楚以后,我们本次的任务是设计VGA控制器,驱动液晶屏显示器显示全红色。
VGA的工作原理既然已经清楚,我们下面来进行系统设计。
命名VGA驱动逻辑为vga。
架构图如下所示。
lcytms
发表于 2017-2-14 11:18:18
在前级加上锁相环模块pll、后级加上RGB解码模块rgb后,总体架构图如下。
其中,锁相环模块pll产生40MHz时钟信号。
而RGB解码模块rgb将8位的RGB信号编码解析为单独的r、g、b三种信号,输出至开发板上的VGA对应电路。
lcytms
发表于 2017-2-14 11:20:16
本帖最后由 lcytms 于 2017-2-14 11:27 编辑
先从VGA驱动逻辑模块vga.v做起吧!
新建工程文件夹vga。
新建vga.v(显示纯色)文件。
module vga(clk, rst_n, rgb8, hsync, vsync);
input clk, rst_n;
output rgb8;
output hsync, vsync;
reg hcnt, vcnt;
wire hflag, vflag;
///// 800*600*60 40.0MHz = 1056(128+88+800+40) * 628(4+23+600+1) * 60Hz
parameter ha = 128,
hb = 88,
hc = 800,
hd = 40,
he = 1056;
parameter va = 4,
vb = 23,
vc = 600,
vd = 1,
ve = 628;
localparam hab = ha + hb,
hac = ha + hb + hc;
localparam vab = va + vb,
vac = va + vb + vc;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
hcnt <= 0;
vcnt <= 0;
end
else
begin
if ((vcnt == ve - 1) && (hcnt == he - 1))
begin
hcnt <= 0;
vcnt <= 0;
end
else
begin
if (hcnt == he - 1)
begin
hcnt <= 0;
vcnt <= vcnt + 1;
end
else
hcnt <= hcnt + 1;
end
end
end
assign hsync = (hcnt < ha) ? 1'b0 : 1'b1;
assign vsync = (vcnt < va) ? 1'b0 : 1'b1;
assign hflag = ((hcnt >= hab) && (hcnt < hac)) ? 1'b1 : 1'b0;
assign vflag = ((vcnt >= vab) && (vcnt < vac)) ? 1'b1 : 1'b0;
wire block;
assign block = 8'b111_000_00;
assign rgb8 = (hflag && vflag) ? block : 8'b000_000_00;
endmodule
lcytms
发表于 2017-2-14 11:32:32
参照第十四讲的pll,使用IP核建立pll模块。
输出40MHz时钟。
lcytms
发表于 2017-2-14 11:33:31
本帖最后由 lcytms 于 2017-2-14 11:35 编辑
新建RGB解码模块rgb.v。
module rgb(rgb8, r, g, b);
input rgb8;
output r, g;
output b;
assign r = rgb8;
assign g = rgb8;
assign b = rgb8;
endmodule
lcytms
发表于 2017-2-14 11:36:33
本帖最后由 lcytms 于 2017-2-14 11:39 编辑
新建top.v顶层模块,将以上三个模块都加入到top.v顶层模块中进行例化。
将top.v模块设置为顶层模块。
编写top.v模块如下。
module top (clk, rst_n, r, g, b, hsync, vsync);
input clk, rst_n;
output r, g;
output b;
output hsync, vsync;
wire clk_40M;
wire rgb8;
pll pll (.areset(~rst_n), .inclk0(clk), .c0(clk_40M));
vga vga (.clk(clk_40M), .rst_n(rst_n), .rgb8(rgb8), .hsync(hsync), .vsync(vsync));
rgb rgb (.rgb8(rgb8), .r(r), .g(g), .b(b));
endmodule