Creación y programación de un MCU con Arduino
Configuración de la placa de bajo coste FPGA de Arty con una plataforma RISC-V compatible con Arduino.
En esta publicación, echaremos un vistazo a cómo se puede configurar la económica placa Arty Diligent basada en Xilinx Artix-7 (diseñada para fabricantes y aficionados) con un microcontrolador RISC-V de código abierto que se puede crear opcionalmente con fuentes RTL. Una vez hecho esto, se puede programar a través de Arduino IDE o una cadena de herramientas GNU basada en makefile.
Partimos de la idea de que hay una familiaridad básica con Linux, git, makefile y la compilación de software.
Freedom E310
Diagrama de bloques de nivel superior de la plataforma E300, © 2017 SiFive Inc.
RISC-V es una arquitectura de conjunto de instrucciones abierta y gratuita (ISA, de sus siglas en inglés) que se ha publicado con una licencia libre para impulsar su adopción generalizada y permitir que cualquiera pueda implementarla en sus propios dispositivos compatibles, ya sea en una simulación, FPGA o ASIC. Los dispositivos pueden ir desde los de clase IoT de potencia ultrabaja, pasando por los de clase de servidor móvil, portátil o de sobremesa, hasta los dispositivos para aplicaciones HPC.
Sin embargo, ten en cuenta que RISC-V no es un procesador de por sí: es una especificación ISA. Pero la RISC-V Foundation sí que ofrece una implementación de procesador de referencia llamada Rocket, además de herramientas que ayudan a crear núcleos y una cadena de herramientas de compilador GNU.
SiFive, la organización comercial fundada por los creadores de RISC-V, ofrece productos que incluyen núcleos IP y plataformas SoC que cuentan con servicios de consultoría. Su plataforma SoC Freedom E300 se basa en un Coreplex E3, está disponible como ASIC y se puede utilizar para FPGA.
El diseño del chip Freedom E310 que cargaremos en la memoria de configuración para la placa Arty se basa en la arquitectura SoC que se mostró anteriormente.
Hardware
Si bien la Diligent Arty 410-319 (código RS n.º 134-6478) dispone de un adaptador USB-JTAG que se puede utilizar para programar la Xilinx Artix-35T FPGA directamente, además de una memoria flash Quad-SPI que suele utilizarse para configurar la FPGA en el arranque, también se necesita un adaptador USB-JTAG ARM-USB-TINY-H para conseguir una conexión de depuración y programación con el núcleo RISC-V.
¡Pero cuántas interfaces y opciones! Pues recuerda que estamos hablando de una plataforma completamente programable, en la que eres libre de modificar hasta el diseño de la propia MCU, además de poder cargar tu propio código para ejecutarlo.
Cableado de USB-JTAG
La guía de inicio del kit de desarrollo FPGA de Arty para Freedom E300 contiene detalles sobre cómo se puede conectar el adaptador, junto con instrucciones sobre cómo crear la cadena de herramientas SoC y GNU, programar la placa, etcétera. Por supuesto, esta es la documentación de referencia a la que tienes que recurrir en caso de dudas; hemos escrito los pasos que se describen en este artículo a partir de la información de la guía.
Cableado JD del conector PMOD
Hemos usado los colores de cables que se sugieren en la guía. No necesitas montar ni desmontar puentes de la placa; solo tienes que asegurarte de que te conectas al PMOD JD y no a los otros.
También es necesario añadir nuevas reglas de udev para poder acceder a ARM-USB-TINY-H:
Edita /etc/udev/rules.d/99-openocd.rules y añade:
# Estas opciones son para el depurador Olimex, para usar con el kit de desarrollo E310 Arty
SUBSYSTEM=="usb", ATTR{idVendor}=="15ba", ATTR{idProduct}=="002a", MODE="664", GROUP="plugdev"
SUBSYSTEM=="tty", ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"
Después introduce:
$ sudo udevadm control --reload-rules
Si tu cuenta de usuario no está aún en el grupo plugdev, tienes que añadirla a este y, una vez que lo hayas hecho, cierra e inicia sesión.
Cadena de herramientas de FPGA
Tendrás suficiente con la versión gratuita “WebPACK” de las herramientas Vivado HL; también tendrás disponible un programa de descarga una vez que hayas iniciado sesión en el sitio web de Xilinx. Cuando hayas completado la instalación, tienes que añadir la compatibilidad con las placas Diligent, algo que puedes hacer con solo obtener los archivos y copiarlos donde corresponde.
Por ejemplo, una vez que descargas el instalador de Vivado 2017.1, el proceso es el siguiente:
Convierte el instalador en ejecutable y ejecuta esto como root:
$ chmod +x Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin
$ sudo ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin
Instala los controladores de los cables:
$ cd /opt/Xilinx/Vivado/2017.1/data/xicom/cable_drivers/lin64/install_script/install_drivers
$ sudo ./install_drivers
Obtén los archivos de compatibilidad con las placas Diligent y cópialos donde corresponde:
$ git clone https://github.com/Digilent/vivado-boards.git
$ sudo cp -r vivado-boards/new/board_files/* /opt/Xilinx/Vivado/2017.1/data/boards/board_files/
Vuelve al directorio principal y configura las variables del entorno:
$ cd
$ source /opt/Xilinx/Vivado/2017.1/settings64.sh
Necesitarás obtener el script cada vez que inicies sesión o cuando se abra una nueva terminal.
En este punto, la GUI se puede iniciar escribiendo:
$ vivado
Configuración de placa
Puedes descargar un archivo de programación flash que integra un flujo de bits de FPGA predefinido, junto con el programa de demostración, desde el sitio web de SiFive (es necesario registrarse).
Después de ejecutar Vivado, abre el Administrador de hardware y conéctate con el objetivo de la placa. Luego, haz clic derecho en el FPGA, selecciona Add Configuration Memory Device (Añadir dispositivo de memoria de configuración) y luego selecciona la referencia Micron part n25q128-3.3v. Si luego decides programar el dispositivo, puedes seleccionar el archivo .mcs que has descargado.
Una vez que se haya completado la programación, si pulsas el botón rojo PROG, se configurará el FPGA y debería comenzar el programa de demostración, con lo cual los indicadores LED1 y LED2 se iluminan.
Si utilizas un emulador de terminal para conectarte a /dev/ttyUSB1, deberías ver un mensaje.
En este punto puedes o bien omitir la siguiente sección e ir directo a la programación de SOC a través de Arduino IDE o de la cadena de herramientas de GNU, o bien continuar y probar a compilar el propio SoC.
Compilación de chip
Primero necesitamos clonar recursivamente el repositorio de GitHub que contiene las fuentes Chisel RTL para las plataformas E300 y U500 de SiFive.
$ git clone --recursive https://github.com/sifive/freedom.git
Esto llevará un poco más de tiempo ya que se clonarán todos los submódulos git que agreguen dependencias, tales como Rocket Chip Generator y Chisel, entre otros.
Una vez que tengamos todo, se podrán compilar las fuentes Chisel en Verilog al introducir:
$ make -f Makefile.e300artydevkit verilog
Para hacer un archivo de configuración de memoria, primero tenemos que asegurarnos de que las variables del entorno Vivado se hayan configurado al obtener el archivo shell necesario como hemos comentado anteriormente. Luego, introduce:
$ make -f Makefile.e300artydevkit mcs
Esto impulsará la síntesis de la FPGA de Xilinx junto con el lugar y la ruta, entre otros datos. Al cabo de un rato, deberías tener tu nuevo archivo mcs. que podrás usar para programar tu configuración flash.
Ten en cuenta que la imagen flash generada no contiene un programa de demostración de forma predeterminada, como en el caso de la versión predefinida. Sin embargo, se puede agregar un programa a la imagen cuando editas el makefile correspondiente; para más detalles, consulta esta publicación del foro.
Compatible con Arduino
La forma más fácil, y con diferencia, de empezar a desarrollar software para Freedom E310 es aprovechar la compatibilidad con el uso de Arduino IDE dirigido hacia una placa Arty. Para ello, tenemos que ir a File → Preferences → Settings (Archivo → Preferencias → Configuración) y añadir la URL del Board Manager (Administrador de placa):
http://static.dev.sifive.com/bsp/arduino/package_sifive_index.json
Allí, podemos ir a Tools → Board → Board Manager (Herramientas → Placas → Administrador de placas), buscar SiFive Freedom Boards e instalar la compatibilidad con ellas. Después, podemos seleccionar la placa del kit de desarrollo de Arty para Freedom E300 antes de abrir el ejemplo "trusty blink", compilarlo y cargarlo en la placa.
Ten en cuenta que, si la programación falla en este punto, es posible que el USB-JTAG no esté conectado correctamente al conector PMOD, que no esté configurado el udev o que no estés en el grupo plugdev.
freedom-e-sdk
Si prefieres usar tu editor de texto favorito y desarrollar utilizando makefile, no te preocupes. Bastará con crear una cadena de herramientas GNU independiente, freedom-e-sdk.
Primero tenemos que conseguir las dependencias de compilación:
$ sudo apt-get install autoconf automake libmpc-dev libmpfr-dev libgmp-dev gawk bison flex texinfo libtool libusb-1.0-0-dev make g++ pkg-config libexpat1-dev zlib1g-dev
Luego, clonamos las fuentes y compilamos:
$ git clone --recursive https://github.com/sifive/freedom-e-sdk.git
$ cd freedom-e-sdk
$ make tools
Por último, para crear y después cargar el programa de demostración, introduce:
$ make software PROGRAM=demo_gpio BOARD=freedom-e300-arty
$ make upload PROGRAM=demo_gpio BOARD=freedom-e300-arty
Libertad para fragmentar
Con un coste mínimo y en poco tiempo, puedes tener tu plataforma personalizable de microcontroladores en marcha, en la que tendrás libertad para practicar a tus anchas el diseño de SoC. Y si crees que esto puede ser ya un poco excesivo, piensa que ya tienes en tus manos la plataforma compatible con Arduino más espectacular del momento.
Traducción del artículo escrito por Andrew Back, Open Source and Technical Communities Consulting de AB Open.