En este apartado pretendemos
explicar la manera de utilizar módulos diseñados en VHDL dentro de código
Handel-C que estará escrito y compilado con DK (y por tanto se ejecutará en la
FPGA al programarla con él “.bit” resultado de todo este proceso). De esta
manera podremos pasar como entrada de un módulo valores obtenidos en el código
Handel-C y utilizar los valores de salida de dicho modulo para realizar otros
cálculos en el código escrito en Handel-C.
Para comunicar el código Handel-C con VHDL ha sido necesario
utilizar una definición de interface que se ajustara a la entidad de VHDL, con
lo que conseguimos una instancia de esta interface así como definir los datos
que serán transmitidos, tanto hacia la entidad VHDL como desde ella. La
definición de un interface sigue el siguiente formato:
interface nombre_entidad_VHDL
(puerto_salida_entidad [with especificación_puerto]
{, puerto_salida_entidad [with especificación_puerto]})
nombre_instancia
(puerto_salida_entidad [with especificación_puerto]
{, puerto_salida_entidad [with especificación_puerto]})
with {busformat = “tipo_busformat”};
Donde tipo_busformat puede tomar los siguientes valores: “B”, “B[I]”,
“B(I)”, “B<I>”, “BI”, “B_I” , “B[N:M]” , “B(N:M)” , “B<N:M>” ,
“B[N]” , “B(N)” y “B<N>” Así, tendremos que hacer tantas definiciones de
interface de una entidad VHDL como instancias de dicha entidad queramos
utilizar en nuestro código Handel-C, es decir, si quisiéramos tener dos
instancias de un determinado tipo de entidades, tendríamos que hacer dos
definiciones de su interface.
Hay que tener muy en cuenta que el
nombre de la interface en el código Handel-C y de la entidad en el VHDL, los
nombres de los puertos en ambos sitos y el orden de los mismos debe ser
idéntico. Otra cosa en la que hay que fijarse mucho (si no, nos dará error al
generar el “.bit” en el Project Navigator) es en el valor que pongamos en el “busformat” al crear los archivos VHDL
finales o bien un EDIF con el DK.
El “busformat” sirve para indicar el nombre que se va a generar en el
EDIF para cada componente de un vector de la entidad VHDL definida en la
interface Handel-C. Por ejemplo, si uno de los puertos de nuestra entidad VHDL
es de la forma salida std_logic_vector (3 downto 0), para que los archivos de
salida sean generados con los nombres correctos (salida(0), salida(1), ...) es
necesario poner en la definición del interface with {bus_format = “B(I)”}.
Se tienen 2 maneras para obtener el
archivo final .bit del FPGA, las cuales se enuncia a continuación:
1) Todos los archivos fuentes del proyecto son
VHDL
2) Archivo EDIF por DK y archivo NGC del
módulo VHDL a integrar sintetizado por XILINX.
- Desarrollemos las 2 formas de realizar este proceso por medio de un ejemplo para dos plataformas, una para XILINX y otra para ALTERA.
El ejemplo consistirá en integrar un CORE VHDL de un sumador de 8
bits llamado AddVHDL.vhd cuyo código fuente es:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity AddVHDL is
Port ( x : in STD_LOGIC_VECTOR (7 downto 0);
y : in
STD_LOGIC_VECTOR (7 downto 0);
z : out STD_LOGIC_VECTOR (7 downto 0));
end AddVHDL;
architecture Behavioral of AddVHDL
is
begin
z
<= x + y;
end Behavioral;
- Las herramientas necesarias para realizar estos ejemplos son:
Ø Xilinx Design Tools ISE Suite 14.7
Ø DK Desing suite 5.0 SP5
Ø Synplify Pro H-2013.03
Ø Quartus II 13.1
Ø Tarjeta Spartan 3AN (XC3S700AN)
Ø Tarjeta DE0 ALTERA (EP3C16F484C6N)
- Ejemplo 1.- Plataforma XILINX todos los archivos son VHDL
- Pasos:
I.
Hacer
un nuevo proyecto en DK Handel-C llamado suma. El código de main.hcc es el
siguiente:
#include "delay.hch"
set clock = external "E12";
unsigned 8 LEDS,n,m;
interface bus_out() salida(LEDS) with
{data =
{"W21","Y22","V20","V19","U19","U20","T19","R20"}};
interface AddVHDL(unsigned 8
z)
AddVHDL(unsigned 8 x = n, unsigned 8 y = m) with
{vhdl_type = "std_logic_vector",busformat="B(I)"};
void main(void)
{
par
{
while(1)
{
LEDS = AddVHDL.z;
}
while(1)
{
par
{
n++;
m++;
}
delay_ms(C_MHZ,1000);
//1000 ms
}
}
}
Configuraciones de DK Handel-C
II. Hacer un proyecto en ISE de
Xilinx llamado suma y agregar los archivos AddVHDL.vhd, main_hcc.vhd,
agility.vhd, suma.vhd, suma.ufc.
III. Cambiar
en la línea 197 del archivo main_hcc.vhd I0_AddVHDL_main_32
: AddVHDL por I0_AddVHDL_main_32 :
entity work.AddVHDL. Después guardar e implementar todo el proceso.
- Ejemplo 2.- Plataforma XILINX archivo EDIF por DK y archivo NGC del módulo VHDL.
- Pasos:
I.
Utilizando
el mismo código del Ejemplo 1 anterior. La única variante es en las propiedades
de DK cambiar de VHDL a EDIF. En la pestaña superior cambiar a EDIF y por
ultimo construir el proyecto.
II. Crear un nuevo proyecto en ISE
de XILINX escogiendo XST como opción de síntesis y agregar el archivo
AddVHDL.vhd. En las propiedades de síntesis deshabilitar la opción “Add I/O buffers”
y por ultimo correr el proceso solo de síntesis.
III. Crear
otro proyecto con ISE de XILINX para conjuntar los archivos EDIF generado por
DK Handel-C y NGC generado a partir del módulo VHDL sintetizado en el paso 2.
·
Seleccionar
EDIF como fuente de archivo TOP.
·
Importar
el archivo EDIF ubicado en la carpeta de proyecto DK Handel-C
·
Copiar
el archivo AddVHDL.NGC que se genero en ISE de XILINX cuando se sisntetizo el
archivo VHDL a la nueva carpeta de proyecto.
·
Correr
todo el proceso de implementacion.
- Ejemplo 3.- Plataforma ALTERA todos los archivos son VHDL
- Pasos:
I.
Generar
los archivos VHDL en DK Handel-C con las opciones para la plataforma Altera.
Tarjet Family AletarCycloneIII y HDL
output Style SynplifyPro.
II. Hacer
un proyecto en QUARTUS II de Altera llamado suma y agregar los archivos AddVHDL.vhd, main_hcc.vhd, agility.vhd, suma.vhd, suma.tcl.
III. Correr
el script suma.tcl
IV.
Clic
derecho en el archivo agility.vhd y en propiedades escribir en Library:
agility.
V.
Cambiar
en la línea 195 del archivo main_hcc.vhd I0_AddVHDL_main_32
: AddVHDL por I0_AddVHDL_main_32 :
entity work.AddVHDL. Después guardar e implementar todo el proceso de compilación. Y por último programar el FPGA.
Handel-C language
reference.
No hay comentarios.:
Publicar un comentario