基于FPGA进行VGA控制器设置实现显示器条纹显示
实验目的与要求:
VGA控制器设计实现显示器条纹显示
要求:通过FPGA板的VGA接口在显示器上显示一幅640*480由六条不同颜色的条纹组成的
图像。
实验内容:
VGA简介
VGA彩色显示器,彩色是由R、G、B(红、绿、蓝)三基色组成,CRT用逐行扫描方式实现图像显示,由VGA控制模块产生的水平同步信号(HS)和垂直同步信号(VS)控制阴极射线枪产生的电子束,打在涂有荧光粉的荧光屏上,产生R、G、B三基色,合成一个彩色像素。扫描从屏幕的左上方开始,由左至右,由上到下,逐行进行扫描,每扫完一行,电子束回到屏幕下一行的起始位置,在回扫期间,CRT对电子束进行消隐,每行结束是用行同步信号HS进行行同步;扫描完所有行,再由场同步信号VS进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。显示需要R,G,B,Hsync(行同步),Vsync(帧同步)五个信号输出到显示器,本设计按照VGA工业标准输出640*480@60Hz.对应的时序如下:
图1 VGA接口信号基本时序图
图2 FPGA板上的VGA接口
图3 VGA(640*480@60Hz)时序图
VGA显示的设计模块为:
hsclk
vs
VGA显示模r块
grst_n
b
说明:设计中FPGA板的VGA接口将R,G,B分别设为定义为2位,3位,3位,例如显示红色RGB可以输出为11000000,绿色输出为00111000,蓝色输出为00000111.
1 25MHz 640*480@60Hz模式下VGA的时序
规格说明
1. 像素时钟配置为25Mhz。
2. 编写代码时,需要用到的常数参考表一。
3. 输出到显示器上的条纹为从上到下依次为R G B R G B,640*80,。 4. 本实验使用FPGA板:Sparant3EXC3S500E,建project时,需要选择板的型号,。
实验
、步骤:
1、基本设计思想如下图所示:
分为这四个模块,产生Hsync(行同步),Vsync(帧同步)以及RGB色彩的输出。
2、具体设计VHDL代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity main is
port(clk,rst:in std_logic;
Vsync,Hsync:out std_logic;
data:out std_logic_vector(7 downto 0)
);
end main;
architecture Behavioral of main is
component dcn is ---------DCM 分频模块,输出25M 时钟
port ( CLKIN_IN : in std_logic;
RST_IN : in std_logic;
CLKFX_OUT : out std_logic; ----输出时钟
CLKIN_IBUFG_OUT : out std_logic;
LOCKED_OUT : out std_logic);
end component;
signal div_25m,Nrst: std_logic;
signal Vsys_20b:std_logic_vector(19 downto 0); signal Hsys_10b:std_logic_vector(9 downto 0); signal data_Vsend,data_Hsend:std_logic;
signal Scan_16b:std_logic_vector(15 downto 0); signal Scan_clc:std_logic;
signal data_sel:std_logic_vector(1 downto 0);
begin
div:dcn port map(clk,Nrst,div_25m,open,open); ---分频模块
Nrst<= not rst;
process(div_25m,rst)
begin
if rst='0' then
Vsys_20b<="00000000000000000000";
elsif div_25m'event and div_25m='1' then
Vsys_20b<=Vsys_20b + 1;
if Vsys_20b=416799 then
Vsys_20b<="00000000000000000000";
end if;
end if;
end process;
process(div_25m,rst,Vsys_20b)
begin
if rst='0' then
Vsync<='1';data_Vsend<='0';
elsif div_25m'event and div_25m='1' then
if Vsys_20b < 8000 then
Vsync<='1';data_Vsend<='0';
elsif Vsys_20b>=8000 and Vsys_20b<9600 then
Vsync<='0';data_Vsend<='0';
elsif Vsys_20b>=9600 and Vsys_20b<32800 then--128*255+160=32800
Vsync<='1';data_Vsend<='0';
elsif Vsys_20b>=32800 and Vsys_20b<416800 then
Vsync<='1';data_Vsend<='1';
end if;
end if;
end process;
process(div_25m,rst)
begin
if rst='0' then
Hsys_10b<="0000000000";
elsif div_25m'event and div_25m='1' then
Hsys_10b<=Hsys_10b + 1;
if Hsys_10b=799 then
Hsys_10b<="0000000000";
end if;
end if;
end process;
process(div_25m,rst,Hsys_10b)
begin
if rst='0' then
Hsync<='1';data_Hsend<='0';
elsif div_25m'event and div_25m='1' then
if Hsys_10b < 16 then
Hsync<='1';data_Hsend<='0';
elsif Hsys_10b>=16 and Hsys_10b<112 then
Hsync<='0';data_Hsend<='0';
elsif Hsys_10b>=112 and Hsys_10b<160 then
Hsync<='1';data_Hsend<='0';
elsif Hsys_10b>=160 and Hsys_10b<800 then
Hsync<='1';data_Hsend<='1';
end if;
end if;
end process;
process(div_25m,rst,data_Vsend )
begin
if rst='0' then --
Scan_16b<="0000000000000000";Scan_clc<='0';
elsif div_25m'event and div_25m='1' then ---
Scan_clc<='0';
if data_Vsend='1' then
Scan_16b<=Scan_16b + 1;
if Scan_16b=63999 then
Scan_16b<="0000000000000000";
Scan_clc<='1';
end if;
end if;
end if;
end process;
process(rst,div_25m,Scan_clc,data_sel,data_Vsend )
begin
if rst='0' then
data_sel<="00";
elsif div_25m'event and div_25m='1' then
if Scan_clc ='1' then
data_sel<=data_sel+1;
end if;
if data_sel="11" then
data_sel<="00";
end if;
end if;
end process;
process(rst,div_25m,data_Vsend,data_Hsend)
begin
if rst='0' then
data<="00000000";
elsif div_25m'event and div_25m='1' then
if data_Vsend ='1' and data_Hsend ='1' then --
case data_sel is
when "00"=> data<="11000000";
when "01"=> data<="00111000";
when "10"=> data<="00000111";
when others=> data<="00000000";
end case;
else
data<="00000000";
end if;
end if;
end process;
end Behavioral;
UCF 管脚定义 :
NET "clk" LOC = "P183";
NET clk IOSTANDARD = LVCMOS33;
NET "rst" LOC = "P142";#
NET "rst" PULLUP;
NET "rst" IOSTANDARD = LVCMOS33; NET "data(0)" LOC = "P74"; #
NET "data(1)" LOC = "P75"; #
NET "data(2)" LOC = "P76"; #
NET "data(3)" LOC = "P77"; #
NET "data(4)" LOC = "P78"; #
NET "data(5)" LOC = "P82"; #
NET "data(6)" LOC = "P83"; #
NET "data(7)" LOC = "P89"; #
NET "Vsync" LOC = "P68"; #
NET "Hsync" LOC = "P69"; #
DCM设置:
综合结果:
综合分析:
仿真波形
实际测试:
实验结论:
本实验设计达到了实验要求,产生了预期效果,通过本实验 ,进一步了解了 如何设计FPGA外部设备的 驱动时钟,对计数器的设计有了更深一步的认识。 进一步熟悉了FPGA涉及的过程以及方法
指导教师批阅意见:
成绩评定:
指导教师签字:
年 月 日 备注:
注:1、
内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生
时间应在学生提交实验报告时间后10日内。