Getting started: Design di un Perceptron in FPGA con Vivado

In questo articolo per la rivista Elettronica Open Source  avevamo già visto sia la teoria sia la pratica su come realizzare un modello con Simulink (Matlab) e System Generator di una semplice rete neurale artificiale (ANN) perceptron e come eseguirne l’addestramento con NNTOOL. Seguendo un procedimento analogo possiamo implementare il nostro perceptron su un FPGA.

Tech Stack

[1] Vivado 2017.3
[2] Matlab R2017a
[3] System Generator 2017.3

Perceptron

Vogliamo realizzare un semplice perceptron a due ingressi $${ x }_{ 1 },{ x }_{ 2 }$$ ed una sola uscita $$y$$ in grado di svolgere il connettivo logico “OR” utilizzando la funzione di trasferimento Hardlim.

La prima parte della rete calcola il potenziale di attivazione $$a$$ del neurone, corrispondente alla somma di tutti gli ingressi  $${ x }_{ 1 },{ x }_{ 2 }$$ moltiplicati per i corrispettivi pesi sinaptici $${ w }_{ 1 },{ w }_{ 2 }$$ (weights) con l’aggiunta di una soglia di lavoro $$\theta$$ come  ingresso fittizio  chiamato bias $$b$$.

$$\sum _{ i=1 }^{ n }{ { w }_{ i } } { x }_{ i }={ w }_{ 1 }{ x }_{ 1 }+{ w }_{ 2 }{ x }_{ 2 }-\theta >0$$

La seconda parte, invece, serve a calcolare il valore del segnale di uscita $$y$$ della rete neurale sulla base della funzione di trasferimento che abbiamo scelto. Ora dobbiamo riscrivere la formula d’uscita del perceptron:

$$y=T(\sum _{ i=1 }^{ n }{ { w }_{ i } } { x }_{ i }={ w }_{ 1 }{ x }_{ 1 }+{ w }_{ 2 }{ x }_{ 2 }-\theta >0)$$

Hardlim

La funzione di trasferimento $$T$$ HardLim attiva il perceptron solo quando il suo potenziale di attivazione (activation) è maggiore di zero $${ a>0 }$$

$$ y=T\left( a \right) =\begin{cases} 1\quad a\quad \ge \quad 0 \\ 0\quad a\quad <\quad 0 \end{cases}$$

System Generator include il blocco M-Code che può essere utilizzato per scrivere il codice Matlab per la funzione di trasferimento.

L’immagine seguente mostra com’è il blocco dopo che il modello è stato compilato:

– due ingressi (sums, bias)
– una sola uscita (FT).

System generator

Simulink è un ambiente grafico per il Model-Based design che supporta la progettazione , la simulazione, la generazione automatica del codice, il testing e la verifica di sistemi embedded.
System Generator (SysGen) è un toolbox per la modellazione hardware fornito da Xilinx integrato con ISE Design Suite o Vivado HLx che consente di lavorare in ambiente Simulink  attraverso un block-set con più di 80 funzioni.

snippet_or_ann_sysgen

I blocchi di SysGen non convertono automaticamente i numeri a virgola mobile (floating point) di Simulink in virgola fissa (fixed point). Infatti dobbiamo utilizzare i blocchi Gateway In e Gateway Out per convertire da floating point a fixed point e viceversa.

I nomi che associamo ai gateways in input e output corrisponderanno a quelli della entity del codice VHDL generato da SysGen.  Quindi avremo i due inputs $${ x }_{ 1 },{ x }_{ 2 }$$ del neurone e un solo ouput $${y }$$

Addestriamo la rete neurale

In Prontuario filo-logico per un elettronico avevamo già visto come il connettivo OR  risulta falso solo se entrambi i valori sono falsi (0+0=0), vera se almeno uno dei due valori è  vero (1+0=1;0+1=1;1+1=1).
Dalla Command Window  di Matlab dichiariamo i valori della nostra tavola di verità come una matrice in entrata (inputs) e in uscita (target) con i valori  che la rete dovrà apprendere.

Ora dobbiamo inizializzare l’oggetto perceptron indicando che abbiamo come valori minimi e massimi di addestramento i due inputs con un range [0 1]  e che la nostra rete è composta da  un solo neurone.

Ogni ciclo di apprendimento della rete neurale viene detto epoca (epoch) e dobbiamo indicarne un numero sufficiente perché la nostra rete possa apprendere correttamente. Addestriamo il perceptron ad esempio per 10 epoche anche se di solito ne impiega solo 3 essendo una rete molto semplice.

Di default i pesi sinaptici (weights) e bias hanno un valore iniziale di $$0$$, ma dopo l’addestramento vengono aggiornati.

Non ci resta che inserire i valori ottenuti nei corrispettivi constant blocks di SysGen

System Generator Token

Il token System Generator è un blocco speciale della libreria Xilinx Blockset che
contiene le informazioni indispensabili per trasformare il nostro modello in Simulink in VHDL.

Dal modello facciamo doppio click nel token di System Generator e selezioniamo la scheda FPGA (1) a nostra dispozione e il tipo di compilazione (2) desiderata.

Infine selezioniamo la cartella di destinazione (3) di dove verranno generati i files.
Una volta clickato il pulsante Generate vengono aperte le finestre di stato di compilazione che indicano l’avanzamento del flusso per la generazione dei files VHDL.

Perceptron: IP-Core

Un progetto Vivado è organizzato in blocchi IP (Intellectual Property) di cui quello inserito per primo è il Top Module.

Con SysGen possiamo realizzare un modulo IP-Core del perceptron che possiamo ritrovare nel catalogo IP-Core di Vivado.

I tools per la descrizione hardware di Xilinx utilizzano due tipi di files diversi per la location dei IO pins: UCF (user contraits files) e XDC (xilinx design contraints). Usati rispettivamente da ISE e Vivado.
Ora da  Resource Center scarichiamo dalla sezione Design Resources il design contraints per il Nexys4, associando ad esempio il led ($$U3$$) all’uscita del perceptron ($$y$$).
Possiamo impostare il file XDC in due modi:

Creando il file .xdc manualmente

Oppure utilizzando la GUI di Vivado

Dobbiamo ricordarci di selezionare I/O Standard LVCMOS33 è un standard CMOS a bassa tensione che usa la tensione di alimentazione di 3.3V.

 

Bibliografia

[1] Donald O. Hebb, L’organizzazione del comportamento: una teoria neuropsicologica, Franco Angeli, 1975
[2] David Rumelhart,James McClennand, Parallel Distributed Processing, 1986
[3] Silvio Cammarata, Reti neuronali, dal perceptron alle reti caotiche e neuro-fuzzy,1997
[4] James A. Anderson, Edward Rosenfeld, Talking Nets, An oral History of Neural Networks, Mit, 2000

Nexys
[1] Nexys 4, Digilent
[2] Nexys 4 Reference Manual, Digilent

Vivado
[1] Vivado Design Suite:Model-Based DSP Design Using System Generator, Xilinx,UG948, 2016
[2] Sanjay Churiwala, Designing with Xilinx FPGAs: Using Vivado, Springer, Springer, 2016

JEDEC Standard
[1] Interface Standard for Nominal 3 V/3.3 V Supply Digital Integrated Circuits, JESD8C.01, 2007

Model-based design
[1] Ali Behboodian, Model-based design: a Methodology that adresses today’s growing challenges of designing embedded systems, DSP Magazine,2006