vga图像显示控制


VGA 图像显示控制器
一、摘要和关键词
摘要:VGA 显示屏显示采用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉
的荧光屏上,产生 GRB 基色,合成一个彩色像素。扫描从屏幕的左上方开始,从左到右, 从上到下,逐行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间, CRT 对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同 步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,并预备进行下一次的扫 描。通过控制扫描计数器不同值时对 RGB 三原色信号的控制,来完成显示设计。
关键词:行列扫描 行列同步 RGB 三原色控制
二、设计任务要求
实验目的
1. 熟练掌握 VHDL 语言和QuartusII 软件的使用; 2. 理解状态机的工作原理和设计方法; 3. 掌握利用 EDA 工具进行自顶向下的电子系统设计方法; 4. 熟悉 VGA 接口协议规范。 实验要求: 设计一个VGA 图像显示控制器,达到如下功能:
显示模式为640×480×60HZ 模式; 用拨码开关控制R、G、B(每个2 位),使显示器可以显示64种纯色; 在显示器上显示横向彩条信号(至少6 种颜色); 在显示器上显示纵向彩条信号(至少8 种颜色); 在显示器上显示自行设定的图形、图像等。 选做:自拟其它功能。
三、实验原理
1、显示控制原理 常见的彩色显示器一般由阴极射线管(CRT)构成,彩色由 GRB(Green Red Blue)基色组成。
显示采用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生 GRB 基色,合成一个彩色像素。扫描从屏幕的左上方开始,从左到右,从上到下,逐行扫 描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT、对电子束进 行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步, 并使扫描回到屏幕的左上方,同时进行场消隐,并预备进行下一次的扫描。VGA 显示控制 器控制 CRT 显示图象的过程如图 1 所示

2、VGA 时序信号 计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为R、G、 B 三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。对于模拟显示设备, 如模拟CRT 显示器,信号被直接送到相应的处理电路,驱动控制显像管生成图像。设计 VGA 控制器的关键是产生符合VGA 接口协议规定的行同步和场同步信号,它们的时序关系如下 图所示:
h_sync:水平同步信号(负脉冲),每个水平扫描周期显示器刷新一行; v_sync:垂直同步信号(负脉冲),每个垂直扫描周期显示器刷新一帧;
2

行同步信号(HS)

时序名称 前沿 行同步 数据 后沿
总像素数

时钟数(像素数) 16 96 640 48 800

场同步信号(VS)

时序名称 前沿 场同步 数据 后沿 总行数

行数 10 2 480 33 525

按照每秒60帧的刷新速度来计算,所需要的时钟频率为: 频率=60Hz(帧数)×525(行)×800(每一行像素数)=25.2MHz 所以我们通过开发系统的 50MHz 时钟资源,通过时钟分频产生 25MHz 的频率即可。 虽然没有达到精确的 25.2MHz 的时钟频率(刷新率可能会是 59Hz),但是并不会造成 影响。 3、VGA 显示器的工作过程
以 屏 幕 左 上 角 的 那 个 像 素 作 为 原 点 ( 1,1 )。 当 显 示 器 接 收 到 控 制 器 输 出 的 v_sync 信号,则开始一个新的垂直刷新循环,同时控制器输出 h_sync 信号。当经 过 P+Q=1.084ms 的时间后,准备开始水平刷新循环,当 h_sync 信号的下降沿到来时, 即开始刷新第一行(行数加 1)。再经过 B+C = 5.66 s 的时间后,开始刷新第一 行的第一个像素(列数加 1),并按照所需的时钟频率,刷新此行中其余像素。直到 显示器接收到下一个 h_sync 信号,又开始刷新第二行。 重复此过程,直到刷新到屏幕的底部。当刷新了最下面一行的最后一个像素后,显 示器即完成了一帧的刷新,控制器又输出 v_sync 信号,显示器又开始一个新的垂直 刷新循环。

四、系统设计(包括设计思路、总体框图、分块设计)

总体设计思路:

VGA 显示器的控制器可划分为 3 个子模块:

I.时钟分频子模块;

II.时序控制子模块 ,提供同步信号(h_sync 和 v_sync)及像素位置信息;

III.生成图形子模块,接收像素位置信息,并输出颜色信息;

由于系统时钟为 50MHZ,实验所需频率为 25MHZ,故时钟分频模块只需在程序中通过

分频语句完成;生成图形子模块由系统提供;所以重点设计的模块就是时序控制模

块。

总体系统框图如下:

VGA



HS



系统时 钟

分频模块



VS





R



显 示



G











B



拨码输入
3

时序控制模块设计

Hcnt=799

显示

后沿

Hcnt=751

同步

Hcnt=639 前沿 Hcnt=655

行同步状态机状态转移图

Vcnt=524 后沿

显示

Vcnt=491

同步

Vcnt=479 前沿
Vcnt=489

列同步状态机状态转移图

时序控制模块流程图:

4

时钟触发 时钟二分频

当前坐标是否在 显示范围内?




根据拨码开关选择 像素输出模式/颜色

行坐标加1

是否超过行边 界?




列坐标加1,行坐标 归0

是否超过列边 界?



是 列坐标归0

五、源程序(含注释)
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity vgacode is port(
sw0 : in std_logic; --拨码开关输入 sw1 : in std_logic; sw2 : in std_logic; sw3 : in std_logic; sw4 : in std_logic; sw5 : in std_logic;
5

sw6 : in std_logic; sw7 : in std_logic; clk : in std_logic; --系统时钟输入 hsync : out std_logic;--输出行同步、列同步以及 R.G.B 信号 vsync : out std_logic; rdata : out std_logic; gdata : out std_logic; bdata : out std_logic; lrdata : out std_logic; lgdata : out std_logic; lbdata : out std_logic ); end vgacode;

architecture behave of vgacode is -- horizontal timing signals constant h_data: integer:=640; --VGA 时序中几个关键数据 constant h_front: integer:=16; constant h_back: integer:=48; constant h_sync: integer:=96; constant h_period: integer:= h_sync + h_data + h_front + h_back;

--800

-- vertical timing signals constant v_data: integer:=480; constant v_front: integer:=10; constant v_back: integer:=33; constant v_sync: integer:=2; constant v_period: integer:= v_sync + v_data + v_front + v_back;

--525

signal henable, venable : std_logic;

signal clk25M : std_logic;

signal hcnt: std_logic_vector(9 downto 0);

-- horizontal pixel counter

signal vcnt: std_logic_vector(9 downto 0);

-- vertical line counter

begin

process(clk)

begin

if clk'event and clk = '1' then --由系统时钟分频得到 25MHZ 的频率信号

clk25M <= not clk25M;

end if;

end process;

process(clk25M) ---行扫描 begin
if (clk25M'event and clk25M = '1') then

6

if hcnt < h_period then hcnt <= hcnt + 1;
else hcnt <= (others => '0');
end if; end if; end process;

process(clk25M)

--行同步

begin

if (clk25M'event and clk25M = '1') then

if (hcnt >= (h_data + h_front)

and hcnt < (h_data + h_sync + h_front)) then

hsync <= '0';

else

hsync <= '1';

end if;

end if;

end process;

process(clk25M)

--列扫描

begin

if (clk25M'event and clk25M = '1') then

if hcnt = (h_data + h_sync + h_front) then

if vcnt < v_period then

vcnt <= vcnt + 1;

else

vcnt <= (others => '0');

end if;

end if;

end if;

end process;

process(clk25M)

--列同步

begin

if (clk25M'event and clk25M = '1') then

if (vcnt >= (v_data + v_front)

and vcnt < (v_data + v_sync + v_front)) then

vsync <= '0';

else

vsync <= '1';

end if;

end if;

7

end process;

process(clk25M)

--行显示

begin

if (clk25M'event and clk25M = '1') then

if hcnt < h_data then

henable <= '1';

else

henable <= '0';

end if;

end if;

end process;

process(clk25M)

--列显示

begin

if (clk25M'event and clk25M = '1') then

if vcnt < v_data then

venable <= '1';

else

venable <= '0';

end if;

end if;

end process;

process(clk25M,henable,venable) --几种显示模式

begin

if (clk25M'event and clk25M = '1') then

if(henable='1' and venable='1') then

if sw0 = '0' and sw1 = '0' then

--64 color

rdata <= sw7 ;

gdata <= sw5 ;

bdata <= sw3 ;

lrdata <= sw6;

lgdata <= sw4 ;

lbdata <= sw2 ; else if sw1 = '0' and sw0 = '1' then --竖条纹

rdata <= hcnt(9);

gdata <= hcnt(8);

bdata <= hcnt(7);

lrdata <= hcnt(6);

lgdata <= hcnt(5);

lbdata <= hcnt(4);

8

else if sw1 = '1' and sw0 = '0' then --横条纹 rdata <= vcnt(9); gdata <= vcnt(8); bdata <= vcnt(7); lrdata <= vcnt(6); lgdata <= vcnt(5); lbdata <= vcnt(4);
else if sw1 = '1' and sw0 = '1' then --棋盘显示 if ( henable = '1' and venable = '1' ) then if ( hcnt(4) = '0' and hcnt(3) = '0' and hcnt(2) ='0' and hcnt(1) = '0' and hcnt(0) = '0' )
or (vcnt(4) = '0' and vcnt(3) ='0' and vcnt(2) ='0' and vcnt(1) = '0' and vcnt(0) = '0' ) then
lrdata <= '0';lgdata <= '0';lbdata <= '0'; rdata <= '0';gdata <= '0';bdata <= '0'; else lrdata <= '1';lgdata <= '1' ;lbdata <= '0' ; rdata <= '1' ;gdata <= '0' ;bdata <= '0' ;
end if;

end if; end if; end process; end behave;

end if; end if; end if; end if;

六、实验器材

1. 计算机; 2. VGA显示器; 3. 直流稳压电源; 4. EDA 开发板及相应元器件

七、功能说明

本实验实现的功能时通过拨码开关控制显示器的图像显示。拨码开关一共有 8 个,D0~D1 控制模式,D2~D3 为 B 信号输入 D4~D5 为 G 信号输入 D6~D7 为 R 信号输入。
其中 D1D0=00,为纯色模式,通过控制前面 6 个拨码开关来调整显示器的颜色; D1D0=01 为横条纹显示; D1D0=10 为竖条纹显示; D1D0=11 为棋盘方式显示
后三个方式下条纹的宽度以及颜色都可以通过程序来修改控制。

9

棋盘模式
占用系统资源情况:
八、故障及问题分析
1、在实验中,第一次写出来的程序可以编译通过并很好的实现设计功能, 但程序显得过于冗长和复杂,重复性强。于是我在对实验的理解下做了一些简化, 结果简化后实验结果与预想的不同。仔细分析程序的逻辑顺序后发现对程序的细 小简化改变了程序的逻辑,所以造成了实验结果不对甚至出不来结果的现象。在 程序的编写过程中,我们应该首先分析各个端口的优先级顺序,这一点就可以利 用if语句首先进行判断。
2、而在编写vhdl源文件的过程中,我加深了对信号和变量的延时区别的理 解和对process“内部串行外部并行”的理解。
3、在实验中,写完程序编译时报错不含顶层实体名,刚开始始终找不出问 题在哪,翻阅了数字电路实验教程后,才明白在建立一个新的工程时在写顶层实 体名时,实体名、文件名必须和建立工程时所设定的顶层实体名相同。
4、实验中,需要对每一个端口指定器件的引脚,在引脚指定过程中需要参 照开发系统所给的I/O端口映射表,通过开发平台上每个I/O器件附近的I/O编号, 在映射表中找到相应的引脚名,填入相应的对话框。
5、在实验中所遇到的还有一个问题就是频率的选择,我们采用IO板上的时 钟资源,进行分频得到了25M这一频率,保证了实验的正常完成。这些都是实验 中的小问题,在实验中只有养成严谨科学的态度和作风,认真注意各个实验细节, 才能保证实验的最后成功。
九、实验心得
通过这次实验,我对数字电路的软件和硬件方面的知识有了进一步的了解。 实验开始选题时,觉得 vga 图像显示非常有意思,于是选了这个题目。但是因为 以前从来没有了解过 VGA 的显示原理和工作模式,刚开始入手的时候觉得非常茫 然,不知道从何处下手。在老师的引导下,我按照实验的整体过程,先查阅了相 关资料,了解了 VGA 显示和时序控制的相关原理,以及相关模块的连接。于是明 白这次实验设计的重点就在于 VGA 时序控制模块的设计。再仔细分析时序关系, 画出状态转移图,同步区、显示区、消隐区时计数器的数值,便可很方便的编出 程序。虽然在实验中也遇到了各种各样的问题,但最终都一一解决,也更让我体 会到实验中的乐趣。同时,通过 VGA 显示实验,我加深了对 EDA 技术的理解,初 步掌握了 QuartusII 软件图形编辑的使用。我接触了使用 VHDL 编程的一些基本
10

技术和方法,初步掌握 QuartusII 软件的使用方法、进一步熟悉了数字系统 VHDL 设计和仿真的流程以及硬件编程下载的基本技能,对以后 EDA 的继续学习奠定了 基础。
十、参考文献
《数字电路与逻辑设计实验教程》
11


相关文档

VGA图像显示控制器设计
VGA图像显示控制器
VGA图像显示
基于FPGA的VGA图像显示与控制
VGA图象显示控制器设计
数电实验-vga图像显示控制
VGA图像显示的设计与应用
VGA简单图像显示控制模块设计
VGA 图像显示控制器设计报告
VGA图像显示控制器设计报告
电脑版