Buscar este blog

viernes, 27 de noviembre de 2015

Señal de Video en formato VGA

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