⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vga.vhd

📁 VHDL入门实验。256色VGA显示驱动 开发软件Quartus II 6.0 芯片EP2c8Q208
💻 VHD
字号:
--//************************Copyright (c)**********************
--//**               广州周立功单片机发展有限公司
--//**                     研    究    所
--//**                        测控事业部 
--//**
--//**                 http://www.zlgmcu.com
--//**
--//**-----------------文件信息---------------------------------
--//**文   件   名:  
--//**创   建   人:  Xu hui quan (许惠泉)
--//**最后修改日期:  
--//**描        述:  
--//**               
--//*------------------当前版本修订------------------------------
--//** 修改人:       Zou yun hai(邹云海)
--//** 日 期:       2008/12/28
--//** 描 述:       调整了锁相环参数,使用10MHz有源晶振
--//**               每隔3秒切换显示纵向彩条、横向彩条和棋盘格
--//**-----------------------------------------------------------
--//**************************************************************-/
LIBRARY	IEEE;
USE		IEEE.STD_LOGIC_1164.ALL;
USE		IEEE.STD_LOGIC_UNSIGNED.ALL;
USE     IEEE.STD_LOGIC_ARITH.ALL;

ENTITY vga IS
PORT(
clock:		IN	STD_LOGIC;	--系统输入时钟48MHz
disp_dato:	OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--VGA数据输出.
hsync:		OUT STD_LOGIC;	--VGA行同步信号.
vsync:		OUT STD_LOGIC	--VGA场同步信号.
);
END;

ARCHITECTURE one OF vga IS
COMPONENT pll
	PORT
	(
		inclk0		: IN STD_LOGIC  := '0';
		c0		: OUT STD_LOGIC 
	);
END COMPONENT;


SIGNAL hcount:	STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL vcount:	STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL data:	STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL h_dat:	STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL v_dat:	STD_LOGIC_vECTOR(7 DOWNTO 0);
SIGNAL timer:	STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL flag:	STD_LOGIC;
SIGNAL hcount_ov:STD_LOGIC;
SIGNAL vcount_ov:STD_LOGIC;
SIGNAL dat_act:	 STD_LOGIC;
SIGNAL hsync_r:	 STD_LOGIC;
SIGNAL vsync_r:	 STD_LOGIC;
SIGNAL vga_clk:	 STD_LOGIC;

CONSTANT hsync_end:		STD_LOGIC_VECTOR(9 DOWNTO 0):="0001011111";--95
CONSTANT hdat_begin:	STD_LOGIC_VECTOR(9 DOWNTO 0):="0010001111";--143--图形显示横区开始,
CONSTANT hdat_end:		STD_LOGIC_VECTOR(9 DOWNTO 0):="1100001111";--783--图形显示横区结束
CONSTANT hpixel_end:	STD_LOGIC_VECTOR(9 DOWNTO 0):="1100011111";--799
CONSTANT vsync_end:		STD_LOGIC_VECTOR(9 DOWNTO 0):="0000000001";--1
CONSTANT vdat_begin:	STD_LOGIC_VECTOR(9 DOWNTO 0):="0000100010";--34	--图形显示横区开始,
CONSTANT vdat_end:		STD_LOGIC_VECTOR(9 DOWNTO 0):="1000000010";--514--图形显示横区结束
CONSTANT vline_end:		STD_LOGIC_VECTOR(9 DOWNTO 0):="1000001100";--524

BEGIN
--调用PLL模块
U1:	pll PORT MAP(inclk0=>clock,c0=>vga_clk);
PROCESS(vga_clk)--行扫描.
BEGIN
	IF  RISING_EDGE(vga_clk)	THEN
		IF hcount_ov='1' THEN
			hcount<=B"00_0000_0000";	
		ELSE
			hcount<=hcount+1;
		END IF;
	END IF;
END PROCESS;
hcount_ov<='1' 	WHEN hcount=hpixel_end	ELSE '0';
PROCESS(vga_clk)--场扫描.
BEGIN
	IF  RISING_EDGE(vga_clk)	THEN
		IF hcount_ov='1' THEN
			IF vcount_ov='1' THEN
				vcount<=B"00_0000_0000";
			ELSE
				vcount<=vcount+1;
			END IF;
		END IF;
	END IF;
END PROCESS;
vcount_ov<='1'	WHEN vcount=vline_end	ELSE '0';
------------------------------------------------------<<数据、同步信号输出。
dat_act	<= '1' 	WHEN ((hcount>=hdat_begin) AND (hcount<hdat_end)) AND ((vcount>=vdat_begin)AND(vcount<vdat_end)) ELSE '0';
hsync_r	<= '1' 	WHEN hcount>hsync_end ELSE '0';
vsync_r	<= '1' 	WHEN vcount>vsync_end ELSE '0';
disp_dato<=data WHEN dat_act='1'	  ELSE X"00";
----------------------------------------------------显示数据处理部份。
--图片显示延时计数器。
PROCESS(vga_clk)
BEGIN
	IF  RISING_EDGE(vga_clk)THEN
		flag<=vcount_ov;
		IF (vcount_ov='1' AND  (NOT flag='1')) THEN
			timer<=timer+1;
		END IF;
	END IF;
END PROCESS;

PROCESS(vga_clk)
BEGIN
	IF  RISING_EDGE(vga_clk)THEN
		CASE timer(9 DOWNTO 8)	IS
			WHEN "00"=>	data<=h_dat;		--选择横彩条。
			WHEN "01"=> data<=v_dat;		--选择竖彩条。
			WHEN "10"=> data<=(v_dat XOR h_dat);	--产生棋盘格。
			WHEN "11"=> data<=(v_dat XOR NOT h_dat);--产生棋盘格。			
		END CASE;
	END IF;
END PROCESS;

PROCESS(vga_clk)		--产生竖彩条。
BEGIN
	IF  RISING_EDGE(vga_clk)THEN
		IF hcount<223 THEN
			v_dat<=X"FF";	--白色。
		ELSIF hcount<303 THEN
			v_dat<=X"FC";	--黄色
		ELSIF hcount<383 THEN
			v_dat<=X"1f";	--青色
		ELSIF hcount<463 THEN
			v_dat<=X"1c";	--绿色。
		ELSIF hcount<543 THEN
			v_dat<=X"e3";	--紫色。			
		ELSIF hcount<623 THEN
			v_dat<=X"e0";	--红色。			
		ELSIF hcount<703 THEN
			v_dat<=X"03";	--蓝色。
		ELSE 
			v_dat<=X"00";   --黑色。
		END IF;		
	END IF;
END PROCESS;

PROCESS(vga_clk)		--产生横彩条。
BEGIN
	IF  RISING_EDGE(vga_clk)THEN
		IF	vcount<=94	THEN
			h_dat<=X"ff";		--白色
		ELSIF	vcount<154 THEN
			h_dat<=X"FC";		--黄色
		ELSIF vcount<214 THEN
			h_dat<=X"1f";		--青色
		ELSIF vcount<274 THEN
			h_dat<=X"1c";		--绿色。
		ELSIF vcount<334 THEN
			h_dat<=X"e3";		--紫色。
		ELSIF vcount<394 THEN
			h_dat<=X"e0";		--红色。
		ELSIF vcount<454 THEN
			h_dat<=X"03";		--蓝色。
		ELSE
			h_dat<=X"00";		
		END IF;
	END IF;
END PROCESS;

hsync<=hsync_r;
vsync<=vsync_r;
END;  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -