?? vga.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 + -