1. Instalarse el Xilinx ISE, yo tengo la versión 12.3, pero cualquiera puede valer. Luego echarle un vistazo a cualquier tutorial que hay en youtube, yo lo hice con http://www.youtube.com/watch?v=Ob7B6x5g6tw. La demo es en VHDL y consta de dos archivos importantes: vga.vhd y pins.out.
2. Compilar la demo. Me he basado en el vga.vhd de esta web, http://www.mikekohn.net/micro/fpga_vga.php. Los archivos son éstos:
vga.vhd
Código: Seleccionar todo
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity vga is
Port ( mclk : in STD_LOGIC;
red : out STD_LOGIC;
grn : out STD_LOGIC;
blu : out STD_LOGIC;
hs : out STD_LOGIC;
vs : out STD_LOGIC;
arml : out STD_LOGIC;
tril : out STD_LOGIC);
end vga;
architecture Behavioral of vga is
signal clk: STD_LOGIC;
signal horz_scan: STD_LOGIC_VECTOR (9 downto 0);
signal vert_scan: STD_LOGIC_VECTOR (9 downto 0);
signal vinc_flag: STD_LOGIC;
begin
-- Clock divide by 1/2
process(mclk)
begin
if mclk = '1' and mclk'Event then
-- clk <= clk xor mclk;
clk <= not clk;
end if;
end process;
-- horizonal clock
process(clk)
begin
if clk = '1' and clk'Event then
if horz_scan = "1100100000" then
horz_scan <= "0000000000";
else
horz_scan <= horz_scan + 1;
end if;
end if;
end process;
-- vertial clock (increments when the horizontal clock is on the front porch
process(vinc_flag)
begin
if vinc_flag = '1' and vinc_flag'Event then
if vert_scan = "1000001001" then
vert_scan <= "0000000000";
else
vert_scan <= vert_scan + 1;
end if;
end if;
end process;
-- horizontal sync for 96 horizontal clocks (96 pixels)
-- hs <= '1' when horz_scan(9 downto 7) = "000" else '0';
hs <= '1' when horz_scan < 96 else '0';
-- vertial sync for 2 scan lines
vs <= '1' when vert_scan(9 downto 1) = "000000000" else '0';
red <= '1' when vert_scan > 100 and vert_scan < 310 and horz_scan >= 144 and horz_scan < 784 else '0';
grn <= '1' when vert_scan >= 300 and vert_scan < 350 and horz_scan >= 144 and horz_scan < 784 else '0';
blu <= '1' when vert_scan >= 350 and vert_scan < 515 and horz_scan >= 144 and horz_scan < 784 else '0';
vinc_flag <= '1' when horz_scan = "1100011000" else '0';
arml <= '1';
tril <= '0';
end Behavioral;
pins.ucf
Código: Seleccionar todo
NET "mclk" LOC = P41 | IOSTANDARD = LVCMOS33 | PERIOD = 20ns ;
NET "red" LOC = P71 | IOSTANDARD = LVCMOS33;
NET "grn" LOC = P70 | IOSTANDARD = LVCMOS33;
NET "blu" LOC = P68 | IOSTANDARD = LVCMOS33;
NET "hs" LOC = P79 | IOSTANDARD = LVCMOS33;
NET "vs" LOC = P78 | IOSTANDARD = LVCMOS33;
NET "arml" LOC = P9 | IOSTANDARD = LVCMOS33;
NET "tril" LOC = P10 | IOSTANDARD = LVCMOS33;
El resultado es un archivo llamado vga.bit, lo podéis descargar aquí en caso de que sólo querráis testear el cable. http://antoniovillena.es/upload/vga.bit
3. Cargarlo en el OLS. Necesitáis bajaros un programa llamado ols_winloader.exe, desde aquí: http://www.mygizmos.org/ols/ols_winloader_v2.04.zip. Primero enchufáis el OLS al puerto USB, luego os aseguráis de que esté desmarcada la casilla "Perform OLS self test before writing" en el botón Advanced. Luego cargáis el archivo vga.bit, pulsáis UPDATE y luego RESET (sin soltar el UPDATE) hasta que los 2 leds verdes estén encendidos y finalmente le dais a OK (botón play) en el ols_winloader.exe. Comprobaréis que la demo se ha cargado en la ROM de la FPGA porque el led TRIG estará encendido y el ARM apagado.
4. Os hacéis el cable VGA. Para ello podéis o bien cortar un alargador por la mitad o como en mi caso usar el de un monitor roto. También necesitaréis 3 resistencias de 270 ohmios y 2 tiras de 6 pines, una hembra y la otra macho. Yo uso tiras con pines redondos, aunque también valen si son cuadrados. El esquema a montar es éste:
A mí me ha salido algo así:
Las masas son los pines 5,6,7,8 y 10 según el esquema. En otros esquemas también he visto el 11. Lo importante es que detectéis todos los cables con un polímetro de estos que pitan si hay corto. En mi caso sólo tuve que unir 5 y 10 como GND, el resto son pines individuales: los pines de sincronismo van directos y los R, G y B con resistencias a la tira de pines. Este es el orden que yo he empleado en la tira de pines, empezando por GND:
Código: Seleccionar todo
pin 1: GND
pin 2: HS
pin 3: VS
pin 4: RED
pin 5: GREEN
pin 6: BLUE
La tira de pines macho la soldáis al Wing Header del OLS por la parte más cercana a los Buffer Inputs (o más alejada al conector USB).
5. Y Voilá. Sólo tenéis que conectar la tira macho a la hembra haciendo coincidir GND, enchufar el otro lado del cable al monitor, encender el monitor, y alimentar la OLS por el puerto USB (enchufándolo al ordenador o a un cargador con salida USB).
Esto sería lo que se ve por pantalla: