课程名称: 基于VHDL编程的FPGA设计
实验名称: VGA控制器设计实现显示器条纹显示
学院: 信息工程学院
专业: 电子信息工程 班级:
组号: 指导教师:
报告人: 学号:
实验时间: 2012 年 10 月 31 日 星期 三
实验地点 南区N413
实验报告提交时间: 2012.11.11
"
实验要求:
题目、VGA控制器设计实现显示器条纹显示
要求:通过FPGA板的VGA接口在显示器上显示一幅0*480由不同颜色的横向条纹组成的图像。(从上到下颜色分别为:红,蓝,绿,蓝,红,绿,红,蓝)
实验原理:
VGA彩色显示器,彩色是由R、G、B(红、绿、蓝)三基色组成,CRT用逐行扫描方式实现图像显示,由VGA控制模块产生的水平同步信号(HS)和垂直同步信号(VS)控制阴极射线产生的电子束,打在涂有荧光粉的荧光屏上,产生R、G、B三基色,合成一个彩色像素。扫描从屏幕的左上方开始,由左至右,由上到下,逐行进行扫描,每扫完一行,电子束回到屏幕下一行的起始位置,在回扫期间,CRT对电子束进行消隐,每行结束是用行同步信号HS进行行同步;扫描完所有行,再由场同步信号VS进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。显示需要R,G,B,Hsync(行同步),Vsync(帧同步)五个信号输出到显示器,本设计按照VGA工业标准输出0*480@60Hz。
对应的时序如下:
图1 VGA接口信号基本时序图
表1 25MHz 0*480@60Hz模式下VGA的时序
实验内容:
A.VHDL程序代码
library IEEE;
use IEEE.STD_LOGIC_11.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Color is
port(clk : in std_logic;
v,h : buffer std_logic;
rgb : buffer std_logic_vector(7 downto 0));
end Color;
architecture Behavioral of Color is
signal rgbs : std_logic_vector(7 downto 0):="00000000";
signal hs,vs : std_logic;
signal fclk : std_logic:='0';
begin
process(clk,fclk)
variable h_count :integer range 0 to 800 :=0;
variable v_count :integer range 0 to 521 :=0;
begin
--------------------------------------------
if(clk'event and clk='1') then
if(fclk='0') then
fclk <='1';
end if;
if(fclk='1') then
fclk <='0';
end if;
end if;
--------------------------------------------
--------------------------------------------
if(fclk'event and fclk='1') then
if(h_count=800) then h_count:=1;
if(v_count=521) then v_count:=1;
| else v_count:=v_count+1; end if;
else h_count:=h_count+1; end if; -------------------------------------------- if h_count>16 and h_count<112 then hs <='0'; else hs <='1'; end if; if v_count>10 and v_count<=12 then vs <='0'; else vs <='1'; end if; -------------------------------------------- if(h_count>160) and (h_count<800) then case v_count is when 41 to 100 => rgbs <="00000111"; when 101 to 160 => rgbs <="11000000"; when 161 to 220 => rgbs <="00111000"; when 221 to 280 => rgbs <="11000000"; when 281 to 340 => rgbs <="00000111"; when 341 to 400 => rgbs <="00111000"; when 401 to 460 => rgbs <="00000111"; when 461 to 521 => rgbs <="11000000";
when others => rgbs <="00000000"; end case; else rgbs<="00000000"; end if; -------------------------------------------- rgb <=rgbs; v <=vs; h <=hs; end if; end process; end Behavioral; |
LIBRARY ieee;
USE ieee.std_logic_11.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
ENTITY Test IS
END Test;
ARCHITECTURE behavior OF Test IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT Color
PORT(
clk : IN std_logic;
v : buffer std_logic;
h : buffer std_logic;
rgb : buffer std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
--Outputs
signal v : std_logic;
signal h : std_logic;
signal rgb : std_logic_vector(7 downto 0);
-- Clock period definitions
constant clk_period : time := 10 ns;
BEGIN
| -- Instantiate the Unit Under Test (UUT) uut: Color PORT MAP ( clk => clk, v => v, h => h, rgb => rgb ); -- Clock process definitions clk_process :process begin clk <= '0'; wait for clk_period/2; clk <= '1'; wait for clk_period/2; end process;
-- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. wait for 100 ns; wait for clk_period*10; -- insert stimulus here wait; end process; END; |
仿真波形
布局布线后的仿真波形:
仿真波形
实验结果:
ASM图
| 实验过程分析: 一、代码分析 I. 时钟配置分析。 像素时钟配置要求为25Mhz。在程序代码中可以通过两种方式实现25Mhz配置的时钟,第一种是通过 上学期EDA中所学的二分频思想;第二种则是调用IP Core的内部时钟。 II. 水平扫描周期与垂直扫描周期的分析。 通过时序分析图,以及参数表,分别读出了水平与垂直周期下的高低电平所占时钟的个数,并且成功 在代码段上实现出来。 III.8位颜色数据的读取规则。 在FPGA板子的VAG接口上,若端口R9,T8,R8,N8,P8,P6,U5,U4分别对应8位数据的低位到高 位,那么红色对应的代码是00000111,绿色对应的代码是00111000,蓝色对应的代码是11000000。 二、仿真分析 一个水平扫描周期占800个时钟,一个垂直扫描周期占521线,即521*800个时钟。 在水平同步信号HS以及垂直同步信号VS均为高电平状态时,将有颜色数据输出。代码实现60线将出现一种颜色,即共有水平颜色带均匀出现在屏幕上,风别为 红,蓝,绿,蓝,红,绿,红,蓝。 实验心得总结: 通过这一次的实验,可以说对于FPGA是首次从理论过度到实践中去。从一开始的完全一头雾水到最后做到较为透彻的理解,这一过程十分不容易。首先是分频器的书写,这是上一学期EDA的内容,但是要用时,总是忘记得一干二净,当然通过这次的实验,可以说再也不会忘记如何书写分频器了。其次,就是关于扫描周期的时钟参数不懂得如何去读出来,如何在代码上对应上去,当然最终也是在问同学,问老师,解决了问题。最后,就是仿真代码不会看。水平与垂直扫描周期的关系,与颜色数据的关系,一直都看不懂,最后在结合VGA时序图才弄懂。当然还有学会了如何使用FPGA板子了。 |
| 指导教师批阅意见: 成绩评定: 指导教师签字: 年 月 日 |
| 备注: |
、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。下载本文