当前位置 博文首页 > 通信汪的美好生活的博客:一看就会的VGA图像显示VHDL设计,简单

    通信汪的美好生活的博客:一看就会的VGA图像显示VHDL设计,简单

    作者:[db:作者] 时间:2021-07-11 22:22

    VGA图像显示控制电路VHDL设计

    一、实验设计目的

    学习VGA图像显示控制电路设计。
    要求:
    1、VGA正常工作;
    2、图像显示;

    二、实验设计原理

    在这里插入图片描述
    1、VGA如果正常工作?
    在这里插入图片描述
    普通的VGA显示器引出线共含有5个信号:
    R、G、B:三基色信号
    HS:行同步信号
    VS:场同步信号
    这五个信号的时序驱动,严格遵循“VGA工业标准”
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    颜色编码如下:在这里插入图片描述
    如果VGA显示真彩色BMP图像,则要R、G、B三个分量各8位,即24位表示一个像素值,很多情况下还采用32位表示一个像素值。
    为了节省显存的存储空间,可采用高彩色图像,即每个像素值由16位表示,R、G、B三个分量分别使用5位、6位、5位,比真彩色图像数据量减少一半,同时又能满足显示效果。
    (2)VGA行频和场频

    时钟频率(Clock frequency) :25.175 MHz (像素输出的频率)
    行频(Line frequency):31469 Hz
    场频(Field frequency ) :59.94 Hz (每秒图像刷新频率)
    (3)VGA实际的行频和场频
    我们提供的时钟频率(Clock frequency)是 :20MHz (开发板的频率)
    如何得到时钟频率25M Hz ?
    在这里插入图片描述
    利用锁相环来进行分频,得到25MHz的信号
    如何得到行频(Line frequency):31469 Hz?答:分频:行频的近似值 25M/800=31250Hz
    如何得到场频(Field frequency ):59.94 Hz (每秒图像刷新频率)?答:还是分频:得到场频的近似值 25M/800/525=59.52Hz
    那么VGA的工作频率进行分频时,行频分频计数为什么是800?
    场频分频计数为什么是525?
    (4)VGA的工作时序图
    在这里插入图片描述
    在这里插入图片描述

    (5)VGA工业标准显示模式

    在这里插入图片描述
    要求:
    1)行周期为800像素时间点,场周期为525像素时间点;
    2)行同步、场同步头脉冲要求是负极性脉冲。

    (6)VGA正常工作程序设计

    A.行频频率和行像素点计数

    --this is Horizonal counter	
    always@(posedge clk)   begin
    	if(hcnt < 800) then
    		hcnt <= hcnt + 1;
    	else
    		hcnt <= (others => '0');
    end 
    

    B.场频频率和场像素点计数

    --this is Vertical counter 
    always@(posedge clk)    begin
    	if (hcnt == 640+8 ) then
    		if(vcnt < 525) then	   		    
    			vcnt <= vcnt + 1;
    		else
    			vcnt <= (others => '0');	
    end
    
    

    如何得到行、场同步脉冲信号呢?
    在这里插入图片描述

    --this is hs  pulse
    process(clk) begin
         if (rising_edge(clk)) then
             if((hcnt>= 640+8+8) and (hcnt<640+8+8+96 )) then
    	      hs <= '0';
    	else
    	     hs <= '1';
    	end if;
         end if;
    end process;
    
    --this is vs  pulse
    process(vcnt) begin
    	if ((vcnt >= 480+8+2) and (vcnt < 480+8+2+2)) then	
    			vs <= '0';
    		else
    			vs <= '1';
    	end if;
    end process;
    

    在这里插入图片描述

    cs