1、
输入信号
clk :
时钟(每个象素点的显示时钟)
reset :
复位信号
2、
输出信号
vga_hs_control :
行同步
vga_vs_control :
场同步
;
vga_read_dispaly :
红
vga_green_dispaly :
绿
vga_blue_dispaly :
蓝
3、
技术参数
clk : 24M hs : 30KHZ vs : 57.14HZ
设计原理
VGA(
视频图形阵列
)
作为一种标准的显示接口得到广泛的应用
,
一般有专用芯片,本实验采用
FPGA(
现场可编程门阵列
)
设计
VGA
接口可以将要显示的数据直接送到显示器,节省了计算机的处理过程,加快了数据的处理速度,节约了硬件成本。
显示适配器有多种形式,它可按照所符合的视频显示标准来分类,业界制定了多种显示标准,从最初的
MDA
经历了
CGA
,
EGA
,
VGA
,
XGA,SVGA
等的发展过程。与相应的显示适配器标准相配的显示器也称之为
EGA
,
VGA
,
XGA
显示器等。实际上显示器的标准主要反映在它们的接口,显示功能和行,场工作频率上。
CRT
显示器的扫描方式
(1)
当栅扫描方式
从上向下依次顺序扫描
完一场称逐行扫描。一行用行频控制(
hs
)
,
一场用场频控制(
vs
)。扫完一行回来叫行消
隐,扫完一场回来叫场消隐
(2)
随机扫描方式
VGA
接口标准
时钟频率:
25
.
175 MHz(
像素输出的频率
)
;行频:
31. 469 Hz
;场频:
59
.
94 Hz
。
设计
VGA
设计
VGA
图像显示控制需要注意两个问题
L2]
:一个是时序的驱动,这是完成设计的关键,时序稍有偏差,显示必然不正常,甚至会损坏彩色显示器;另一个是
VGA
信号的电平驱动。显示控制器设计提示:显示器技术规格提供的行频一般在
30 kHz 45 kHz(
保守数据
)
,场频一般在
50 Hz
~
75 Hz(
保守数据
)
。针对以上保守数据,设计分辨率为
640x480
的显示接口(如图
4
所示),以
30 kHz
的行频进行扫描时所需时钟频率为:
30 kHz
×
800(
行周期
)=24 MHz
,则场频为:
30 kHz
÷
525(
场周期
)=5.14 Hz
。本实验实现在显示器上显示彩条的设计,初始时时
GRB=
“
000
”,用一记数器过一段时间使
R
取反,即变为红色。这样就有黑、红彩条了。
|
黑
蓝
红
品
绿
青
黄
白
|
R
G
B
|
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
|
实验验证
1、
仿真时序图
2、
验证平台及芯片
Xilinx
公司的
Xilinx Project Navigate
下载芯片为:
Xilinx Sparan2/xsc200
小结
1、
技术难点
显示器显示原理、
VGA
接口原理的理解
2
、设计技巧
3
、不足或改进措施
不足:功能单一(彩条显示)
改进:添加字符显示、图象显示、图形显示模块
参考资料
1 蒋本珊. 计算机组成原理与系统结构 北京航空航天大学出版社 p192-p198
2 陈姚节 卢建华. 基于FPGA的VGA显示接口的研究与设计
源程序
library ieee;
use ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity vga is
port(
reset : in std_logic;
clk : in std_logic;
vga_hs_control : out std_logic;
vga_vs_control : out std_logic;
vga_read_dispaly : out std_logic;
vga_green_dispaly : out std_logic;
vga_blue_dispaly : out std_logic
);
end vga;
ARCHITECTURE a OF vga IS
SIGNAL hs: STD_LOGIC;
SIGNAL vs: STD_LOGIC:='1';
SIGNAL GRB: STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
PROCESS (clk) --clk = 24MHZ hs = 30 Khz vs = 57hz
VARIABLE i : integer range 0 to 799:=0;
VARIABLE j : integer range 0 to 79:=0;
BEGIN
if reset = '1' then
GRB <= "000"; i:=96; j:=0; hs <= '1';
elsif clk'event and clk = '1' then
if i < 96 then
hs <= '0';
elsif i = 799 then
i:=0;
else
hs <= '1';
end if;
if j = 79 then
GRB(1) <= not GRB(1);
j:=0;
end if;
i:=i+1;
j:=j+1;
end if;
vga_hs_control <= hs;
END PROCESS ;
PROCESS (hs)
VARIABLE k : integer range 0 to 524:=0;
BEGIN
if reset = '1' then
k:=2; vs <= '1';
elsif hs'event and hs = '1' then
if k < 2 then
vs <= '0';
elsif k = 524 then
k:=0;
else
vs <= '1';
end if;
k:=k+1;
end if;
vga_vs_control <= vs;
END PROCESS ;
PROCESS (clk)
BEGIN
if clk'event and clk = '1' and vs = '1' and hs ='1' then
vga_green_dispaly <= GRB(2);
vga_read_dispaly <= GRB(1);
vga_blue_dispaly <= GRB(0);
end if;
END PROCESS ;
END a;