You are on page 1of 7

Prácticas de Laboratorio de Dispositivos Lógicos Programables

Dr. Juan Antonio Jaramillo Gómez

Monitor

VGA (Video Graphics Array) es una norma con un estándar 640 x 480 pixeles en video activo, utilizada en los antiguos
monitores CRT (tubos de rayos catódicos) y los actuales monitores LCD. La generación de una imagen completa en
pantalla o “frame”, se realiza por el barrido de los pixeles (antiguamente haz de electrones en los CTR) en toda la
pantalla, primero de forma horizontal, brincando al siguiente renglón y barriéndolo otra vez de forma horizontal, hasta
acabar con todos los renglones y columnas. El desplazamiento comienza en la esquina superior izquierda llevándose a
cabo de izquierda a derecha y de arriba hacia abajo.

La temporización de las señales que definen la posición vertical y horizontal tiene como base la frecuencia de la
corriente eléctrica de 60Hz, aunque también existen los de 120 Hz, siendo de carácter analógica los antiguos y digitales
los modernos, utilizando dos señales de sincronía (vertical y horizontal) y las señales de color RGB (rojo verde azul) que
pueden ser de 3 bits, uno para cada color, 8 bits (3R, 3G, 2B), 24 bits (8R, 8G, 8B), etc.

La señal de sincronización horizontal y vertical está definida en la señal diente de sierra, la cuan contiene 3 partes
principales, descritas en la Figura 1. La parte principal de la señal corresponde a la rampa continua en la cual se
despliega la información en la pantalla. Durante este intervalo de tiempo, los 640 pixeles son excitados por los haces
provenientes de los cañones de electrones en los CRT o por transistores en los LCD. Finalizando esta etapa, el
desplazamiento continua, pero sin excitar los pixeles. Este tiempo se conoce como “regreso” que está conformada por
una etapa definida como “back porch” lo que permite que la señal vertical comience de nuevo en la parte izquierda de la
pantalla en el siguiente renglón, comenzando una nueva etapa del barrido, conocido como “front porch” sin enviar
información, hasta que comienza la rampa continua que permite el despliegue de los 640 pixeles de información en el
nuevo renglón.

Figura 1. Señales de un monitor.


Prácticas de Laboratorio de Dispositivos Lógicos Programables
Dr. Juan Antonio Jaramillo Gómez

La sincronía de video vertical puede ser de dos tipos; video continuo o video compuesto. En el video continuo, todas las
filas son excitadas. En el video compuesto primero se provee de información a las filas impares y en el siguiente frame a
las filas pares. Esto se realiza a 60 frames por segundo, por lo que el ojo humano no lo percibe y da la apariencia de una
imagen continua con movimiento fluido. Sin importar el caso, al finalizar el despliegue de todas las filas de un frame, la
señal de sincronización vertical permite regresar a la posición superior con una señal semejante a la sincronización
horizontal debido a la presencia de un “front porch” y un “back porch” en el tiempo de regreso.

Para enviar estas señales hacia el monitor, la tarjeta NEXYS 2 cuenta con un conector DB15 para el estándar VGA. Esto
nos permite conectar un monitor CRT o un monitor LCD a la tarjeta para el despliegue de la información. Las terminales
de salida se pueden observar en la Figura 2.

Figura 2. Disposición de terminales del conector DB15 y la tarjeta Nexys 2.

A continuación, se presentan dos códigos para la implementación de distintas figuras en un monitor en dos tarjetas
probadas.

------------------------------------------------------------------------------------------------------------------------------------------------------
-- Control de un monitor VGA de 640x480 implementado en la Spartan 3E
-- código para visualizar figuras en el monitor
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity vga is
port ( clk: in std_logic; --reloj de 50MHz
a : in std_logic_vector (1 downto 0);
Prácticas de Laboratorio de Dispositivos Lógicos Programables
Dr. Juan Antonio Jaramillo Gómez

shor, sver : out std_logic; --señales de control horizontal y vertical


RGB : out std_logic_vector (2 downto 0)); -- bits de color Red Green Blue
end vga;

architecture Arq_vga of vga is

constant hpixels: std_logic_vector(9 downto 0) := "1100100000"; --Valor de pixeles en linea horizontal (800)
constant vlines: std_logic_vector(9 downto 0) := "1000001001"; --Numero de lineas horizontales en pantalla (521)
constant hbp: std_logic_vector(9 downto 0) := "0010010000"; --Limite horizontal inferior (144)
constant hfp: std_logic_vector(9 downto 0) := "1100010000"; --Limite horizontal superior (784)
constant vbp: std_logic_vector(9 downto 0) := "0000011111"; --Limite vertical inferior ( 31)
constant vfp: std_logic_vector(9 downto 0) := "0111111111"; --Limite vertical superior (511)

signal conh: std_logic_vector(9 downto 0) := (others=>'0'); --Contadores horizontal


signal conv: std_logic_vector(9 downto 0) := (others=>'0'); --Contador vertical
signal clkdiv: std_logic := '0'; --Señal de reloj de 25MHz
signal vidon: std_logic := '0'; --Habilita la señal de video
signal vsenable: std_logic := '0'; --Habilita el contador vertical

begin
--clk es de 50 MHz, se divide a 25MHz
process(clk)
begin
if(clk = '1' and clk'event) then
clkdiv <= not clkdiv;
end if;
end process;

--Contador horizontal
process(clkdiv)
begin
if(clkdiv = '1' and clkdiv'event) then
if conh = hpixels then --Monitoreo de número de pixeles en línea horizontal
conh <= (others=>'0'); --Inicializa el contador
vsenable <= '1'; --Habilita el contador vertical
else
conh <= conh + 1; --Incrementa el contador horizontal
vsenable <= '0'; --Deshabilita el contador vertical
end if;
end if;
end process;

--Pulso de sincronía horizontal


shor <= '1' when conh(9 downto 7) = "000" else '0';

--Contador vertical
process(clkdiv)
begin
if(clkdiv = '1' and clkdiv'event and vsenable = '1') then
if conv = vlines then --Monitorea el número de líneas verticales
Prácticas de Laboratorio de Dispositivos Lógicos Programables
Dr. Juan Antonio Jaramillo Gómez

conv <= (others=>'0'); --Inicializa el contador


else conv <= conv + 1; --Incrementa el contador vertical
end if;
end if;
end process;

--Pulso de sincronía vertical


sver <= '1' when conv(9 downto 1) = "000000000" else '0';

--***************************************************************************
--Pixels a visualizar
RGB <= "110" when (conh(4 downto 0) = "00000" and
conv(4 downto 0) = "00000" and
vidon ='1' and a="00") else
--Cuadro a visualizar
"101" when (conh > ("0100001110"+hbp) and conh < ("0101110010"+hbp)
and conv > ("0010111110"+vbp) and conv < ("0100100010"+vbp)
and vidon ='1' and a="01") else
--Rayas verticales
"011" when (conh(4 downto 0) = "00000" and
vidon ='1' and a="10") else
--Rayas horizontales
"100" when (conv(4 downto 0) = "00000" and
vidon ='1' and a="11") else "000";
--****************************************************************************
--Habilita la señal de video solo en los margenes de visualizacón
vidon <= '1' when (((conh > hbp) and (conh < hfp)) or ((conv > vbp) and (conv < vfp))) else '0';

end Arq_vga;

# Asignación de terminales para la Spartan 3E


# Terminal de la señal de reloj de 50 MHz
NET "clk" LOC = "c9" | IOSTANDARD = LVCMOS33 ;

# Terminales de las lineas de color (RGB)


NET "RGB<0>" LOC = "g15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
NET "RGB<1>" LOC = "h15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
NET "RGB<2>" LOC = "h14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;

# Terminales de sincronía horizontal y vertical


NET "shor" LOC = "f15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
NET "sver" LOC = "f14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;

# Terminales de selección de función


NET "a<0>" LOC = "l13" | IOSTANDARD = LVTTL | PULLUP ;
NET "a<1>" LOC = "l14" | IOSTANDARD = LVTTL | PULLUP ;

------------------------------------------------------------------------------------------------------------------------------------------------------
Prácticas de Laboratorio de Dispositivos Lógicos Programables
Dr. Juan Antonio Jaramillo Gómez

-- Control de un monitor VGA de 640x480 implementado en la Nexys 2


-- código para visualizar figuras en el monitor

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity video_vga is
Port ( clk : in STD_LOGIC; --50MHz
a : in STD_LOGIC_VECTOR(1 downto 0); --interruptores sw1 y sw0 o sw7 y sw6
shor : out STD_LOGIC;
sver : out STD_LOGIC;
RGB : out STD_LOGIC_VECTOR(7 downto 0));
end video_vga;

architecture arq_video_vga of video_vga is


constant hpixels : std_logic_vector(9 downto 0) := "1100100000"; --Valor de pixeles en línea horizontal (800)
constant vlines : std_logic_vector(9 downto 0) := "1000001001"; --Valor de lineas horizontales en pantalla (521)
constant hbp : std_logic_vector(9 downto 0) := "0010010000"; --Límite horizontal inferior "back porch" (144)
constant hfp : std_logic_vector(9 downto 0) := "1100100000"; --Límite horizontal superior "front porch" (784)
constant vbp : std_logic_vector(9 downto 0) := "0000011111"; --Límite vertical inferior "back porch" (31)
constant vfp : std_logic_vector(9 downto 0) := "0111111111"; --Límite vertical superior "front porch" (521)

signal conh : std_logic_vector(9 downto 0) := (others=>'0'); --Contador horizontal


signal conv : std_logic_vector(9 downto 0) := (others=>'0'); --Contador vertical
signal clkdiv : std_logic := '0';
--Señal de reloj a 25Mhz

signal vidon : std_logic := '0';


--Habilita la señal de video

signal vsenable : std_logic := '0';


--Habilita el contador vertical

begin

--clk es de 50MHz del reloj interno de la FPGA. Se genera la señal clkdiv a 25 MHz.
process (clk)
begin
if (clk = '1' and clk' event) then
clkdiv <= not clkdiv;
end if;
end process;

--Contador horizontal
process (clkdiv)
begin
if (clkdiv = '1' and clkdiv' event) then
Prácticas de Laboratorio de Dispositivos Lógicos Programables
Dr. Juan Antonio Jaramillo Gómez

if conh = hpixels then --Monitoreo de número de pixeles en línea horizontal


conh <= (others=>'0'); --Inicializa en 0's el contador
vsenable <= '1'; --Habilita el contador veritical cuando conh = 800.
else
conh <= conh + 1; --Incrementa el contador horizontal
vsenable <= '0'; --Deshabilita el contador vertical
end if;
end if;
end process;

--Pulso de sincronía horizontal


shor <= '1' when conh(9 downto 7) = "000" else '0'; --Las señales de sincronización se habilitan en '0'

--Contador vertical
process (clkdiv)
begin
if (clkdiv = '1' and clkdiv' event and vsenable = '1') then
if conv = vlines then --Monitorea el número de líneas verticales
conv <= (others=>'0'); --Inicializa el contador
else
conv <= conv + 1; --Incrementa el contador vertical
end if;
end if;
end process;

--Pulso de sincronía vertical


sver <= '1' when conv(9 downto 1) = "000000000" else '0';

--*******************************************************************
--Pixels a visualizar
RGB <= "11111100" when (conh(4 downto 0) = "00000"
and conv(4 downto 0) = "00000"
and vidon = '1'
and a = "00")
else
-- Cuadro a visualizar
"11100011" when (conh > ("0100001110" + hbp)
and conh < ("0101110010" + hbp)
and conv > ("0010111110" + vbp)
and conv < ("0100100010" + vbp)
and vidon = '1'
and a = "01")
else
-- Rayas verticales
"00011111" when (conh (4 downto 0) = "00000"
and vidon = '1'
and a = "10" )
else
-- Rayas horizontales
"11100000" when (conv (4 downto 0) = "00000"
Prácticas de Laboratorio de Dispositivos Lógicos Programables
Dr. Juan Antonio Jaramillo Gómez

and vidon = '1'


and a = "11" )
else "00000000";
--*********************************************************************

--Habilitación de la señal de video solo en los márgenes de visualización (480 x 640)


vidon <= '1' when (((conh < hbp and (conh < hfp )) or ((conv > vbp) and (conv < vfp))))
else '0';

end arq_video_vga;

# Asignación de terminales para la Nexys 2


#Terminales de salida para color (RGB) de 8 bits. 3rojo,3verde,2azul
NET "RGB[0]" LOC = U4 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "RGB[1]" LOC = U5 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "RGB[2]" LOC = P6 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "RGB[3]" LOC = P8 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "RGB[4]" LOC = N8 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "RGB[5]" LOC = R8 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "RGB[6]" LOC = T8 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "RGB[7]" LOC = R9 | IOSTANDARD = LVTTL | DRIVE = 8;

#Terminal de señal de reloj de 50MHZ.


NET "clk" LOC = B8 | IOSTANDARD = LVCMOS33; #50MHz

#Terminales de salida de señales de sincronía horizontal y vertical


NET "shor" LOC = T4 | IOSTANDARD = LVTTL | DRIVE = 8;
NET "sver" LOC = U3 | IOSTANDARD = LVTTL | DRIVE = 8;

#Terminal de entrada para selección de patron a desplegar


//NET "a[0]" LOC = G18; #SW0
//NET "a[1]" LOC = H18; #SW1
NET "a[0]" LOC = N17; #SW6
NET "a[1]" LOC = R17; #SW7

Referencias

Apuntes del curso de manejo de la Spartan 3E en el CINVESTAV (2001)

Control y despliegue de imágenes en monitor vga mediante el uso de vhdl y la placa nexys 2, consultado noviembre
2017, disponible en:
http://www.boletin.upiita.ipn.mx/index.php/ciencia/217-cyt-numero-35/59-control-y-despliegue-de-imagenes-en-
monitor-vga-mediante-el-uso-de-lenguaje-vhdl-y-una-placa-nexys-2

You might also like