Upload
yhan-karlo-calcina
View
60
Download
0
Embed Size (px)
Citation preview
INDICE
VISUALIZACION DE CARACTERES PERSONALIZADOS EN UN MONITOR VGA................................... 3
1.-MARCO TEORICO ............................................................................................................... 3
1.1-VGA DISPLAY PUERTO................................................................................................... 3
1.2.-FRECUENCIA DE LA SEÑAL DE 60 HZ, 640X480 VGA ....................................................... 4
1.3.-EL TIEMPO DE SEÑAL VGA............................................................................................ 6
2.-DESCRIPCION DEL PROGRAMA ........................................................................................... 6
3.-DIAGRAMA DE FLUJO ......................................................................................................... 8
4.-PROGRAMAS EN ISE ........................................................................................................... 9
4.1.-PROGRAMA DE ALTO NIVEL Font_tes_top .................................................................... 9
4.2.- PROGRAMA DE INSTANCIACION VGA_SYNC-UNIT.......................................................11
4.3.-PROGRAMA DE INSTANCIACION FONT_GEN_UNIT ......................................................15
4.4.-PROGRAMA FONT_UNTI-FROM-ROM ..........................................................................17
5.-CONCLUSIONES ................................................................................................................19
6.-PRUEBAS ..........................................................................................................................20
6.-BIBLIOGRAFIA...................................................................................................................21
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 mayoría 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 señales VGA a través de resistencias. Cada
línea 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 combinación con la impedancia de 75Ω integrado en el
cable VGA, aseguran que las señales de color permanecen en el 0V VGA-especificado gama 0.7V.
Las señales 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 información de tiempo es proporcionado como un ejemplo de cómo el FPGA podría conducir un monitor VGA en el modo 640 por 480.
1.2.-FRECUENCIA DE LA SEÑAL DE 60 HZ, 640X480 VGA Los display CRT-basados pantallas VGA utilizan amplitud modulada, moviendo haces de electrones
(o cátodo) para mostrar la información en una pantalla recubierta de fósforo. LCDs util izan una
serie de interruptores que puede imponer un voltaje a través de una pequeña cantidad de cristal
líquido, cambiando así la luz a través del cristal sobre una base de pixel por pixel. Aunque la
siguiente descripción se limita a los monitores CRT, los monitores LCD han evolucionado para
utilizar los mismos tiempos de señal como pantallas CRT. En consecuencia, la siguiente discusión se refiere tanto a los tubos de rayos catódicos y LCDs.
Dentro de una pantalla CRT, formas de onda de corriente pasan a través de las bobinas para
producir campos magnéticos que los haces de electrones se desvían al atravesar la superficie de la
pantalla en un patrón de barrido, horizontal de izquierda a derecha y verticalmente de arriba a
abajo. Como se muestra en la Figura 2, la información sólo se muestra cuando el haz se mueve en
la dirección 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 visualización se pierde en los periodos de supresión cuando
el haz se restablece y estabilizado para comenzar un nuevo pase de visualización horizontal o vertical.
La resolución de visualización define el tamaño de las vigas, la frecuencia a la cual el haz pasa a
través 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
resolución mediante la producción de señales de temporización para controlar los patrones de
trama. El controlador produce impulsos de sincronización de nivel TTL que marcan la f recuencia a
la que la corriente fluye a través de las bobinas de deflexión, y asegura que los datos de píxeles o vídeo se aplica al haz de electrones en el momento correcto.
Los datos de vídeo normalmente proviene de una memoria de actualización de vídeo con uno o
más bytes asignado a cada posición de pixel. Spartan-3E Starter Kit utiliza tres bits por píxel,
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 sincronización horizontal (HS) y
vertical sync (VS) señales de los tiempos y coordina la entrega de datos de vídeo en cada reloj de píxeles.
La frecuencia de píxel define el tiempo disponible para mostrar un píxel de la información. La señal
VS define la frecuencia de refresco de la pantalla, o la frecuencia a la que toda la información en la
pantalla se vuelve a dibujar.
1.3.-EL TIEMPO DE SEÑAL VGA
Los tiempos de señal en la tabla 2 se derivan de 640 píxeles por pantalla 480 fila usando un 25
MHz de reloj de píxeles y 60 Hz ± 1 refresco. Figura 3 muestra la relación entre cada uno de los símbolos de sincronización.
En general, un contador sincronizado por el reloj de píxeles controla la sincronización horizontal.
Descifrando valores del contador generan la señal HS. Este contador rastrea en la pantalla la actual ubicación del pixel en una fila determinada.
Un contador separado el seguimiento de la sincronización vertical. El contador vertical
sincronización con cada pulso HS y los valores decodificados generan la señal VS. Este contador
rastrea la actual fila de la pantalla. Estos dos contadores que se ejecutan continuamente forman la
dirección en una memoria intermedia de visualización. Por ejemplo, el DDR SDRAM proporciona un búfer de visualización ideal.
2.-DESCRIPCION DEL PROGRAMA
Este proyecto implementa la comunicación por el puerto VGA del modulo Spartan 3E con un monitor LCD mostrando caracteres en código 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 instanciación vga_sync_unit y font_sync_unit.
La rutina vga_sync_unit se usa para la sincronización 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 tamaño de los caracteres.
Toda la comunicación 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 , podría decirse que es nuestra base de datos.
La rutina Font_sync_unit almacena todos estos datos en la memoria ROM del Spartan y también el color de los caracteres , el color elegido es azul cuyo código 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
Declaración de
entradas y salidas
Archivo de
alto nivel
Font-test _top
Declaración de los programas
de instanciacion
Subrutina
Vga_sync_unit
Subrutina
Font_gen-unit
Divisor de frecuencia de
60Hz para entrada del monitor VGA
VGA 640X480 PARÁMETROS
DE SINCRONIZACIÓN
SUBRUTINA DE
INSTANCIACIO
N
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 PARÁMETROS DE SINCRONIZACIÓN
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;
-- señales 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';
-- señales 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 tamaño de la señal 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
Conexión 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-with-spartan-3-primer
https://www.um.edu.mt/__data/assets/pdf_file/0008/66779/MNE_2202_-_Project.pdf