Hace poco tiempo he adquirido una placa de desarrollo que tiene lo mínimo indespensable como para comenzar a desarrollar algunas cositas ;D Lo que pretendo compartir en este post son unos programas sencillos que nos permitan ir familiarizando con el entorno y con la placa:
FPGA: CycloneII EP2C8Q208C8
FLASH: 16Mbit SPI Flash EPCS16
Memory: 8MByte 16bit SDRAM K4S641632H
Onboard 50MHz oscillator
Onboard 3.3V/1.2V LDO
Onboard power switch
One JTAG download and debug port
One user button and one status LED
Total 132 avaliable user IOsPara trabajar con el entorno recomiendo los siguientes vídeos, entre los dos van a lograr construir un proyecto, compilar, simular, asignar las señales a los pines del FPGA y finalmente grabar.
Nota: Si tienen problema con el USB Blaster las opciones son, ejecutar Quartus II en modo administrador, re-grabar la eeprom del USB Blaster (FTDI), o buscar los driver de una versión anterior. A mi la 10.0 me funciono joya.
Una vez que logramos armar el proyecto y compilarlo, el paso siguiente es simularlo o directamente grabarlo en el FPGA. Para este último paso necesitamos indicarle que pines del FPGA van a ser utilizados y aquí es importante tener el
esquemático de la placa a mano.
Como primer ejemplo podemos hacer un divisor de frecuencia, ya que tenemos un oscilador de 50MHz y un led en la misma placa. Se toma la señal de oscilador, la dividimos tantas veces como sea necesario para producir una señal de 1 Hz y la conectamos al led. En VHDL podria implementarse lo siguiente:
-- Declaracion de librerias
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Declaracion de la entidad ---
entity DivisorFrecuencia is
generic(
RESOLUCION: integer:=25;
DIVISION: integer:=25000000
);
Port (
CLK_i : in std_logic;
CLK_o: out std_logic
);
end DivisorFrecuencia;
-- Declaracion de la arquitectura ---
architecture behavior of DivisorFrecuencia is
signal sgCLK_o: STD_LOGIC;
begin
CLK_o<=sgCLK_o;
ProcessDIV:
process(CLK_i)
variable count: std_logic_vector(RESOLUCION-1 downto 0):= (others => '0');
begin
if(rising_edge(CLK_i))then
count:= count + 1;
if(count=DIVISION)then
count:= (others => '0');
sgCLK_o <= not sgCLK_o ;
end if;
end if;
end process;
end;
Bien, ahora para probar este simple ejemplo recurrimos al esquemático de la placa, donde podemos ver que la señal de 50 MHz ingresa en el
PIN_132 y que el led está conectado en
PIN_208. Con esos datos vamos a
Assignment/Assignment Editor o
Assignment/Pin Planner y colocamos lo siguiente:
Guardamos y compilamos de nuevo. Solo queda grabar y ver como titila el led
Tools/Programmer ... Seleccionar programador ( USB-Blaster [USB-0]),
JTAG y Start.
Bien, como sabemos un FPGA es un dispositivo volátil, entonces se necesita configurarla cada vez que se enciende. Aquí entra en juego el uso del EPCS16 (M25P16) que dispone la placa. Para grabar este dispositivo los pasos son los siguientes:
- Luego de compilar vamos a File/Convert Programming File
- Seleccionamos *.JIC como tipo de archivo de salida.
- Seleccionamos EPCS16
- Seleccionamos el FPGA utilizado y el archivo *.SOF.
- Generamos archivo.
Luego de ello abrimos nuevamente el programador y agregamos el archivo
*.jic creado en el paso anterior, marcamos
Program/Configure y
Start.
Listo, ahora cada vez que encendamos la placa "ejecutara" esta aplicación

El próximo será configurar un
NIOS II para los elementos que disponemos en esta placa
