You are on page 1of 21

UNIVERSIDAD NACIONAL DE SAN AGUSTIN

DE AREQUIPA
ESCUELA PROFESIONAL DE INGENIERIA
Electrnica

CURSO:
Microelectrnica
DOCENTE:
ING. Ral yanyachi
Proyecto:
VISUALIZACION DE CARACTERES
PERSONALIZADOS EN UN MONITOR VGA
REALIZADO POR:
calcina huanca, yhan karlo

2008242
0

AREQUIPA PER
2015-b
INDICE

__________

VISUALIZACION DE CARACTERES PERSONALIZADOS EN UN MONITOR VGA.......2


1.-MARCO TEORICO.......................................................................................... 2
1.1-VGA DISPLAY PUERTO............................................................................. 2
1.2.-FRECUENCIA DE LA SEAL DE 60 HZ, 640X480 VGA.............................3
1.3.-EL TIEMPO DE SEAL VGA.....................................................................5
2.-DESCRIPCION DEL PROGRAMA.....................................................................5
3.-DIAGRAMA DE FLUJO.................................................................................... 7
4.-PROGRAMAS EN ISE..................................................................................... 8
4.1.-PROGRAMA DE ALTO NIVEL Font_tes_top...............................................8
4.2.- PROGRAMA DE INSTANCIACION VGA_SYNC-UNIT...............................10
4.3.-PROGRAMA DE INSTANCIACION FONT_GEN_UNIT...............................14
4.4.-PROGRAMA FONT_UNTI-FROM-ROM.....................................................16
5.-CONCLUSIONES.......................................................................................... 18
6.-PRUEBAS.................................................................................................... 19
6.-BIBLIOGRAFIA............................................................................................. 20

VISUALIZACION DE CARACTERES PERSONALIZADOS EN


UN MONITOR VGA
1.-MARCO TEORICO
1.1-VGA DISPLAY PUERTO
El FPGA Spartan-3E Starter Kit incluye un puerto VGA mediante un conector
DB15.
Este puerto se conecta directamente a la mayora de los monitores de PC o
pantallas LCD de pantalla plana utilizando un cable estandar del monitor. Como
se muestra en la Figura 1.La parte superior del tablero.

El Spartan-3E FPGA impulsa directamente las cinco seales VGA a travs de


resistencias. Cada lnea de color tiene una resistencia en serie, con un bit cada
uno para VGA_RED, VGA_GREEN y VGA_BLUE. Las resistencias en serie, en
combinacin con la impedancia de 75 integrado en el cable VGA, aseguran
que las seales de color permanecen en el 0V VGA-especificado gama 0.7V. Las
seales VGA_RED, VGA_GREEN y VGA_BLUE altos o bajos para generar los ocho
colores que se muestran en la Tabla 1.

El siguiente sistema VGA y la informacin de tiempo es proporcionado como un


ejemplo de cmo el FPGA podra conducir un monitor VGA en el modo 640 por
480.

1.2.-FRECUENCIA DE LA SEAL DE 60 HZ, 640X480 VGA


Los display CRT-basados pantallas VGA utilizan amplitud modulada, moviendo
haces de electrones (o ctodo) para mostrar la informacin en una pantalla
recubierta de fsforo. LCDs utilizan una serie de interruptores que puede
imponer un voltaje a travs de una pequea cantidad de cristal lquido,
cambiando as la luz a travs del cristal sobre una base de pixel por pixel.
Aunque la siguiente descripcin se limita a los monitores CRT, los monitores
LCD han evolucionado para utilizar los mismos tiempos de seal como
pantallas CRT. En consecuencia, la siguiente discusin se refiere tanto a los
tubos de rayos catdicos y LCDs.
Dentro de una pantalla CRT, formas de onda de corriente pasan a travs de las
bobinas para producir campos magnticos que los haces de electrones se
desvan al atravesar la superficie de la pantalla en un patrn de barrido,
horizontal de izquierda a derecha y verticalmente de arriba a abajo. Como se
muestra en la Figura 2, la informacin slo se muestra cuando el haz se mueve
en la direccin izquierda adelante a derecha y de arriba a abajo y no durante el
tiempo de las declaraciones de la viga de nuevo a la orilla izquierda o la parte
superior del monitor. Por lo tanto, gran parte del potencial de tiempo de
visualizacin se pierde en los periodos de supresin cuando el haz se
restablece y estabilizado para comenzar un nuevo pase de visualizacin
horizontal o vertical.

La resolucin de visualizacin define el tamao de las vigas, la frecuencia a la


cual el haz pasa a travs de la pantalla, y la frecuencia a la que se modula el
haz de electrones.
Modernas pantallas VGA admiten varias resoluciones de pantalla, y el
controlador VGA dicta la resolucin mediante la produccin de seales de
temporizacin para controlar los patrones de trama. El controlador produce
impulsos de sincronizacin de nivel TTL que marcan la frecuencia a la que la
corriente fluye a travs de las bobinas de deflexin, y asegura que los datos de
pxeles o vdeo se aplica al haz de electrones en el momento correcto.
Los datos de vdeo normalmente proviene de una memoria de actualizacin de
vdeo con uno o ms bytes asignado a cada posicin de pixel. Spartan-3E
Starter Kit utiliza tres bits por pxel, produciendo una de las ocho posibles
colores que se muestran en la Tabla 1.
Como se muestra en la Figura 2, el controlador VGA genera la sincronizacin
horizontal (HS) y vertical sync (VS) seales de los tiempos y coordina la
entrega de datos de vdeo en cada reloj de pxeles.

La frecuencia de pxel define el tiempo disponible para mostrar un pxel de la


informacin. La seal VS define la frecuencia de refresco de la pantalla, o la
frecuencia a la que toda la informacin en la pantalla se vuelve a dibujar.

1.3.-EL TIEMPO DE SEAL VGA


Los tiempos de seal en la tabla 2 se derivan de 640 pxeles por pantalla 480
fila usando un 25 MHz de reloj de pxeles y 60 Hz 1 refresco. Figura 3
muestra la relacin entre cada uno de los smbolos de sincronizacin.

En general, un contador sincronizado por el reloj de pxeles controla la


sincronizacin horizontal. Descifrando valores del contador generan la seal
HS. Este contador rastrea en la pantalla la actual ubicacin del pixel en una fila
determinada.
Un contador separado el seguimiento de la sincronizacin vertical. El contador
vertical sincronizacin con cada pulso HS y los valores decodificados generan la
seal VS. Este contador rastrea la actual fila de la pantalla. Estos dos
contadores que se ejecutan continuamente forman la direccin en una
memoria intermedia de visualizacin. Por ejemplo, el DDR SDRAM proporciona
un bfer de visualizacin ideal.

2.-DESCRIPCION DEL PROGRAMA


Este proyecto implementa la comunicacin por el puerto VGA del modulo
Spartan 3E con un monitor LCD mostrando caracteres en cdigo ASCII
,guardados en banco de datos.

En el programa de alto nivel se definen las entradas ,tenemos 2 entradas :


-La entrada de reloj ,usamos el reloj interno del Spartan de 50MHZ .
-Una entrada de reset , usaremos el pulsador de la tarjeta Spartan D18.
-Las salidas del puerto VGA RGB.
-Las salidas de control hsync,vsync del puerto VGA.
Este programa utiliza dos programas de instanciacin vga_sync_unit y
font_sync_unit.
La rutina vga_sync_unit se usa para la sincronizacin del monitor LCD a una
frecuencia de 60Hz,haciendo un divisor de frecuencia de reloj de 50Mhz con
0.83 Mhz.
Tambien esta rutina define el tamao de los caracteres.
Toda la comunicacin por el puerto VGA se describe en el libro de Pong Chu.
La rutina Font_sync_unit cuenta con una subrutina from_unit donde colocan
todos los caracteres que se mostraran , podra decirse que es nuestra base de
datos.
La rutina Font_sync_unit almacena todos estos datos en la memoria ROM del
Spartan y tambin el color de los caracteres , el color elegido es azul cuyo
cdigo es:

Los caracteres utilizados son


ESCUELA: INGENIERIA ELECTRONICA
ALUMNO:Calcina Huanca Yhan K.
CURSO :MICROELECTRONICA
2015-B
DOCENTE:Ing. Raul Yanyachi

3.-DIAGRAMA DE FLUJO
Archivo de alto
nivel
Font-test _top
Declaracin de
entradas y
salidas
Declaracin de los
programas de
instanciacion
SUBRUTINA DE
INSTANCIACION

Subrutina

Subrutina

Vga_sync_u

Font_gen-

Divisor de
frecuencia de 60Hz
para entrada del
monitor VGA

VGA 640X480
PARMETROS DE

Almacena los
caracteres en la
memoria ROM

Color de
caracteres
Base de datos

4.-PROGRAMAS EN ISE
4.1.-PROGRAMA DE ALTO NIVEL Font_tes_top
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
-------------------------------------------------------------------------------entity font_test_gen is
Port ( clk : in STD_LOGIC;
video_on : in STD_LOGIC;
pixel_x, pixel_y : STD_LOGIC_VECTOR (9 DOWNTO 0);
rgb_text : out STD_LOGIC_VECTOR (2 DOWNTO 0));
end font_test_gen;
-------------------------------------------------------------------------------architecture arch of font_test_gen is

signal rom_addr: std_logic_vector(10 downto 0);


signal char_addr: std_logic_vector(6 downto 0);
signal row_addr: std_logic_vector(3 downto 0);
signal bit_addr: std_logic_vector(2 downto 0);
signal font_word: std_logic_vector(7 downto 0);
signal font_bit, text_bit_on: std_logic;
-------------------------------------------------------------------------------begin

-- instantiate font ROM


font_unit: entity work.font_rom
port map(clk=>clk, addr=>rom_addr, data=>font_word);

-- font ROM interface


char_addr<=pixel_y(5 downto 4) & pixel_x(7 downto 3);
row_addr<=pixel_y(3 downto 0);
rom_addr <= char_addr & row_addr;
bit_addr<=pixel_x(2 downto 0);
font_bit <= font_word(to_integer(unsigned(not bit_addr)));
-- "on" region limited to top-left corner
text_bit_on <=
font_bit when pixel_x(9 downto 8)="00" and
pixel_y(9 downto 6)="0000" else
'0';

-- rgb multiplexing circuit


process(video_on,font_bit,text_bit_on)
begin
if video_on='0' then
rgb_text <= "000"; --blank
else
if text_bit_on='1' then
rgb_text <= "010"; -- green
else
rgb_text <= "000"; -- black
end if;
end if;
end process;
-------------------------------------------------------------------------------

end arch;

4.2.- PROGRAMA DE INSTANCIACION VGA_SYNC-UNIT


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

-- Uncomment the following library declaration if using


-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating


-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity vga_sync is
Port ( clk, reset : in STD_LOGIC;
hsync, vsync : out STD_LOGIC;
video_on, p_tick : out STD_LOGIC;
pixel_x, pixel_y : out STD_LOGIC_VECTOR (9 downto 0));
end vga_sync;

architecture comporta of vga_sync is

-- VGA 640X480 PARMETROS DE SINCRONIZACIN


constant HD: integer:=640; -- zona visible horizontal
constant HF: integer:=16 ; --borde derecho
constant HB: integer:=48 ; --borde izquierdo
constant HR: integer:=96 ; --retrazado horizontal

constant VD: integer:=480; --zona visible vertical


constant VF: integer:=10; --borde inferior
constant VB: integer:=33; --borde superior
constant VR: integer:=2; --retrazado vertical
signal mod2_reg, mod2_next: std_logic;
signal v_count_reg, v_count_next: unsigned(9 downto 0);
signal h_count_reg, h_count_next: unsigned(9 downto 0);
-- buffer de salida
signal v_sync_reg, h_sync_reg: std_logic;
signal v_sync_next, h_sync_next: std_logic;
-- seales de estado
signal h_end, v_end, pixel_tick: std_logic;

begin

process (clk,reset)
begin
if reset='1' then
mod2_reg <= '0';
v_count_reg <= (others=>'0');
h_count_reg <= (others=>'0');
v_sync_reg <= '0';
h_sync_reg <= '0';
elsif (clk'event and clk='1') then
mod2_reg <= mod2_next;
v_count_reg <= v_count_next;
h_count_reg <= h_count_next;
v_sync_reg <= v_sync_next;
h_sync_reg <= h_sync_next;
end if;

end process;

-- generador de 25 MHz
mod2_next <= not mod2_reg;
-- 25 MHz pixel tick
pixel_tick <= '1' when mod2_reg='1' else '0';
-- fin del contador horizontal
h_end <= '1' when
h_count_reg=(HD+HF+HB+HR-1) else '0'; --799

-- fin del contador vertica


v_end <= '1' when
v_count_reg=(VD+VF+VB+VR-1) else '0';--524

-- contador para el hsync


process (h_count_reg,h_end,pixel_tick)
begin
if pixel_tick='1' then -- 25 MHz
if h_end='1' then
h_count_next <= (others=>'0');
else
h_count_next <= h_count_reg + 1;
end if;
else h_count_next <= h_count_reg;
end if;
end process;

-- contador para el vsync


process (v_count_reg,h_end,v_end,pixel_tick)
begin

if pixel_tick='1' and h_end='1' then


if (v_end='1') then
v_count_next <= (others=>'0');
else
v_count_next <= v_count_reg + 1;
end if;
else
v_count_next <= v_count_reg;
end if;
end process;

-- hsync y vsync se registran buffer para evitar posibles glitch


h_sync_next <= '1' when
(h_count_reg>=(HD+HF)) and (h_count_reg<=(HD+HF+HR-1)) else '0';

-- entre 656 y 751


v_sync_next <= '1' when
(v_count_reg>=(VD+VF)) and (v_count_reg<=(VD+VF+VR-1)) else '0';

--entre 490 y 491


-- video on/off
video_on <= '1' when (h_count_reg<HD) and (v_count_reg<VD) else '0';

-- seales de salida
hsync <= h_sync_reg;
vsync <= v_sync_reg;
pixel_x <= std_logic_vector(h_count_reg);
pixel_y <= std_logic_vector(v_count_reg);
p_tick <= pixel_tick;

end comporta;

4.3.-PROGRAMA DE INSTANCIACION FONT_GEN_UNIT


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
-------------------------------------------------------------------------------entity font_test_gen is
Port ( clk : in STD_LOGIC;
video_on : in STD_LOGIC;
pixel_x, pixel_y : STD_LOGIC_VECTOR (9 DOWNTO 0);
rgb_text : out STD_LOGIC_VECTOR (2 DOWNTO 0));
end font_test_gen;
-------------------------------------------------------------------------------architecture arch of font_test_gen is

signal rom_addr: std_logic_vector(10 downto 0);


signal char_addr: std_logic_vector(6 downto 0);
signal row_addr: std_logic_vector(3 downto 0);
signal bit_addr: std_logic_vector(2 downto 0);
signal font_word: std_logic_vector(7 downto 0);
signal font_bit, text_bit_on: std_logic;
-------------------------------------------------------------------------------begin

-- instantiate font ROM


font_unit: entity work.font_rom
port map(clk=>clk, addr=>rom_addr, data=>font_word);

-- font ROM interface


char_addr<=pixel_y(5 downto 4) & pixel_x(7 downto 3);

row_addr<=pixel_y(3 downto 0);


rom_addr <= char_addr & row_addr;
bit_addr<=pixel_x(2 downto 0);
font_bit <= font_word(to_integer(unsigned(not bit_addr)));
-- "on" region limited to top-left corner
text_bit_on <=
font_bit when pixel_x(9 downto 8)="00" and
pixel_y(9 downto 6)="0000" else
'0';

-- rgb multiplexing circuit


process(video_on,font_bit,text_bit_on)
begin
if video_on='0' then
rgb_text <= "000"; --blank
else
if text_bit_on='1' then
rgb_text <= "010"; -- green
else
rgb_text <= "000"; -- black
end if;
end if;
end process;
------------------------------------------------------------------------------end arch;

4.4.-PROGRAMA FONT_UNTI-FROM-ROM
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

--------------------------------------------------------------------------------entity font_rom is
Port ( clk : in STD_LOGIC;
addr :JEH in STD_LOGIC_VECTOR (10 DOWNTO 0);
data : out STD_LOGIC_VECTOR (7 DOWNTO 0));
end font_rom;
--------------------------------------------------------------------------------architecture arch of font_rom is

constant ADDR_WIDTH: integer:=11;


constant DATA_WIDTH: integer:=8;
signal addr_reg: std_logic_vector(ADDR_WIDTH-1 downto 0);
type rom_type is array (0 to 2**ADDR_WIDTH-1)
of std_logic_vector(DATA_WIDTH-1 downto 0);

-- ROM definition
constant ROM: rom_type:=( -- 2^11-by-8
-- code x45
"00000000", -- 0
"00000000", -- 1
"11111110", -- 2 *******
"01100110", -- 3 ** **
"01100010", -- 4 ** *
"01101000", -- 5 ** *
"01111000", -- 6 ****
"01101000", -- 7 ** *
"01100000", -- 8 **
"01100010", -- 9 ** *
"01100110", -- a ** **
"11111110", -- b *******

"00000000", -- c
"00000000", -- d
"00000000", -- e
"00000000", -- f
-- code x53
"00000000", -- 0
"00000000", -- 1
"01111100", -- 2 *****
"11000110", -- 3 ** **
"11000110", -- 4 ** **
"01100000", -- 5 **
"00111000", -- 6 ***
"00001100", -- 7
"00000110", -- 8

**
**

"11000110", -- 9 ** **
"11000110", -- a ** **
"01111100", -- b *****
"00000000", -- c
"00000000", -- d
"00000000", -- e
"00000000", -- f
-- code x43
"00000000", -- 0
"00000000", -- 1
"00111100", -- 2 ****
"01100110", -- 3 ** **
"11000010", -- 4 **
"11000000", -- 5 **
"11000000", -- 6 **
"11000000", -- 7 **

"11000000", -- 8 **
"11000010", -- 9 **

"01100110", -- a ** **
"00111100", -- b ****
"00000000", -- c
"00000000", -- d
"00000000", -- e
"00000000", -- f
ASIGNACION DE SALIDAS
# PlanAhead Generated physical constraints

NET "clk" LOC = C9;


NET "hsync" LOC = F15;
NET "reset" LOC = D18;
NET "rgb[0]" LOC = G15;
NET "rgb[1]" LOC = H15;
NET "rgb[2]" LOC = R14;
NET "vsync" LOC = F14;

5.-CONCLUSIONES
-Para el uso de subrutinas se hizo uso de components que el software Xilinx
proporciona.
- El tamao de la seal de la pantalla son 640x480 pixeles.
-Se utiliz el reloj interno del FPGA de 50Mhz y un divisor de frecuencia a 60Hz
para la entrada al puerto VGA.

6.-PRUEBAS

SPARTAN 3E

Conexin SPARTAN con Monitor VGA del laboratorio

Visualizacion de los caracteres en el monitor VGA

6.-BIBLIOGRAFIA
http://www.uhu.es/raul.jimenez/MICROELECTRONICA/prac1.pdf
http://www.xilinx.com/support/documentation/data_sheets/ds312.pdf
https://www.pantechsolutions.net/cpld-fpga-boards/vga-interfacing-withspartan-3-primer
https://www.um.edu.mt/__data/assets/pdf_file/0008/66779/MNE_2202__Project.pdf

You might also like