01signal.com

Quartus / Linux: Programación de la FPGA desde la línea de comandos

¿Línea de comandos?

Sí, es mucho más cómodo que el programador de la interfaz gráfica (GUI). Cargar una FPGA con un archivo de flujo de bits (bitstream) es una tarea recurrente: siempre es el mismo archivo en la misma FPGA, montada en la misma placa y conectada al mismo ordenador. Y, no sé cómo, las herramientas gráficas lo convierten en una ceremonia intimidante (y a veces incluso en un examen, cuando no consiguen averiguar exactamente qué dispositivo está conectado y se supone que debo saberlo yo).

Con la línea de comandos, basta con recuperar el comando del historial de bash y pulsar Enter. Y, sorprendentemente, la herramienta de línea de comandos no hace las preguntas absurdas que hace la herramienta gráfica.

Primero, un poco de experimentación

Hay que preparar el entorno:

$ /path/to/quartus/15.1/nios2eds/nios2_command_shell.sh

Para listar todos los dispositivos que se encuentran (el cable se detecta automáticamente):

$ quartus_pgm --auto
Info: *******************************************************************
Info: Running Quartus Prime Programmer
    Info: Version 15.1.0 Build 185 10/21/2015 SJ Lite Edition
    Info: Copyright (C) 1991-2015 Altera Corporation. All rights reserved.
[ ... ]
    Info: agreement for further details.
    Info: Processing started: Sun May 27 15:06:22 2018
Info: Command: quartus_pgm --auto
Info (213045): Using programming cable "USB-BlasterII [2-5.1]"
1) USB-BlasterII [2-5.1]
  02B040DD   5CGTFD9(A5|C5|D5|E5)/..
  020A40DD   5M2210Z/EPM2210

[ ... ]

Ten en cuenta que listar los dispositivos como se ha mostrado arriba no es necesario para cargar el flujo de bits. Puede servir para determinar la posición de la FPGA en la cadena JTAG, quizá. En realidad es algo que se hace una vez para explorar la placa.

jtagd

Es importante saber que existe este demonio (daemon), que escucha en el puerto TCP/IP 1309. Es el encargado de hablar con el adaptador JTAG a través del bus USB, así que tanto el programador gráfico como la herramienta de línea de comandos dependen de él. Si no hay ningún demonio en marcha, ambos lo arrancan.

Pero si usas varias versiones de Quartus, esto puede ser un motivo de confusión, sobre todo si primero intentas cargar la FPGA con una versión antigua y luego pruebas con una más nueva. La razón es que la versión más nueva de Quartus seguirá usando la versión antigua de jtagd. Y ese jtagd antiguo puede no soportar FPGAs que la versión nueva sí soporta. Así que la conclusión es que, si pasan cosas raras, esto puede arreglar el problema, y tampoco hace daño:

$ killall jtagd

Cargando la FPGA

quartus_pgm muestra casi toda su salida en texto verde. Por regla general, si no hay texto en rojo, todo ha ido bien.

$ quartus_pgm -m jtag -o "p;path/to/file.sof"

Alternativamente, se puede indicar explícitamente la posición del dispositivo en la cadena JTAG (en particular si no es el primero). En este caso es @1, lo que significa que es el primer dispositivo de la cadena JTAG. Si es el segundo, se usa @2, etc.

$ quartus_pgm -m jtag -o "p;path/to/file.sof@1"
Info: *******************************************************************
Info: Running Quartus Prime Programmer
    Info: Version 15.1.0 Build 185 10/21/2015 SJ Lite Edition
    Info: Copyright (C) 1991-2015 Altera Corporation. All rights reserved.
    Info: Your use of Altera Corporation's design tools, logic functions
    Info: and other software and tools, and its AMPP partner logic
    Info: functions, and any output files from any of the foregoing
    Info: (including device programming or simulation files), and any
    Info: associated documentation or information are expressly subject
    Info: to the terms and conditions of the Altera Program License
    Info: Subscription Agreement, the Altera Quartus Prime License Agreement,
    Info: the Altera MegaCore Function License Agreement, or other
    Info: applicable license agreement, including, without limitation,
    Info: that your use is for the sole purpose of programming logic
    Info: devices manufactured by Altera and sold by Altera or its
    Info: authorized distributors.  Please refer to the applicable
    Info: agreement for further details.
    Info: Processing started: Sun May 27 15:35:02 2018
Info: Command: quartus_pgm -m jtag -o p;path/to/file.sof@1
Info (213045): Using programming cable "USB-BlasterII [2-5.1]"
Info (213011): Using programming file p;path/to/file.sof@1 with checksum 0x061958E1 for device 5CGTFD9E5F35@1
Info (209060): Started Programmer operation at Sun May 27 15:35:05 2018
Info (209016): Configuring device index 1
Info (209017): Device 1 contains JTAG ID code 0x02B040DD
Info (209007): Configuration succeeded -- 1 device(s) configured
Info (209011): Successfully performed operation(s)
Info (209061): Ended Programmer operation at Sun May 27 15:35:09 2018
Info: Quartus Prime Programmer was successful. 0 errors, 0 warnings
    Info: Peak virtual memory: 432 megabytes
    Info: Processing ended: Sun May 27 15:35:09 2018
    Info: Elapsed time: 00:00:07
    Info: Total CPU time (on all processors): 00:00:03

Si algo sale mal (dispositivo equivocado, un fallo al explorar la cadena JTAG o cualquier otra cosa), será difícil no darse cuenta, porque los errores se muestran en rojo. Lo bueno de la interfaz de línea de comandos es que cada intento lo empieza todo desde el principio, así que basta con encender la placa e intentarlo otra vez.

Kit de desarrollo de FPGA Cyclone 10 GX

Esta placa me dio más de un quebradero de cabeza, así que diré unas palabras sobre ella. Cuando se conecta al ordenador, aparece como 09fb:6810; sin embargo, después de intentar cargar la FPGA (fíjate en el «@2» del final) con:

$ quartus_pgm -m jtag -o "p;thecode.sof@2"
Error (213019): Can't scan JTAG chain. Error code 86.

El identificador del dispositivo cambia a 09fb:6010. Así que claramente hay una reprogramación del firmware (el registro del sistema muestra una desconexión y reconexión con el nuevo ID). El programador gráfico de Quartus detecta la placa como GX0000406, pero al hacer clic en «Auto Detect» se obtiene «Unable to scan device chain. Hardware is not connected».

Vale, ¿y si probamos a hacer un escaneo?

$ quartus_pgm --auto
[ ... ]
Info (213045): Using programming cable "10CGX0000406 [1-5.1.2]"
1) 10CGX0000406 [1-5.1.2]
  Unable to read device chain - Hardware not attached

Al parecer, mi problema era que el jtagd que estaba en marcha lo había arrancado una versión antigua de Quartus, que no reconocía los dispositivos Cyclone 10. Así que sigue el consejo de arriba y mátalo. Después de eso, la programación con el comando anterior funcionó con Quartus Pro 17.1:

$ quartus_pgm --auto
[...]
Info (213045): Using programming cable "USB-BlasterII [1-5.1.2]"
1) USB-BlasterII [1-5.1.2]
  031820DD   10M08SA(.|ES)/10M08SC
  02E120DD   10CX220Y
Esta página se ha traducido del inglés mediante traducción automática. En caso de duda, consulta el texto original.
Copyright © 2021-2026. All rights reserved. (dcc38493)