视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
VGA实现显示器条纹显示
2025-09-30 19:40:55 责编:小OO
文档
深 圳 大 学 实 验 报 告

 

      课程名称:    基于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;        

B.VHDL测试代码。

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板子了。

指导教师批阅意见:

成绩评定:

 指导教师签字:

 年 月 日

备注:
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。

 、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。下载本文

显示全文
专题