sabato 20 agosto 2016

FPGA: Comunicazione tramite JTAG UART con C#

Le schede di sviluppo come la DE1-SOC così come le più compatte DE0-Nano o BEMICRO-CV-A9 non dispongono di un’interfaccia di comunicazione semplice ed interoperabile verso un computer per i propri progetti.

La soluzione più diffusa è l’aggiunta di un modulo USB-Seriale esterno, il che comporta però degli svantaggi quali: costi aggiuntivi, ulteriori dimensioni del sistema finale e utilizzo dei pin di I/O, non sempre disponibili agevolmente su schede di fascia elevata.

usb-uart-moduleEsempio di modulo USB-Seriale a basso costo

Nel caso in cui i propri design non utilizzino bus AXI o Avalon è però senza ombra di dubbio la scelta più semplice per il collegamento a dispositivi host USB come computer (classici o raspberry, etc..).

E’ però già disponibile nella quasi totalità delle schede di sviluppo, una porta USB per la programmazione, collegata ad un circuito USB-Blaster o equivalente di cui il componente principale è generalmente una CPLD collegata tramite interfaccia JTAG alla FPGA.

L’utilizzo della porta nei propri design su FPGA necessità però di IP dedicati come l’Altera Virtual JTAG di non semplice utilizzo e di programmi server lato computer come quartus_stp.exe. Per chi fosse interessato ad ogni modo ad intraprendere questa strada (su dispositivi Altera) ecco un buon tutorial.

E’ possibile utilizzare IP come l’Altera Avalon Jtag Uart per nascondere la complessità del protocollo sottostante. Se utilizzato assieme a soft-core come NIOS II è possibile nascondere anche i dettagli di comunicazione grazie ai driver inclusi nell’IP e disporre di un interfaccia stream standard STDIN, STDOUT per una programmazione molto semplice lato firmware.

Lato computer però la situazione è ancora abbastanza complicata in quanto è necessario utilizzare il programma nios2-terminal in modalità standalone o tramite la versione di Eclipse dedicata inclusa negli strumenti di sviluppo di Altera, il che però presuppone l’installazione di tutto il pacchetto EDA di svariati GB.

nios-ii-terminal
Programma nios2-terminal

eclipse-terminal
Finestra Nios II Console all’interno di Eclipse personalizzato per NIOS II

Lato computer è invece spesso necessaria un interfaccia API utilizzabile tramite qualsiasi linguaggio di programmazione, per poter automatizzare nel modo più comodo la comunicazione.

Altera non rende disponibile una documentazione ufficiale, ma tramite la libreria jtag_atlantic fornita con Quartus, la stessa utilizzata internamente da nios2-terminal, è possibile gestire la comunicazione. La libreria jtag_atlantic utilizza a sua volta la libreria jtag_client, che sarà quindi necessario avere anch’essa (sempre inclusa con Quartus).

Il progetto non ufficiale https://github.com/thotypous/alterajtaguart offre gli header della API e degli esempi per poter utilizzare jtag_atlantic tramite C/C++.

Per i linguaggi .NET come il C#, molto utili per la prototipazione rapida di software, non esiste purtroppo una libreria pronta all’utilizzo. Per ovviare al problema ho quindi scritto una libreria che risolvesse il problema. Oltre ad offrire gli header C# delle API eleva il livello di programmazione offrendo una classe di semplice utilizzo che incapsula al contempo tutte le funzionalità.

Vediamone rapidamente la struttura. La classe principale con cui interfacciarsi è chiamata JtagUart, il cui diagramma è sotto mostrato:

ClassDiagram1

Dispone di metodi intuitivi come Open, Read, Write e Close per gestire la comunicazione ed implementa il pattern Dispose per chiudere automaticamente la connessione dopo l’utilizzo. La classe presenta inoltre alcuni metodi per semplificare la lettura di stringhe, per leggere e scrivere singoli byte e per recuperare informazioni sulla connessione. E’ ben documentata nel possibile, visto che comunque la libreria jtag_atlantic non è ufficialmente documentata.

NB: Nel caso la propria applicazione richieda la lettura di una gran quantità di dati è consigliabile chiamare GetAvailableBytes per verificare se sono effettivamente disponibili ed evitare chiamate multiple alla funzione Read. Tramite la scheda di sviluppo DE1-SOC è possibile raggiungere una velocità di circa 850 KBytes/secondo durante la trasmissione al PC di informazioni.

Assieme alla classe è fornito un esempio di di classico ECHO che richiede lato firmware NIOS un programma di echo come il seguente:

nios-ii-firmware

Per progetti in cui è richiesto lo scambio di valori int32, double, etc.. tra PC e NIOS II è possibile estendere senza grossi problemi con funzioni ReadInt32, ReadDouble, WriteInt32, WriteDouble, etc.. la classe.

Con la libreria, abbinata ad un interfaccia utente, è possibile ottenere sicuramente dei risultati accattivanti. Buona comunicazione... tramite JTAG. Scarica il progetto

domenica 5 giugno 2016

Cyclone V SoC: Configuriamo ARM DS-5

Precedentemente avevamo visto come collegare la scheda DE1-SoC al computer tramite cavo ethernet, vediamo adesso come configurare al meglio il software DS-5 per essere maggiormente produttivi nella scrittura del software.

In particolare all’interno dello stesso programma riusciremo ad avere sotto controllo il filesystem, i processi ed un terminale per interagire col nostro sistema ed il debug remoto dei nostri programmi.

Come prima operazione cambiamo la password al nostro sistema Linux tramite il comando passwd,questo ci permetterà di collegarci tramite SSH in quanto una password, per quanto semplice sia, è mandatoria.

passwd

Apriamo adesso Eclipse for DS-5 e scegliamo il menù Window / Open Perspective / Other come mostrato nella figura seguente:

ds5_menu_perspective

Scegliamo Remote System Explorer e confermiamo con OK

open_perspective

Apparirà un nuovo pannello, facciamo click col tasto destro del mouse su Local e scegliamo New / Connection

new_connection

Alla richiesta del tipo di sistema remoto scegliamo Linux e facciamo click su Next. Specifichiamo adesso i dati di connessione della scheda e premiamo nuovamente Next.

new_connection_first_step

Selezioniamo ssh.files tra le configurazioni disponibili per utilizzare il protocollo Sftp per accedere al filesystem e premiamo Finish.

new_connection_files

Espandendo la voce DE1SOC e navigando tra i menù avremo adesso la possibilità di copiare file tramite drag-and-drop, visionare e terminare processi ed interagire col sistema tramite terminale.

ds5

NB: Verrà chiesta la password prima di accedere alle risorse del sistema remoto e la prima volta un messaggio di Warning ci informerà che l’autenticità dell’host non può essere stabilita, premete semplicemente Yes in quanto con una connessione diretta tramite ethernet non ci sono particolari problematiche di sicurezza.

rsa_fingerprint

Creiamo adesso un nuovo progetto scegliendo File / New / C Project. Scegliamo GCC come Toolchain, utilizzeremo gli strumenti gratuiti inclusi nella versione ARM DS-5 Community Edition.

w2

Il progetto creato sarà inizialmente vuoto, aggiungiamo un file sorgente scegliendo New / Source File ricordandoci di aggiungere l’estensione .C al nome del file.

w3

Creiamo un semplice Hello Arm con il seguente codice e compiliamo tramite Project / Build All:

hello

Selezioniamo Debug Configurations premendo il triangolino vicino al pulsante Debug, come illustrato nell’immagine seguente:

w5

A questo punto scegliamo come target Linux Application Debug / Application Debug / Connections via gdbserver / Download and debug application visto che andremo a fare il debug di un applicazione Linux. La versione più completa di DS-5 mostrerà in questa schermata anche altre opzioni di cui però non ci occuperemo.

w6

Spostandoci nella scheda adiacente Files scegliamo come Application on host to download tramite il pulsante Workspace l’eseguibile creato in precedenza.

w7

Nei campi Target download directory e Target working directory impostiamo il percorso /home/root

Confermiamo con Apply e chiudiamo la finestra di dialogo. Siamo adesso pronti ad effettuare un debug remoto con strumenti quali breakpoint, esecuzione passo passo e la visualizzazione di dati relativi a variabili e thread. Premiamo semplicemente il pulsante Debug per iniziare.

w8

Una volta terminata la sessione di Debug esplorando i file presenti nel sistema remoto noteremo la presenza dell’eseguibile, che sarà richiamabile anche in modo tradizionale tramite terminale.

fs

Nonostante questo articolo sia meno tecnico del solito, avere a disposizione la corretta procedura può accelerare la messa a punto della propria postazione di sviluppo. Alla prossima.