-- VHDL code position: p296_exer9_32_vga_color_bar.txt -- Note : This is a VGA color bar display code, -- for exproment 9-1 , page 293 -- -- See Also: no -- Debug : no debug --------------------------------------------------------------------------------- LIBRARY IEEE; -- VGA显示器 彩条 发生器 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY VGA_COLOR_BAR IS PORT ( CLK, MD : IN STD_LOGIC; HS, VS, R, G, B : OUT STD_LOGIC ); -- 行场同步/红,绿,兰 END VGA_COLOR_BAR; ARCHITECTURE behav OF VGA_COLOR_BAR IS SIGNAL HS1, VS1, FCLK, CCLK : STD_LOGIC; SIGNAL MMD : STD_LOGIC_VECTOR( 1 DOWNTO 0 ); -- 方式选择 SIGNAL FS : STD_LOGIC_VECTOR( 3 DOWNTO 0 ); SIGNAL CC : STD_LOGIC_VECTOR( 4 DOWNTO 0 ); -- 行同步/横彩条生成 SIGNAL LL : STD_LOGIC_VECTOR( 8 DOWNTO 0 ); -- 场同步/竖彩条生成 SIGNAL GRBX : STD_LOGIC_VECTOR( 3 DOWNTO 1 ); -- X横彩条 SIGNAL GRBY : STD_LOGIC_VECTOR( 3 DOWNTO 1 ); -- Y竖彩条 SIGNAL GRBP : STD_LOGIC_VECTOR( 3 DOWNTO 1 ); SIGNAL GRB : STD_LOGIC_VECTOR( 3 DOWNTO 1 ); BEGIN GRB(2) <= (GRBP(2) XOR MD) AND HS1 AND VS1; GRB(3) <= (GRBP(3) XOR MD) AND HS1 AND VS1; GRB(1) <= (GRBP(1) XOR MD) AND HS1 AND VS1; PROCESS( MD ) BEGIN IF MD'EVENT AND MD = '0' THEN IF MMD = "10" THEN MMD <= "00"; ELSE MMD <= MMD + 1; END IF; -- 三种模式 END IF; END PROCESS; PROCESS( MMD ) BEGIN IF MMD = "00" THEN GRBP <= GRBX; -- 选择横彩条 ELSIF MMD = "01" THEN GRBP <= GRBY; -- 选择竖彩条 ELSIF MMD = "10" THEN GRBP <= GRBX XOR GRBY; --产生棋盘格 ELSE GRBP <= "000"; END IF; END PROCESS; PROCESS( CLK ) BEGIN IF CLK'EVENT AND CLK = '1' THEN -- 12MHz 13分频 IF FS = 12 THEN FS <= "0000"; ELSE FS <= (FS + 1); END IF; END IF; END PROCESS; FCLK <= FS(3); CCLK <= CC(4); PROCESS( FCLK ) BEGIN IF FCLK'EVENT AND FCLK = '1' THEN IF CC = 29 THEN CC <= "00000"; ELSE CC <= CC + 1; END IF; END IF; END PROCESS; PROCESS( CCLK ) BEGIN IF CCLK'EVENT AND CCLK = '0' THEN IF LL = 481 THEN LL <= "000000000"; ELSE LL <= LL + 1; END IF; END IF; END PROCESS; PROCESS( CC,LL ) BEGIN IF CC > 23 THEN HS1 <= '0'; -- 行同步 ELSE HS1 <= '1'; END IF; IF LL > 479 THEN VS1 <= '0'; -- 场同步 ELSE VS1 <= '1'; END IF; END PROCESS; PROCESS( CC, LL ) BEGIN IF CC < 3 THEN GRBX <= "111"; -- 横彩条 ELSIF CC < 6 THEN GRBX <= "110"; ELSIF CC < 9 THEN GRBX <= "101"; ELSIF CC < 12 THEN GRBX <= "100"; ELSIF CC < 15 THEN GRBX <= "011"; ELSIF CC < 18 THEN GRBX <= "010"; ELSIF CC < 21 THEN GRBX <= "001"; ELSE GRBX <= "000"; END IF; IF LL < 60 THEN GRBY <= "111"; -- 竖彩条 ELSIF LL < 120 THEN GRBY <= "110"; ELSIF LL < 180 THEN GRBY <= "101"; ELSIF LL < 240 THEN GRBY <= "100"; ELSIF LL < 300 THEN GRBY <= "011"; ELSIF LL < 360 THEN GRBY <= "010"; ELSIF LL < 420 THEN GRBY <= "001"; ELSE GRBY <= "000"; END IF; END PROCESS; HS <= HS1 ; VS <= VS1 ; R <= GRB(2) ; G <= GRB(3) ; B <= GRB(1); END behav;