\chapter{Panoramica del sistema} \label{ch:overview} \section{Obiettivo del progetto} FPGA-Neural implementa un \textbf{Neural Network Engine riusabile in hardware FPGA}. L'insieme è composto da tre elementi: l'FPGA, che è il vero acceleratore; una RAM dedicata fisicamente associata all'FPGA e non condivisa con l'host; e un'interfaccia host indipendente dal sistema operativo, inizialmente SPI (con possibile estensione futura a Dual~SPI). Il principio fondante è la separazione fra chi \emph{esegue} il calcolo e chi lo \emph{usa}: il calcolo della rete neurale avviene interamente dentro l'FPGA, mentre il sistema host fornisce solo configurazione, parametri di rete, dati di ingresso, controllo e lettura dei risultati. L'host non fa parte del datapath computazionale. Sistemi host possibili includono SoC Linux, sistemi tipo Raspberry~Pi, ESP32, microcontrollori e PC di sviluppo: la stessa architettura di engine deve poter essere usata in sistemi completamente diversi. \begin{center} \begin{tikzpicture}[font=\footnotesize,node distance=8mm] \node[fnblockD,minimum width=42mm,minimum height=20mm] (host){\textbf{HOST}\\[2pt] {\scriptsize Configurazione}\\{\scriptsize Addestramento}\\{\scriptsize Controllo}}; \node[fnblockT,below=14mm of host,minimum width=42mm,minimum height=20mm] (fpga) {\textbf{FPGA}\\[2pt]{\scriptsize Neural Network Engine}\\{\scriptsize Compute / Control}}; \node[fnblock,below=14mm of fpga,minimum width=42mm,minimum height=13mm] (ram) {\textbf{RAM dedicata}\\{\scriptsize pesi / bias / buffer}}; \draw[fnbus] (host) -- node[fnlbl,right]{SPI / Dual SPI} (fpga); \draw[fnbus] (fpga) -- node[fnlbl,right]{bus parallelo} (ram); \end{tikzpicture} \end{center} \section{Configurazione hardware contro configurazione di rete} Il progetto distingue con precisione fra l'\textbf{architettura hardware} dell'acceleratore e i \textbf{parametri della rete neurale}. L'architettura fisica dell'engine è definita al momento della sintesi e dell'implementazione dell'FPGA. I parametri hardware tipici sono \code{N\_INPUTS}, \code{N\_NEURONS}, \code{N\_LAYERS}, \code{PARALLEL}, \code{DATA\_WIDTH}, \code{ACC\_WIDTH}: sono parametri Verilog risolti in fase di sintesi e determinano il datapath contenuto nel bitstream. I parametri della rete --- pesi, bias, parametri di attivazione e di quantizzazione, costanti specifiche --- vengono invece caricati a runtime attraverso l'interfaccia host e memorizzati nella RAM associata all'FPGA. \begin{fnnote}[Principio architetturale centrale] Una build fissa il \emph{soffitto} della macchina (numero massimo di layer, larghezza massima, \code{PARALLEL}); l'host configura la rete \emph{reale} --- numero di layer, larghezza ingressi/uscite per-layer, attivazione per-layer e parametri addestrati --- interamente a runtime, via SPI, nella memoria locale dell'FPGA. Un solo bitstream serve qualunque topologia fino a quel soffitto. \end{fnnote} \section{Boot e inizializzazione} L'FPGA viene configurato all'accensione tramite il consueto meccanismo di configurazione (caricamento del bitstream da flash SPI). Il bitstream definisce l'architettura hardware dell'engine; l'host non costruisce dinamicamente il datapath durante il funzionamento normale, ma configura i dati di rete su cui il datapath già esistente opera. \begin{center} \begin{tikzpicture}[font=\scriptsize,node distance=4.5mm,start chain=going below, every node/.style={on chain}] \node[fnblockA,minimum width=60mm](p){Power-on}; \node[fnblock,minimum width=60mm]{Configurazione FPGA (bitstream da flash)}; \node[fnblockT,minimum width=60mm]{Neural Network Engine disponibile}; \node[fnblock,minimum width=60mm]{Inizializzazione host (SPI)}; \node[fnblock,minimum width=60mm]{Caricamento parametri di rete / pesi / bias}; \node[fnblockD,minimum width=60mm]{Engine pronto}; \begin{scope}[every path/.style={fnarrow}] \foreach \a/\b in {1/2,2/3,3/4,4/5,5/6}{} \end{scope} \foreach \i [count=\j from 2] in {1,...,5}{ \draw[fnarrow] (chain-\i) -- (chain-\j);} \end{tikzpicture} \end{center} \section{Addestramento e inferenza} Addestramento e inferenza sono concettualmente separati. La prima implementazione non richiede che l'FPGA esegua l'addestramento: i pesi possono essere calcolati esternamente (PC/Linux/altro host) e trasferiti via SPI nella RAM dell'FPGA, che poi esegue l'inferenza. Questo riduce drasticamente la complessità dell'hardware iniziale, senza precludere una futura implementazione di training assistito o interamente hardware (Fase~8 della roadmap, cap.~\ref{ch:roadmap}). Durante l'inferenza l'host fornisce solo i dati di ingresso e recupera il risultato, ottenendo calcolo deterministico, carico ridotto sull'host, parallelismo hardware, latenza prevedibile e indipendenza dall'architettura della CPU host. \section{Filosofia di progetto e riuso} Il progetto va inteso come una \emph{piattaforma di accelerazione neurale FPGA riusabile} più che come una singola rete. L'applicazione determina dimensione degli ingressi, topologia, numero di layer e neuroni, parallelismo, precisione numerica, funzioni di attivazione, requisiti di memoria e prestazioni; il processo di generazione hardware produce l'implementazione FPGA corrispondente. La stessa architettura HDL rimane concettualmente invariata mentre i parametri di sintesi generano implementazioni appropriate ai diversi target applicativi.