Señales de vídeo de pantalla blanca, 8 barras de colores verticales, tres barras horizontales y tablero de ajedrez
----------------------------------------------------------------------------------
-- PRÁCTICA 3
-- DISEÑAR EN IMPLEMENTAR UN GENERADOR DE SEÑALES DE PRUEBA DE VÍDEO UTILIZANDO EL
-- PUERTO VGA PARA EL DESPLIEGUE DE LAS MISMAS
----------------------------------------------------------------------------------
library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY VGA IS
PORT ( R : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0);-- SEÑAL DEL COLOR ROJO
G : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);-- SEÑAL DEL COLOR VERDE
B : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0);-- SEÑAL DEL COLOR AZUL
VS : OUT STD_LOGIC; -- SINCRONISMO VERTICAL
HS : out STD_LOGIC; --SINCRONISMO HORIZONTAL
RESET : IN STD_LOGIC; -- SALIDA DEL RESET
CLK : IN STD_LOGIC; -- RELOJ INTERNO
S : IN STD_LOGIC_VECTOR (1 DOWNTO 0)); -- SELECTOR DE SEÑAL
END VGA;
ARCHITECTURE VIDEO OF VGA IS
BEGIN
-- SEÑALES DE SINCRONISMO
PROCESS (CLK, RESET)
VARIABLE PIX : INTEGER := 0;-- CONTADOR DE PIXELES
VARIABLE LIN : INTEGER := 0;-- CONTADOR DE LINEAS
VARIABLE DESP_P : INTEGER :=1;-- CONTADOR PARA DESPLEGAR UN PIXEL(divisor de frecuencia a 25MHz)
VARIABLE PT_R : STD_LOGIC_VECTOR (3 DOWNTO 0):="0000"; -- VARIABLE INTERNA DE ROJO
VARIABLE PT_V : STD_LOGIC_VECTOR (3 DOWNTO 0):="0000"; -- VARIABLE INTERNA DE VERDE
VARIABLE PT_A : STD_LOGIC_VECTOR (3 DOWNTO 0):="0000"; -- VARIABLE INTERNA DE AZUL
BEGIN
--DIVISOR A 25 HHz
IF(RISING_EDGE (CLK))THEN
DESP_P := DESP_P-1;
IF (RESET = '1')THEN
DESP_P :=1;
R <= "0000";
G <= "0000";
B <= "0000";
VS <= '0';
HS <= '0';
END IF;
IF(DESP_P =0)THEN
DESP_P :=2;
CASE S IS
-- PANTALLA BLANCA
WHEN "00" =>
PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
-- TRES BARRAS HORIZONTALES
WHEN "10" =>
IF LIN >= 0 AND LIN < 159 THEN
PT_R := "1111" ; PT_V := "0000" ; PT_A := "0000" ;
ELSIF LIN >= 159 AND LIN < 319 THEN
PT_R := "0000" ; PT_V := "1111" ; PT_A := "0000" ;
ELSIF LIN >= 319 AND LIN < 479 THEN
PT_R := "0000" ; PT_V := "0000" ; PT_A := "1111" ;
END IF;
-- BARRAS DE COLORES VERTICALES
WHEN "01" =>
IF PIX >= 0 AND PIX < 79 THEN -- BLANCO
PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
ELSIF PIX >= 79 AND PIX < 159 THEN -- AMARILLO
PT_R := "1111" ; PT_V := "1111" ; PT_A := "0000" ;
ELSIF PIX >= 159 AND PIX < 239 THEN -- CYAN
PT_R := "0000" ; PT_V := "1111" ; PT_A := "1111" ;
ELSIF PIX >= 239 AND PIX < 319 THEN -- VERDE
PT_R := "0000" ; PT_V := "1111" ; PT_A := "0000" ;
ELSIF PIX >= 319 AND PIX < 399 THEN -- MAGENTA
PT_R := "1111" ; PT_V := "0000" ; PT_A := "1111" ;
ELSIF PIX >= 399 AND PIX < 479 THEN -- ROJO
PT_R := "1111" ; PT_V := "0000" ; PT_A := "0000" ;
ELSIF PIX >= 479 AND PIX < 559 THEN -- AZUL
PT_R := "0000" ; PT_V := "0000" ; PT_A := "1111" ;
ELSIF PIX >= 559 AND PIX < 639 THEN -- NEGRO
PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
END IF;
-- TABLERO DE AJEDREZ
WHEN "11" =>
-- HORIZONTAL
IF PIX >= 0 AND PIX < 79 THEN -- BLANCO
PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
ELSIF PIX >= 79 AND PIX < 159 THEN -- NEGRO
PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
ELSIF PIX >= 159 AND PIX < 239 THEN -- BLANCO
PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
ELSIF PIX >= 239 AND PIX < 319 THEN -- NEGRO
PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
ELSIF PIX >= 319 AND PIX < 399 THEN -- BLANCO
PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
ELSIF PIX >= 399 AND PIX < 479 THEN -- NEGRO
PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
ELSIF PIX >= 479 AND PIX < 559 THEN -- BLANCO
PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
ELSIF PIX >= 559 AND PIX < 639 THEN -- NEGRO
PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
END IF;
-- VERTICAL
IF LIN >= 0 AND LIN < 59 THEN -- BLANCO
PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
ELSIF LIN >= 59 AND LIN < 119 THEN -- NEGRO
PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
ELSIF LIN >= 119 AND LIN < 179 THEN -- BLANCO
PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
ELSIF LIN >= 179 AND LIN < 239 THEN -- NEGRO
PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
ELSIF LIN >= 239 AND LIN < 299 THEN -- BLANCO
PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
ELSIF LIN >= 299 AND LIN < 359 THEN -- NEGRO
PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
ELSIF LIN >= 359 AND LIN < 419 THEN -- BLANCO
PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
ELSIF LIN >= 419 AND LIN < 479 THEN -- NEGRO
PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
END IF;
WHEN OTHERS =>
PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
END CASE;
-- CUENTA HASTA 800
PIX := PIX+1;
IF PIX = 800 then
LIN := LIN+1;
PIX :=0;
END IF;
-- CUENTA HASTA 521
IF LIN = 521 then
LIN := 0;
END IF;
-- PERIODO DE BORRADO HORIZONTAL
IF PIX >= (640+16) AND PIX < (640+16+96) THEN
HS <= '0';
ELSE
HS <= '1';
END IF;
-- PERIODO DE BORRADO VERTICAL
IF LIN >= (480+10) AND LIN < (480+10+2) THEN
VS <= '0' ;
else
VS <= '1';
END IF ;
-- IGUALACIÓN DE LAS VARIABLES INTERNAS A LAS SALIDAS R, G, B.
IF PIX < 640 AND LIN <480 THEN
R <= PT_R;
G <= PT_V;
B <= PT_A;
ELSE
R <= "0000" ;
G <= "0000" ;
B <= "0000" ;
END IF;
END IF;
END IF;
END PROCESS;
END VIDEO;
No hay comentarios:
Publicar un comentario