Files
FPGA-Neural-Datasheet/files/docs/datasheet/chapters/10-hardware.tex
T
micheleandClaude Sonnet 5 0e73eb4726 docs: bring datasheet/ into the main repo under hardware/v2/docs
Was a separate, untracked directory (DataSheet/) outside the repo.
Renamed to lowercase and moved in as hardware/v2/docs/datasheet/, with
its own .gitignore for LaTeX build byproducts (compiled PDFs stay
tracked, .aux/.log/.toc/etc do not). Now versioned and shares this
repo's own remote instead of living untracked on disk.

Content: IT+EN LaTeX chapter sources, reference manufacturer PDFs, and
compiled datasheet PDFs including the 2026-09-07 SDRAM upgrade
addendum (AS4C32M16SB-7BIN part/pinout/timing) in the v2-en chapters.

Note: hardware/v2/docs/DatasheetLatex/ (and the v1 sibling) is a
separate, already-tracked, differently-structured LaTeX document that
predates this move -- left untouched, not merged, since its chapter
set and content differ and merging was not requested.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xXuuRUWZScuo1DeYJxs3v
2026-09-07 05:09:14 +02:00

326 lines
18 KiB
TeX

\chapter[Progetto hardware e pinout]{Progetto hardware e mappa dei segnali}
\label{ch:hw}
\begin{fnnote}[Stato del pinout --- assegnato e verificato]
Esiste ora un \code{.lpf} reale (\code{synth/ecp5/spi\_neuron\_top.lpf}) con i \textbf{57
segnali} del top-level assegnati a ball CABGA381 concrete, \textbf{verificato
da un place\&route \code{nextpnr-ecp5} completo a 0 errori} (non più
\code{-{}-lpf-allow-unconstrained}). Le ball derivano dal database di dispositivo di
Project~Trellis (\code{iodb.json}, lo stesso che usa nextpnr) e sono state validate in modo
indipendente contro la §4.3.2 del datasheet Lattice ufficiale (conteggi GPIO per banco:
coincidenza esatta su 6 banchi su 7, scostamento di 1 ball sul banco 3, irrilevante perché
nessun segnale assegnato lo usa). \code{TRELLIS\_IO}: 57/245 (23\%). Fmax del build
corrente (sistema completo incl. sottosistema flash con bus SPI indipendente, Fase F7,
2026-09-04) \textbf{67.91~MHz}, percorso critico confermato ancora sulla catena di accumulo
di \code{neuron\_parallel}, invariato rispetto alle build precedenti (cap.~\ref{ch:impl}).
Sunto pin-per-pin a inizio documento (pagg.~2--3). Le ball di config-SPI di boot e JTAG non
compaiono qui perché sono pin dedicati a funzione fissa, senza porta RTL corrispondente:
nextpnr non le richiede mai (0 errori), contano solo per lo schematic PCB.
\end{fnnote}
\section{Dispositivo target}
\begin{tabularx}{\textwidth}{L{4.2cm}Y}
\toprule
\rowh \thd{Parametro} & \thd{Valore} \\
\midrule
Dispositivo & Lattice ECP5 \code{LFE5U-45F-8BG381C} \\
\rowa Package & CABGA381 (381 ball) \\
Speed grade & $-8$ (il più veloce della famiglia ECP5) \\
\rowa Risorse & $\approx$44k LUT/FF, 72$\times$\code{MULT18X18D}, block RAM \code{DP16KD} \\
I/O utilizzabili & $\approx$232 ball su 381 (resto: alimentazione/massa/NC) \\
\bottomrule
\end{tabularx}
\section{Budget dei pin}
Il progetto richiede circa 60 segnali su $\approx$232 I/O utilizzabili: ampio margine
($>$170 pin liberi), quindi la scheda non è pin-constrained.
\begin{tabularx}{\textwidth}{Y C{2.2cm}}
\toprule
\rowh \thd{Funzione} & \thd{Pin} \\
\midrule
PSRAM (indirizzi 22, dati 16, controllo 6) & fino a 44 \\
\rowa SPI applicativo (\code{sclk/mosi/miso/cs\_n}) & 4 \\
Clock, reset & 2 \\
\rowa Pin attenzione host (\code{irq\_n}, \code{data\_ready\_n}) & 2 \\
Bus SPI flash runtime (\code{flash\_sclk/flash\_mosi/flash\_miso/flash\_cs\_n}, GPIO ordinario, bus indipendente --- Fase F7) & 4 \\
\rowa JTAG (bring-up / debug, consigliato) & 4 \\
\midrule
\rowh \thd{Totale} & \thd{$\approx$60} \\
\bottomrule
\end{tabularx}
\section{Mappa dei segnali (top-level \texttt{spi\_neuron\_top}) --- ball reali}
Assegnazione reale dei 57 segnali del top-level, verificata da place\&route, \textbf{ball
individuale per ogni bit} (mai un intervallo di bus). Standard I/O: LVCMOS33
(alimentazione I/O a 3.3~V). Le ball provengono dal \code{.lpf} reale
place\&route-verified. Sunto compatto della stessa tabella anche a inizio documento
(pagg.~2--3).
\renewcommand{\arraystretch}{1.1}
\begin{tabularx}{\textwidth}{L{3.0cm} C{1.0cm} C{1.9cm} C{1.0cm} Y}
\toprule
\rowh \thd{Segnale} & \thd{Dir} & \thd{Ball} & \thd{Banco} & \thd{Funzione} \\
\midrule
\multicolumn{5}{l}{\textit{\color{fnDark}Clock e reset (banco 7, lato sinistro)}}\\
\code{clk} & IN & H5 & 7 & Clock di sistema su pad \code{GR\_PCLK7\_0} (clock globale dedicato). \\
\rowa \code{rst} & IN & B4 & 7 & Reset globale sincrono, attivo alto. \\
\multicolumn{5}{l}{\textit{\color{fnDark}SPI applicativo (banco 7, opposto al bus PSRAM)}}\\
\code{sclk} & IN & B5 & 7 & SPI clock (CPOL=0, CPHA=0). \\
\rowa \code{mosi} & IN & C5 & 7 & Master-Out Slave-In. \\
\code{miso} & OUT & A3 & 7 & Master-In Slave-Out (pilotato sul fronte di discesa). \\
\rowa \code{cs\_n} & IN & B3 & 7 & Chip-select attivo basso. \\
\multicolumn{5}{l}{\textit{\color{fnDark}Pin di attenzione host (banco 7, attivi bassi, di livello)}}\\
\code{data\_ready\_n} & OUT & C3 & 7 & Basso finché un risultato attende lettura (specchio di \code{STATUS.done}, clear su lettura STATUS). \\
\rowa \code{irq\_n} & OUT & C4 & 7 & Basso se il guard load-time del grafo è scattato (specchio di \code{STATUS.err}); si azzera solo su \code{RESET} o nuovo \code{run\_start}, \emph{non} su lettura STATUS. \\
\multicolumn{5}{l}{\textit{\color{fnDark}Flash subsystem --- SPI verso W25Q128JV onboard, bus indipendente (banco 7, Fasi F1-F7)}}\\
\code{flash\_sclk} & OUT & E3 & 7 & SPI clock verso la flash --- GPIO ordinario, nessuna primitiva di config coinvolta (Fase F7). \\
\rowa \code{flash\_mosi} & OUT & D3 & 7 & Master-Out Slave-In verso la flash. \\
\code{flash\_miso} & IN & D5 & 7 & Master-In Slave-Out dalla flash. \\
\rowa \code{flash\_cs\_n} & OUT & E4 & 7 & Chip-select flash, attivo basso. \\
\multicolumn{5}{l}{\textit{\color{fnDark}Bus PSRAM indirizzi \code{psram\_a[21:0]} --- 22 ball individuali (banco 2)}}\\
\code{psram\_a[0]} & OUT & E16 & 2 & PSRAM A0 \\
\rowa \code{psram\_a[1]} & OUT & F16 & 2 & PSRAM A1 \\
\code{psram\_a[2]} & OUT & D18 & 2 & PSRAM A2 \\
\rowa \code{psram\_a[3]} & OUT & E17 & 2 & PSRAM A3 \\
\code{psram\_a[4]} & OUT & E18 & 2 & PSRAM A4 \\
\rowa \code{psram\_a[5]} & OUT & F18 & 2 & PSRAM A5 \\
\code{psram\_a[6]} & OUT & F17 & 2 & PSRAM A6 \\
\rowa \code{psram\_a[7]} & OUT & G16 & 2 & PSRAM A7 \\
\code{psram\_a[8]} & OUT & G18 & 2 & PSRAM A8 \\
\rowa \code{psram\_a[9]} & OUT & H16 & 2 & PSRAM A9 \\
\code{psram\_a[10]} & OUT & H17 & 2 & PSRAM A10 \\
\rowa \code{psram\_a[11]} & OUT & H18 & 2 & PSRAM A11 \\
\code{psram\_a[12]} & OUT & J16 & 2 & PSRAM A12 \\
\rowa \code{psram\_a[13]} & OUT & J17 & 2 & PSRAM A13 \\
\code{psram\_a[14]} & OUT & C20 & 2 & PSRAM A14 \\
\rowa \code{psram\_a[15]} & OUT & D19 & 2 & PSRAM A15 \\
\code{psram\_a[16]} & OUT & E19 & 2 & PSRAM A16 \\
\rowa \code{psram\_a[17]} & OUT & E20 & 2 & PSRAM A17 \\
\code{psram\_a[18]} & OUT & F19 & 2 & PSRAM A18 \\
\rowa \code{psram\_a[19]} & OUT & F20 & 2 & PSRAM A19 \\
\code{psram\_a[20]} & OUT & G20 & 2 & PSRAM A20 \\
\rowa \code{psram\_a[21]} & OUT & H20 & 2 & PSRAM A21 \\
\code{psram\_a[22]} & OUT & P18 & 3 & Sempre 0 (shift byte$\to$word): NC sulla scheda. \\
\multicolumn{5}{l}{\textit{\color{fnDark}Bus PSRAM dati \code{psram\_dq[15:0]} --- 16 ball individuali (banchi 2 e 3)}}\\
\rowa \code{psram\_dq[0]} & IO & K18 & 2 & PSRAM DQ0 \\
\code{psram\_dq[1]} & IO & C18 & 2 & PSRAM DQ1 (dual-function, usata come GPIO ordinario). \\
\rowa \code{psram\_dq[2]} & IO & D17 & 2 & PSRAM DQ2 \\
\code{psram\_dq[3]} & IO & D20 & 2 & PSRAM DQ3 \\
\rowa \code{psram\_dq[4]} & IO & G19 & 2 & PSRAM DQ4 \\
\code{psram\_dq[5]} & IO & J18 & 2 & PSRAM DQ5 \\
\rowa \code{psram\_dq[6]} & IO & J19 & 2 & PSRAM DQ6 \\
\code{psram\_dq[7]} & IO & J20 & 2 & PSRAM DQ7 \\
\rowa \code{psram\_dq[8]} & IO & K19 & 2 & PSRAM DQ8 \\
\code{psram\_dq[9]} & IO & K20 & 2 & PSRAM DQ9 \\
\rowa \code{psram\_dq[10]} & IO & L17 & 3 & PSRAM DQ10 \\
\code{psram\_dq[11]} & IO & M18 & 3 & PSRAM DQ11 \\
\rowa \code{psram\_dq[12]} & IO & M17 & 3 & PSRAM DQ12 \\
\code{psram\_dq[13]} & IO & N16 & 3 & PSRAM DQ13 \\
\rowa \code{psram\_dq[14]} & IO & N18 & 3 & PSRAM DQ14 \\
\code{psram\_dq[15]} & IO & P17 & 3 & PSRAM DQ15 (bus dati bidirezionale tri-state, \code{dq\_oe} = direzione). \\
\multicolumn{5}{l}{\textit{\color{fnDark}Controllo PSRAM (banco 3)}}\\
\rowa \code{psram\_ce\_n} & OUT & N17 & 3 & Chip enable, attivo basso. \\
\code{psram\_oe\_n} & OUT & R16 & 3 & Output enable (lettura). \\
\rowa \code{psram\_we\_n} & OUT & R17 & 3 & Write enable (scrittura). \\
\code{psram\_lb\_n} & OUT & T16 & 3 & Lower-byte enable (DQ[7:0]). \\
\rowa \code{psram\_ub\_n} & OUT & N19 & 3 & Upper-byte enable (DQ[15:8]). \\
\code{psram\_zz\_n} & OUT & N20 & 3 & Sleep/snooze (inattivo=alto in funzionamento). \\
\bottomrule
\end{tabularx}
\renewcommand{\arraystretch}{1.25}
\begin{fnnote}[Segnali di scheda non esposti come porte RTL]
Non sono porte di \code{spi\_neuron\_top} ma vanno previsti a livello di scheda: le linee
di \textbf{SPI di configurazione} verso la flash NOR onboard (\code{PROGRAMN}/\code{INITN}/
\code{DONE}/\code{CCLK}\ldots, i ``Miscellaneous Dedicated Pins'' del datasheet) e le 4
linee \textbf{JTAG} (\code{TCK}/\code{TMS}/\code{TDI}/\code{TDO}), l'\textbf{oscillatore}
sul pad \code{PCLK}, le \textbf{alimentazioni}. I loro numeri di ball non sono nel datasheet
Lattice (file separato) ma non servono qui: sono pin dedicati senza porta RTL, nextpnr non
li richiede mai (0 errori), contano solo per lo schematic PCB.
\end{fnnote}
\begin{fnwarn}[SPI applicativo separato dallo SPI di configurazione]
L'SPI applicativo (\code{sclk/mosi/miso/cs\_n}) deve cadere su I/O ordinarie,
\textbf{mai} sui pin dell'SPI di configurazione: il pin di clock della config-SPI non è
riutilizzabile come ingresso generico dopo la configurazione senza workaround a livello
di scheda. Tenerli fisicamente separati evita quel problema.
\end{fnwarn}
\section{Allocazione per banchi (geometria reale del die)}
La collocazione segue la geometria dei bordi del die (da \code{globals.json} di Trellis,
ball~$\to$~(col,row)~$\to$~banco): i banchi \textbf{2 e 3} sono contigui lungo il bordo
\textbf{destro} del chip e ospitano insieme l'intero bus PSRAM (44+1 segnali) --- esattamente
gli ``uno o due banchi adiacenti'' raccomandati. Il banco \textbf{7} (bordo \textbf{sinistro},
fisicamente opposto al bus PSRAM) ospita SPI applicativo e clock/reset, deliberatamente sul
lato opposto per non far incrociare i due bus. \code{clk} è sul pad dedicato \code{H5}
(\code{GR\_PCLK7\_0}). Dove un banco esauriva le ball ``plain'' (parte di \code{psram\_dq}),
è stata usata la ball dual-function successiva come GPIO ordinario, confermata utilizzabile
dal place\&route reale.
\begin{tabularx}{\textwidth}{Y C{1.6cm} L{4.4cm}}
\toprule
\rowh \thd{Gruppo di segnali} & \thd{N. pin} & \thd{Banco (reale)} \\
\midrule
Indirizzi PSRAM \code{psram\_a[21:0]} & 22 & banco 2 (bordo destro) \\
\rowa Dati PSRAM \code{psram\_dq[15:0]} & 16 & banchi 2 + 3 (adiacenti) \\
Controllo PSRAM (ce/oe/we/lb/ub/zz) & 6 & banco 3 \\
\rowa SPI applicativo & 4 & banco 7 (bordo sinistro) \\
Pin attenzione host (\code{irq\_n}, \code{data\_ready\_n}) & 2 & banco 7 \\
\rowa Bus SPI flash indipendente (\code{flash\_sclk/flash\_mosi/flash\_miso/flash\_cs\_n}) & 4 & banco 7 \\
Clock / reset & 2 & banco 7, \code{clk} su \code{GR\_PCLK7\_0} \\
\rowa Config SPI boot / JTAG & --- & pin dedicati (fuori RTL, solo PCB) \\
\bottomrule
\end{tabularx}
\section{Sottosistema PSRAM}
Il controller \code{psram\_controller.v} implementa un'interfaccia \textbf{parallela
asincrona} (bus indirizzi, dati 16-bit, \code{ce\_n/oe\_n/we\_n} e byte-lane
\code{lb\_n/ub\_n}, più \code{zz\_n}) con latenza di accesso \textbf{70~ns} cablata come
$\lceil 70\,\text{ns}\times f_{clk}\rceil$. È un bus in stile SRAM asincrona, non QSPI.
\begin{tabularx}{\textwidth}{L{3.0cm}Y}
\toprule
\rowh \thd{Ruolo} & \thd{Componente} \\
\midrule
Memoria di lavoro & ISSI \code{IS66WVE4M16EBLL-70BLI} --- PSRAM parallela 64\,Mbit (4M$\times$16, 8~MB), async, 70~ns, corrispondente esatto alla temporizzazione del controller. \\
\rowa Fallback & ISSI \code{IS61WV6416DBLL} / \code{IS61WV102416BLL} (SRAM async vera, drop-in sugli stessi segnali, \code{zz\_n} inattivo, $\sim$10~ns, densità minore). \\
Storage persistente & Winbond \code{W25Q128JV} --- flash NOR SPI 16~MB per bitstream, pesi, bias, metadati di rete. \\
\bottomrule
\end{tabularx}
\subsection{Collegamento PSRAM (esclusivo della FPGA)}
La PSRAM è pilotata \textbf{esclusivamente dalla FPGA} tramite \code{psram\_controller.v}:
nessun master esterno accede al bus. L'host esterno (RPi/ESP32/MCU) parla solo SPI con la
FPGA e non tocca mai queste linee. Collegamento pin-per-pin FPGA~$\leftrightarrow$~ISSI
\code{IS66WVE4M16EBLL-70BLI}:
\begin{tabularx}{\textwidth}{L{3.6cm} L{3.0cm} Y}
\toprule
\rowh \thd{Segnale FPGA} & \thd{Pin PSRAM} & \thd{Funzione} \\
\midrule
\code{psram\_a[21:0]} & A0--A21 & Bus indirizzi (22 linee, 8~MB word address). \\
\rowa \code{psram\_dq[15:0]} & DQ0--DQ15 & Bus dati bidirezionale (tri-state, \code{dq\_oe}=direzione). \\
\code{psram\_ce\_n} & CE\# & Chip enable (attivo basso). \\
\rowa \code{psram\_oe\_n} & OE\# & Output enable (lettura). \\
\code{psram\_we\_n} & WE\# & Write enable (scrittura). \\
\rowa \code{psram\_lb\_n} & LB\# & Lower-byte enable (DQ[7:0]). \\
\code{psram\_ub\_n} & UB\# & Upper-byte enable (DQ[15:8]). \\
\rowa \code{psram\_zz\_n} & ZZ\# & Sleep/snooze (tenuto alto in funzionamento). \\
\bottomrule
\end{tabularx}
Alimentazione PSRAM: \textbf{3.3~V} (variante BLL), sullo stesso rail I/O dei banchi 2/3
a cui è cablata (cap.~\ref{ch:hw}, ball reali). Disaccoppiamento per pin di alimentazione
secondo il datasheet ISSI.
\section{Clock}
\label{sec:clock}
Non esiste ancora alcun PLL nell'RTL: \code{CLK\_FREQ\_MHZ} è un \emph{parametro di
temporizzazione} (alimenta le formule di accesso PSRAM), non un generatore di clock.
L'oscillatore montato pilota \code{clk} direttamente. Raccomandazione: oscillatore MEMS
16~MHz (famiglia SiTime SiT2001B), ben al di sotto dei 67.91~MHz di Fmax del sistema
integrato completo (incl. sottosistema flash, cap.~\ref{ch:impl}). \code{CLK\_FREQ\_MHZ} deve essere impostato al valore reale
dell'oscillatore montato, altrimenti la temporizzazione PSRAM risulta errata.
\section{Alimentazione}
Albero a \textbf{tre rail} (la sezione SERDES dell'eval board Lattice non serve e va
omessa: niente \code{VCCA}/\code{VCCHTX} a 1.2~V):
\begin{tabularx}{\textwidth}{L{3.4cm} C{2.0cm} Y}
\toprule
\rowh \thd{Rail} & \thd{Tensione} & \thd{Alimenta / regolatore} \\
\midrule
\code{VCC} (core) & 1.1~V & Core logico FPGA. Buck \code{TLV62568}, $\geq$600~mA. \\
\rowa \code{VCCIO0/2/3/6/7} & 3.3~V & I/O di tutti i banchi usati + PSRAM. Buck \code{TLV62568}, 1~A. \\
\code{VCCAUX} & 2.5~V & Ausiliario FPGA. LDO \code{TLV73325}, 10~mA. \\
\bottomrule
\end{tabularx}
Disaccoppiamento: almeno un condensatore per pin di alimentazione + bulk per rail, secondo
la checklist hardware ECP5 Lattice. Ingresso: 12~V esterno (o adatta i buck alla sorgente).
\section{Configurazione e programmazione}
\label{sec:config}
La ``scrittura della mappa'' dell'FPGA (bitstream) avviene tramite pin dedicati del
silicio, \textbf{non} porte del top-level RTL. Modo di default: \textbf{MSPI} --- boot
automatico dalla flash NOR all'accensione (prodotto standalone); JTAG disponibile per lo
sviluppo.
\subsection{JTAG (sviluppo / debug)}
\begin{tabularx}{\textwidth}{L{3.0cm} C{2.2cm} Y}
\toprule
\rowh \thd{Segnale} & \thd{Ball\textsuperscript{$\dagger$}} & \thd{Funzione} \\
\midrule
\code{TCK} & T5 & Test clock. \\
\rowa \code{TDI} & R5 & Test data in. \\
\code{TDO} & V4 & Test data out. \\
\rowa \code{TMS} & U5 & Test mode select. \\
\bottomrule
\end{tabularx}
\subsection{Config-SPI verso boot flash}
La FPGA carica il bitstream dalla \textbf{Winbond \code{W25Q128JV}} (128~Mbit SPI NOR,
Quad read) all'accensione. Il sottosistema flash (\code{rtl/flash\_slot\_manager.v}, Fasi
F1-F7, cap.~\ref{ch:impl}) usa la \textbf{stessa flash fisica} per pesi/bias/metadati di
rete a runtime, accesso esclusivo della FPGA: dopo la configurazione, la FPGA riprende il
controllo del chip via un bus SPI a 4 fili completamente indipendente,
\code{flash\_sclk/flash\_mosi/flash\_miso/flash\_cs\_n} (tutti GPIO ordinario, pagg.~2--3 e
§``Mappa dei segnali'' --- nessuna primitiva di configurazione ECP5 coinvolta, Fase F7) ---
implica comunque un doppio collegamento a livello di scheda (DI/DO/CS/CLK della flash
cablati sia ai pin dedicati di boot sotto sia a queste 4 ball ordinarie, poiché è lo stesso
chip fisico a svolgere entrambi i ruoli), non ancora riportato in uno schematico (nessuno
esiste ancora, vedi checklist sotto).
\begin{tabularx}{\textwidth}{L{3.4cm} C{2.2cm} Y}
\toprule
\rowh \thd{Segnale} & \thd{Ball\textsuperscript{$\dagger$}} & \thd{Funzione} \\
\midrule
\code{CCLK/MCLK/SCK} & U3 & Clock di configurazione. \\
\rowa \code{DQ0\_MOSI} & W2 & Dato config (MOSI). \\
\code{DQ1\_MISO} & V2 & Dato config (MISO). \\
\rowa \code{BUSY\_CSSPIN} & R2 & Chip-select flash. \\
\code{DQ2 / DQ3} & Y2 / W1 & Linee per Quad read. \\
\rowa \code{PROGRAMN} & W3 & Avvia riconfigurazione (pulsante, attivo basso). \\
\code{INITN} & V3 & Init / errore di configurazione (LED). \\
\rowa \code{DONE} & Y3 & Configurazione completata (LED). \\
\code{CFGMDN[2:0]} & R4/T4/U4 & Selezione modo (vedi sotto). \\
\bottomrule
\end{tabularx}
\subsection{Modi di configurazione (\texttt{CFGMDN})}
\begin{tabularx}{\textwidth}{L{4.0cm} C{4.0cm} Y}
\toprule
\rowh \thd{Modo} & \thd{CFGMDN[2:0]} & \thd{Uso} \\
\midrule
MSPI (boot da flash) & \code{010} & \textbf{Default} --- standalone. \\
\rowa SSPI (slave SPI) & \code{001} & Config da host esterno. \\
SCM (slave serial) & \code{101} & Config seriale. \\
\rowa SPCM (slave parallel) & \code{111} & Config parallela 8-bit. \\
\bottomrule
\end{tabularx}
\begin{fnwarn}[Ball di configurazione da verificare sul 45F]
\textsuperscript{$\dagger$}Le ball di JTAG e config-SPI qui riportate sono il
\emph{riferimento} dell'eval board Lattice (device 85F). JTAG e config-SPI sono pin
dedicati e in gran parte fissi nella famiglia ECP5, ma le posizioni esatte sul target
\code{LFE5U-45F-8BG381C} vanno confermate sul file pinout Lattice del 45F (Diamond/Radiant
o database Trellis) prima di committarle nello schematico, come già fatto per i segnali
applicativi (cap.~\ref{ch:hw}).
\end{fnwarn}
\section{Attività aperte prima della cattura schematica}
\begin{itemize}
\item[\OK] \code{ADDR\_WIDTH}=23 (8~MB pieni) su tutti i moduli e testbench.
\item[\OK] \code{.lpf} reale con l'assegnazione ball CABGA381, place\&route-verified a
0 errori (\code{synth/ecp5/spi\_neuron\_top.lpf}, 57 segnali incl. sottosistema flash).
\item[\OK] Sottosistema flash boot/persistenza (Fasi F1-F7): SPI master, copy engine,
catalogo a slot con CRC32, bus SPI a 4 fili indipendente (nessuna primitiva di
configurazione condivisa), sintesi reale a 0 errori, Fmax 67.91~MHz (\code{WORKLOG.md}).
\item[$\square$] Confermare signal integrity PSRAM/SPI al clock effettivamente montato.
\item[$\square$] Schema di doppio collegamento DI/DO/CS/CLK della flash (pin dedicati di
boot + le 4 ball ordinarie del sottosistema flash) --- non ancora catturato a
schematico.
\item[$\square$] Scelta del footprint del connettore JTAG.
\item[$\square$] Cattura schematica (KiCad o altro): nessuno schema esiste ancora per
questa combinazione dispositivo/package.
\end{itemize}