miércoles, 14 de septiembre de 2011

Tutorial emulación/simulación de Arduino en FPGA - Parte V

Compilar programas Arduino para simulación

En capítulos anteriores se ha simulado un programa Arduino previamente cargado. Para programar la FPGA con un sketch personalizado conviene diferenciar dos métodos:
  1. Modificar los bits directamente de la memoria en la FPGA y reemplazar el sketch cargado.
  2. Modificar el código inicial con el que se sintetiza el diseño del microcontrolador.
El primer método sólo sirve para la ejecución del sketch pero no habría forma de probarlo previamente. Es la forma de programar con el Arduino IDE modificado por Gadget Factory. Sólo hay que seleccionar la "board" aplicable en el menú Tools de Arduino. Por ejemplo Gadget Factory Papilio One 500K Board.

Para proyectos complejos es necesario simular y para ello el código del sketch debe ir previamente escrito en el proyecto (en VHDL).

El código inicial se guarda en bloques de memoria que lleva la FPGA, (de tipo BRAM). En el core se instancian bloques de tipo RAMB16_S18, que es un componente que proporciona Xilinx. En la hoja de características de la FPGA hay más explicaciones sobre los diferentes tipos de memoria que se pueden instanciar.

En el código suministrado se instancia el componente de memoria 8 veces: RAM_Word0 a RAM_Word7. En el código de inicialización de la instancia (ver fichero sources/Memory/XPM8Kx16.vhd) es posible dar los datos iniciales de cada bit, son los registros INIT_00 a INIT_3F.


RAM_Word0:component RAMB16_S18
generic map (
INIT => X"00000", -- Value of output RAM registers at startup
SRVAL => X"00000", -- Ouput value upon SSR assertion
WRITE_MODE => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE
-- The following INIT_xx declarations specify the intial contents of the RAM
-- Address 0 to 255
INIT_00 => PM_Inst_RAM_Word0_INIT_00,
INIT_01 => PM_Inst_RAM_Word0_INIT_01,
INIT_02 => PM_Inst_RAM_Word0_INIT_02,
...


En cada registro se pueden almacenar 64 dígitos hexadecimales, es decir 4x64 = 256 bits. En cada bloque hay 64 (3F) registros, por lo que hay 16.384 bits en cada bloque. Juntando los 8 bloques inicialmente instanciados, se pueden utilizar 16KBytes de memoria para programas Arduino.

PM_Inst_RAM_Word0_INIT_XX son constantes, que están definidas en el fichero sources/Memory/prog_mem_init.vhd:

constant PM_Inst_RAM_Word0_INIT_00 : bit_vector(0 to 255) := x"0053940C0053940C0053940C0053940C0053940C0053940C0053940C0030940C"; constant PM_Inst_RAM_Word0_INIT_01 : bit_vector(0 to 255) := x"0053940C0053940C0053940C0053940C0053940C0053940C0053940C0053940C";
...

Los caracteres hexadecimales son el sketch compilado para ser utilizado en ATmega.

En el fichero hardware\tools\butterfly_platform\Makefile del Arduino IDE modificado, se modifica la siguiente línea y se cambia por la ruta correcta:

PAPILIO_SIM_PATH = "C:/Arduino-Soft-Core/sources/Memory/prog_mem_init.vhd"

Si alguna de las carpetas tiene un espacio, es importante añadirle el carácter \ antes.

Ahora se selecciona la Gadget Factory Papilio Custom Board del menú Tools y al pulsar "Upload" se generará el nuevo fichero prog_mem_init.vhd.



Sólo queda repetir los pasos de los capítulos anteriores del tutorial para simular el sketch.

En el siguiente capítulo se modificará el diseño del proyecto para crear módulos de aceleración.


Parte I - Introducción
Parte II - Emulación del modelo RTL de Arduino
Parte III - Simulación con ModelSIM (si se usa una versión de pago)
Parte IV - Simulación con ISim (integrado en Xilinx ISE)
Parte V - Compilar programas Arduino para simulación
Parte VI - Acelerar, personalizar y optimizar Arduino

No hay comentarios: