User confirmed TLV62568 (U1) outputs 1.1V, explaining the +1V1 label found near the VCCAUX ferrite (L2) during the schematic review: it belongs to U1's own real output net, merely nearby on the page layout, not routed through the ferrite. VCCAUX remains 2.5V as required by the real Lattice datasheet. All three schematic "open items" from the earlier review are now resolved: TLV62568 EN (R3=499k, confirmed via BOM), the +1V1 label (false alarm, explained above), and the JTAG pull-up array (confirmed 8 discrete 0402 parts via BOM, not a bussed package -- no polarity limitation). Only the boot-flash net-name typo (FGPA/FPGA + SCLK/CLK) remains as a real, open schematic fix, and the FPGA grade discrepancy (8BG381I vs 8BG381C) remains to be confirmed. Compiled clean (47 pages, 0 errors). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013xXuuRUWZScuo1DeYJxs3v
468 lines
24 KiB
TeX
468 lines
24 KiB
TeX
\chapter{Hardware and board}
|
|
\label{ch:hw}
|
|
|
|
\section{Unchanged from V1}
|
|
V2 targets the identical board and component set as V1: Lattice ECP5
|
|
\code{LFE5U-45F-8BG381C} ($-8$, CABGA381), ISSI
|
|
\code{IS66WVE4M16EBLL-70BLI} PSRAM (64\,Mb, 4M$\times$16), same 16\,MHz
|
|
reference oscillator. The real PSRAM controller
|
|
(\code{psram\_controller.v}) and its byte$\leftrightarrow$word adapter
|
|
(\code{memory\_interface.v}) are reused byte-for-byte, unmodified, from
|
|
\code{hardware/v1/} throughout every V2 milestone --- their real,
|
|
already-verified electrical/timing requirements and page-mode behavior
|
|
are unchanged, because the controller itself was never touched.
|
|
|
|
\begin{fnnote}[Real ball assignment: defer to V1's own chapter]
|
|
V1's own hardware chapter documents a real, \code{iodb.json}-verified,
|
|
place\&route-confirmed ball assignment for every PSRAM signal
|
|
(\code{psram\_a}, \code{psram\_dq}, \code{psram\_ce\_n/oe\_n/we\_n/
|
|
lb\_n/ub\_n/zz\_n}). Since V2's own \code{neural\_multiprocessor.v}
|
|
drives these signals through the identical, unmodified controller, that
|
|
same real ball assignment applies unchanged if V2 is deployed on the
|
|
same physical board --- it is not repeated here to avoid maintaining two
|
|
copies of the same real data; see the V1 datasheet directly.
|
|
\end{fnnote}
|
|
|
|
\section{What V2 has not yet placed on real hardware}
|
|
As stated in ch.~\ref{ch:host}, V2's own node-registration bus has no
|
|
physical pin assignment in this revision --- every V2 characterization
|
|
to date used either a Verilator testbench or an unconstrained
|
|
(\code{--lpf-allow-unconstrained}) synthesis top-level. A real deployment
|
|
would need:
|
|
\begin{itemize}
|
|
\item A physical host transport for the registration bus (ch.~\ref{ch:host}).
|
|
\item A real, constrained \code{nextpnr-ecp5} place\&route run
|
|
producing a genuine \code{.lpf}/ball assignment for
|
|
\code{neural\_multiprocessor.v}'s own top-level pins, analogous to
|
|
V1's own \code{tools/pinout/gen\_lpf.py} flow.
|
|
\item Re-verification that the real Fmax numbers in ch.~\ref{ch:impl2}
|
|
(obtained unconstrained) hold once real pin locations are fixed ---
|
|
pin placement can itself affect routing and therefore Fmax.
|
|
\end{itemize}
|
|
|
|
\section{Power supply, oscillator, configuration}
|
|
Unchanged from V1: same board-level power sequencing, same oscillator,
|
|
same JTAG/config-SPI boot path (fixed-function dedicated pins, outside
|
|
RTL scope). No V2-specific hardware change was made or is required
|
|
beyond the (not yet placed) registration-bus transport above.
|
|
|
|
\section{SDRAM upgrade addendum (2026-09-07) --- current, authoritative
|
|
board state}
|
|
\label{sec:sdram-addendum}
|
|
\begin{fnwarn}[This section supersedes the PSRAM description above for
|
|
the current hardware baseline]
|
|
The sections above describe an earlier V2 milestone that still reused
|
|
V1's own PSRAM chain unconstrained. The project has since made a
|
|
closed architectural decision (real \code{decisions.log} DEC-0034) to
|
|
replace external memory with a single SDR SDRAM device, and has since
|
|
upgraded that device's capacity and re-verified real, constrained
|
|
place\&route timing. This section is the current, real, measured state
|
|
--- see \code{hardware/v2/docs/MEMORY\_UPGRADE\_64MB\_N8.md} in the
|
|
repository for the full investigation.
|
|
\end{fnwarn}
|
|
|
|
\subsection{Memory device}
|
|
\textbf{Alliance Memory AS4C32M16SB-7BIN} --- 512\,Mbit (64\,MByte) SDR
|
|
SDRAM, organized 4 banks $\times$ 8M words $\times$ 16 bits, 54-ball
|
|
FBGA package (8$\times$8$\times$1.2\,mm max), $-40$ to $85^{\circ}$C
|
|
industrial, $-7$ speed grade (143\,MHz max). VDD/VDDQ 3.3\,V $\pm$0.3\,V.
|
|
Single-ended \code{CLK} --- \textbf{no \code{CLK\_N}}, this is SDR, not
|
|
DDR, SDRAM. Real distributor availability confirmed: DigiKey product
|
|
11613071, 568 units in stock, \$31.12/unit (qty 1), 16-week
|
|
manufacturer lead time.
|
|
|
|
\subsection{Complete AS4C32M16SB-7BIN ball assignment}
|
|
From the manufacturer's own \code{-7BIN}-specific datasheet (Alliance
|
|
Memory, Rev.\,1.4, June 2024, Figure~1.1 --- the real TFBGA ball
|
|
diagram, not inferred from the TSOP-II \code{-7TIN} pinout).
|
|
|
|
\begin{fnnote}[Address / Bank]
|
|
A0=H7, A1=H8, A2=J8, A3=J7, A4=J3, A5=J2, A6=H3, A7=H2, A8=H1, A9=G3,
|
|
A10/AP=H9, A11=G2, A12=G1, BA0=G7, BA1=G8.
|
|
\end{fnnote}
|
|
\begin{fnnote}[Data / Masks]
|
|
DQ0=A8, DQ1=B9, DQ2=B8, DQ3=C9, DQ4=C8, DQ5=D9, DQ6=D8, DQ7=E9, DQ8=E1,
|
|
DQ9=D2, DQ10=D1, DQ11=C2, DQ12=C1, DQ13=B2, DQ14=B1, DQ15=A2, LDQM=E8,
|
|
UDQM=F1.
|
|
\end{fnnote}
|
|
\begin{fnnote}[Control / Power]
|
|
CLK=F2, CKE=F3, CS\#=G9, RAS\#=F8, CAS\#=F7, WE\#=F9. VDD=\{A9,E7,J9\},
|
|
VSS=\{A1,E3,J1\}, VDDQ=\{A7,B3,C7,D3\}, VSSQ=\{A3,B7,C3,D7\}, NC=E2.
|
|
\end{fnnote}
|
|
|
|
\subsection{FPGA $\leftrightarrow$ SDRAM mapping (real, LPF-verified)}
|
|
From \code{hardware/v2/constraints/v2\_board\_top.lpf} (45/45 unique
|
|
FPGA balls, no duplicates, LFE5U-45F-8BG381 rev.\,3.0 CSV-verified).
|
|
|
|
\begin{fnnote}[FPGA ball $\to$ SDRAM ball, by signal group]
|
|
\code{sdram\_a[0..12]}: D5,D3,F4,E5,E3,F5,A2,B1,C2,C1,D2,D1,F1 $\to$
|
|
A0..A12 (H7,H8,J8,J7,J3,J2,H3,H2,H1,G3,H9,G2,G1). \code{sdram\_ba[0:1]}:
|
|
E4,C3 $\to$ BA0,BA1 (G7,G8). \code{sdram\_dq[0..15]}:
|
|
E1,G5,H3,J5,K3,K2,H1,J1,K1,K4,L4,L5,M5,M4,N4,N5 $\to$ DQ0..DQ15.
|
|
\code{sdram\_dqm[0:1]}: P5,N3 $\to$ LDQM,UDQM. Control:
|
|
\code{sdram\_cke/cs\_n/ras\_n/cas\_n/we\_n}: B5,C5,C4,A3,B3 $\to$
|
|
CKE,CS\#,RAS\#,CAS\#,WE\#.
|
|
\end{fnnote}
|
|
|
|
\subsection{Real, measured clock closure (nextpnr-ecp5, 8 seeds/config)}
|
|
\label{sec:clock-closure-current}
|
|
\begin{fnwarn}[Updated 2026-09-07 --- supersedes the ERR-0029-era numbers below]
|
|
Flash \#1 (\S\ref{sec:prog-addendum}, since removed) briefly regressed
|
|
N\_SLOTS=4 from 8/8 to 3/8 while it was integrated; that integration
|
|
was reverted (user priority: clock frequency over on-board flash
|
|
persistence). A further real fix (DEC-0042, replacing a combinational
|
|
fan-out with a synchronous counter, credited to the user's own
|
|
diagnosis) closed N\_SLOTS=4 back to 8/8 on the flash-free design ---
|
|
the numbers below are the CURRENT, real, final state.
|
|
\end{fnwarn}
|
|
\begin{tabularx}{\textwidth}{L{4.0cm} C{1.6cm} C{2.2cm} X}
|
|
\toprule
|
|
\rowh \thd{Configuration} & \thd{Pass} & \thd{Worst / Best Fmax} & \thd{Notes} \\
|
|
\midrule
|
|
N\_SLOTS=4 @ 64\,MHz & \textbf{8/8} & 64.55 / 72.37\,MHz & \textbf{Production baseline, GO} \\
|
|
\rowa N\_SLOTS=8 @ 64\,MHz & 3/8 & --- & Deferred by explicit user request, not pursued further \\
|
|
N\_SLOTS=4/8 @ 80\,MHz & 0/8 & --- & NO-GO, genuine \code{ecppll}-regenerated PLL (re-confirmed pre-revert; not re-tested post-revert, expected unchanged) \\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
Root cause of the last N\_SLOTS=4 failure (seed1, real critical-path
|
|
trace): \code{neural\_director.job\_out\_slot} $\to$
|
|
\code{dependency\_manager.node\_resolved}/\code{node\_state}, a
|
|
producer-completion broadcast crossing physically distant regions of
|
|
the die (75--84\% routing, not a serial logic chain --- already a
|
|
flat, parallel 64-way compare, so the ERR-0027/0028/0029 restructuring
|
|
fix class does not apply here). The real contributor found: this
|
|
chapter's own \code{FPGA\_DATA\_READY} support (\S\ref{sec:host-addendum})
|
|
read \code{node\_state[0:N\_NODES-1]} combinationally every cycle,
|
|
adding real fan-out onto that same congested signal. Fixed by
|
|
replacing the OR-reduce with a synchronous up/down counter (see
|
|
\S\ref{sec:host-addendum} for the exact formula) --- worst seed
|
|
improved 62.47\,MHz $\to$ 64.55\,MHz, closing the last failing seed.
|
|
See \code{decisions.log} DEC-0042 for full detail. A further
|
|
pipelining fix on the same broadcast path is a real, identified,
|
|
not-yet-attempted option if more margin is ever needed.
|
|
|
|
\section{Power supply design (2026-09-07) --- verified against the real
|
|
Lattice hardware checklist}
|
|
\label{sec:power-addendum}
|
|
\begin{fnwarn}[Supersedes the generic \S3 stub above]
|
|
The ``Power supply, oscillator, configuration'' section earlier in
|
|
this chapter only said ``unchanged from V1'' without real design data.
|
|
This section replaces that stub with the actual rail topology, sized
|
|
against the real, primary-source Lattice and TI documents below --- not
|
|
estimated.
|
|
\end{fnwarn}
|
|
|
|
\subsection{Rail topology}
|
|
Three rails, one simplification from the original V1 reference design:
|
|
\textbf{no separate buck regulator for the 3.3\,V I/O rail} --- the
|
|
board's own external input is specified as \textbf{3.3\,V}, so
|
|
\code{VCCIO}, the SDRAM (VDD/VDDQ, 3.3\,V per its own datasheet), and
|
|
the flash (3.3\,V) are fed directly from the board input. A buck
|
|
targeting 3.3\,V output from a 3.3\,V input would run at 100\% duty
|
|
cycle permanently --- zero regulation margin, no benefit over a direct
|
|
connection.
|
|
|
|
\begin{tabularx}{\textwidth}{L{2.6cm} L{2.0cm} L{3.2cm} X}
|
|
\toprule
|
|
\rowh \thd{Rail} & \thd{Value} & \thd{Source} & \thd{Feeds} \\
|
|
\midrule
|
|
I/O & 3.3\,V & Direct board input & FPGA \code{VCCIO0--8}, SDRAM VDD/VDDQ, SPI flash, PMOD \\
|
|
\rowa Core & 1.1\,V & TLV62568 (buck), from the 3.3\,V rail & FPGA \code{VCC} \\
|
|
Auxiliary & 2.5\,V & TLV73325 (LDO), from the 3.3\,V rail & FPGA \code{VCCAUX} \\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
|
|
\subsection{Power-up sequencing --- real Lattice requirement, verified
|
|
compliant}
|
|
Per Lattice's own \emph{ECP5 and ECP5-5G Hardware Checklist}
|
|
(FPGA-TN-02038-2.0, July 2024), \S4: \emph{``\code{VCCIO} supplies
|
|
should be powered up before or together with the \code{VCC} and
|
|
\code{VCCAUX} supplies.''} The same document's \S2 adds: all three
|
|
monitored rails must rise \textbf{monotonically}, and the on-chip
|
|
Power-On-Reset de-asserts only once \code{VCC}$\geq$0.9\,V,
|
|
\code{VCCAUX}$\geq$2.0\,V, and \code{VCCIO8}$\geq$0.95\,V are all
|
|
simultaneously satisfied --- device initialization waits for whichever
|
|
of the three is slowest.
|
|
|
|
This board's topology satisfies the requirement \textbf{by construction},
|
|
with no sequencer IC needed: \code{VCCIO} (3.3\,V) is a direct,
|
|
unregulated connection to the board input, so it rises first/fastest,
|
|
strictly before the two regulated rails (Core, Aux) can even begin
|
|
their own soft-start ramps --- ``before or together with'' is met on
|
|
every possible power-up transient, not just the typical case.
|
|
|
|
\subsection{Decoupling --- real Lattice-recommended values (not a
|
|
generic ``one cap per pin'' guess)}
|
|
Per FPGA-TN-02038-2.0 Table~3.1 (\S3.1), applied per-rail:
|
|
|
|
\begin{tabularx}{\textwidth}{L{2.0cm} L{5.0cm} X}
|
|
\toprule
|
|
\rowh \thd{Rail} & \thd{Filter} & \thd{Notes} \\
|
|
\midrule
|
|
\code{VCC} & 10\,\textmu F $\times$3 (bulk) $+$ 100\,nF per pin & Core, 1.1\,V \\
|
|
\rowa \code{VCCAUX} & 120\,$\Omega$ ferrite bead $+$ 10\,\textmu F $+$
|
|
100\,nF per pin & 2.5\,V; \textbf{new part not in the earlier power
|
|
tree draft} --- a ferrite bead in series was missing before this
|
|
verification pass \\
|
|
\code{VCCIO[0--8]} & 10\,\textmu F $+$ 100\,nF per pin (per bank in
|
|
use) & 1\textmu F acceptable on unused banks; 22\,\textmu F (or a
|
|
second 10\,\textmu F) on banks with heavy output loading \\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
|
|
Capacitor selection, also per the same document: X5R/X7R dielectric
|
|
(avoid Y5V/Z5U), voltage rating $\geq$80\% above the rail's maximum ---
|
|
for the 3.3\,V rail this means a \textbf{6.3\,V minimum} rating, not
|
|
the bare 3.3\,V-rated parts sometimes used to save cost. All ground
|
|
pins tie to the board's ground plane (no star grounding on this
|
|
family).
|
|
|
|
\subsection{Regulator component values (real, computed from datasheet
|
|
constants)}
|
|
\textbf{TLV62568} (core, 1.1\,V): input range 2.5--5.5\,V (3.3\,V
|
|
input has full margin); feedback reference \code{VFB}$=0.6$\,V
|
|
(typical, per TI SLVSD89B). Output set via
|
|
$V_{OUT}=V_{FB}\left(1+\frac{R1}{R2}\right)$: choosing
|
|
\textbf{R1$=$100\,k$\Omega$, R2$=$120\,k$\Omega$} gives
|
|
$0.6\times(1+100/120)=1.1$\,V exactly. Per TI's own typical
|
|
application circuit: C1$=$4.7\,\textmu F on \code{VIN}, L1$=$2.2\,
|
|
\textmu H inductor, C2$=$10\,\textmu F on \code{VOUT}.
|
|
|
|
\textbf{TLV73325} (auxiliary, 2.5\,V fixed-output LDO): input range
|
|
1.4--5.5\,V (per TI SBVS221, real datasheet), dropout 125\,mV at
|
|
300\,mA --- far above this rail's $\sim$10\,mA real load, so dropout is
|
|
not a concern at 3.3\,V input. Capacitor-free architecture (stable
|
|
without external caps at the regulator itself); the 10\,\textmu F$+$
|
|
100\,nF on \code{VCCAUX} above are the FPGA-side filter from
|
|
FPGA-TN-02038, not regulator-stability caps, and are still required.
|
|
|
|
\begin{fnnote}[Open item carried from \S3 above]
|
|
The 16\,MHz reference oscillator's exact manufacturer part number is
|
|
not yet specified in this document (only ``16\,MHz'' as a frequency
|
|
requirement) --- flagged, not invented, pending the schematic capture
|
|
the user is preparing separately.
|
|
\end{fnnote}
|
|
|
|
\subsection{Power tree}
|
|
\begin{center}
|
|
\begin{tikzpicture}[node distance=10mm and 14mm,font=\footnotesize]
|
|
\node[fnblockD,minimum width=30mm,minimum height=11mm] (in){Board input\\3.3\,V};
|
|
\node[fnblock,below left=14mm and -6mm of in,minimum width=32mm,minimum height=13mm] (u3){TLV62568 (buck)\\R1/R2 $\to$ 1.1\,V};
|
|
\node[fnblockT,below right=14mm and -6mm of in,minimum width=32mm,minimum height=13mm] (u5){TLV73325 (LDO)\\fixed 2.5\,V};
|
|
\node[fnblockA,right=30mm of in,minimum width=26mm,minimum height=11mm] (io){\code{VCCIO0--8}\\3.3\,V direct};
|
|
\node[fnreg,below=8mm of io,minimum width=26mm] (sd){SDRAM VDD/VDDQ};
|
|
\node[fnreg,below=6mm of sd,minimum width=26mm] (fl){SPI flash \code{VCC}};
|
|
\node[fnblock,below=18mm of u3,minimum width=30mm,minimum height=11mm] (core){FPGA \code{VCC}\\1.1\,V core};
|
|
\node[fnblockT,below=18mm of u5,minimum width=30mm,minimum height=11mm] (aux){FPGA \code{VCCAUX}\\2.5\,V};
|
|
\draw[fnbus] (in) -- (io);
|
|
\draw[fnarrow] (io) -- (sd);
|
|
\draw[fnarrow] (io) -- (fl);
|
|
\draw[fnbus] (in) -- (u3);
|
|
\draw[fnbus] (in) -- (u5);
|
|
\draw[fnbus] (u3) -- node[fnlbl,right]{10\textmu F$\times$3 + 100nF/pin} (core);
|
|
\draw[fnbus] (u5) -- node[fnlbl,right]{120$\Omega$ FB + 10\textmu F + 100nF/pin} (aux);
|
|
\end{tikzpicture}
|
|
\end{center}
|
|
\begin{center}
|
|
{\scriptsize Power tree, direct 3.3\,V I/O rail (no redundant buck), verified against
|
|
FPGA-TN-02038-2.0 \S3--4. Full schematic capture (BOM, connectors,
|
|
FPGA--RAM/FLASH and PROG sections) pending separately.}
|
|
\end{center}
|
|
|
|
\section{Programming architecture (updated 2026-09-07) --- single
|
|
boot flash, ESP32 over JTAG only}
|
|
\label{sec:prog-addendum}
|
|
\begin{fnwarn}[Real, closed design -- superseded once, now final]
|
|
Originally converged on a two-flash design (\S below described flash
|
|
\#1 for neural-network data and flash \#2 for boot). Flash \#1 was
|
|
fully implemented (real V1 subsystem instantiated, a new byte$\leftrightarrow$word
|
|
adapter, a new SPI opcode, a dedicated testbench, 64/64 bytes verified
|
|
bit-exact) and then \textbf{removed again}, on the user's own explicit
|
|
priority call: it measurably regressed N\_SLOTS=4's own real timing
|
|
closure (8/8 $\to$ 3/8 PASS at 64\,MHz), and clock frequency was
|
|
judged more valuable than on-board persistent weight storage --- the
|
|
ESP32 can push weights fresh each session instead. Reverted cleanly
|
|
via \code{git revert} (commit \code{59901a4}, fully recoverable from
|
|
history if ever needed again). This section now describes the
|
|
current, real, single-flash architecture. See \code{decisions.log}
|
|
DEC-0041 (original two-flash design) and DEC-0042 (removal + the
|
|
timing recovery that followed) for the complete history.
|
|
\end{fnwarn}
|
|
|
|
\subsection{One physical flash chip: boot bitstream only}
|
|
Connects exclusively to the ECP5's own dedicated sysCONFIG pins,
|
|
Master SPI mode, auto-boots every power-up, zero ESP32 involvement in
|
|
normal operation. No second flash device, no on-board neural-network
|
|
weight persistence in the current design --- the host (ESP32) is
|
|
responsible for pushing weight/activation data into SDRAM fresh each
|
|
session via the real SPI application protocol
|
|
(\S\ref{sec:host-addendum}).
|
|
|
|
\subsection{ESP32 $\leftrightarrow$ ECP5: JTAG only}
|
|
Neither ESP32-S3 nor ESP32-C6 has a hardware JTAG \emph{master}
|
|
peripheral (verified against Espressif's own documentation): their
|
|
native ``USB Serial/JTAG Controller'' lets an external host debug the
|
|
ESP32 itself --- the wrong direction for driving the ECP5. TCK/TMS/
|
|
TDI/TDO are therefore bit-banged from ordinary ESP32 GPIO, standard
|
|
practice. ESP32 updates flash~\#2 by commanding the ECP5's own
|
|
internal sysCONFIG engine to bridge JTAG writes through to the
|
|
external flash (real Lattice mechanism, FPGA-TN-02038-2.0 Figure~6.3,
|
|
``Programming external Flash via JTAG'') --- ESP32 never drives
|
|
flash~\#2's own SPI pins directly, zero bus contention by
|
|
construction.
|
|
|
|
\subsection{Real ball assignments (CABGA381)}
|
|
From the official Lattice pinout CSV (\code{FPGA-SC-02034-3-0-
|
|
ECP5U-45-Pinout.csv} rev.\,3.0) cross-checked against Project
|
|
Trellis's \code{iodb.json}.
|
|
|
|
\begin{fnnote}[JTAG (bank 40/TAP) --- to ESP32]
|
|
TCK=T5, TMS=U5, TDI=R5, TDO=V4.
|
|
\end{fnnote}
|
|
\begin{fnnote}[Dedicated config (bank 8) --- to ESP32]
|
|
PROGRAMN=W3, INITN=V3, DONE=Y3.
|
|
\end{fnnote}
|
|
\begin{fnnote}[CFG{[}2:0{]} (bank 8) --- board jumpers/0$\Omega$, NOT to ESP32]
|
|
For MSPI, CFG[2:0]$=$[0,1,0] read MSB-first: CFG\_2(R4)$=$GND,
|
|
CFG\_1(T4)$=$pull-up 1--10\,k$\Omega$ to VCCIO8, CFG\_0(U4)$=$GND.
|
|
\end{fnnote}
|
|
\begin{fnnote}[MSPI dedicated/dual-function pins to flash \#2 (bank 8) --- NOT to ESP32]
|
|
MCLK/CCLK=U3, CSSPIN=R2 (dual w/ HOLDN/DI/BUSY/CEN), D0/MOSI=W2,
|
|
D1/MISO=V2.
|
|
\end{fnnote}
|
|
|
|
Confirmed real and safe (Lattice FPGA-TN-02039-2.3 sysCONFIG User
|
|
Guide, \S6.1.2): once User Mode is reached, the MSPI dedicated pins
|
|
tristate with a weak pull-up, so they never contend with another
|
|
driver on the same net --- not load-bearing for the current
|
|
single-flash architecture (nothing else shares these pins), but
|
|
confirms the mechanism is real should a future revision ever add a
|
|
second flash device sharing this same chip.
|
|
|
|
\section{Real KiCad schematic review (2026-09-07)}
|
|
\label{sec:schematic-review}
|
|
\begin{fnwarn}[User-authored schematic, reviewed against every real ball
|
|
assignment established in this chapter]
|
|
This section records an actual review pass of the user's own KiCad
|
|
capture (sheet \code{FPGA-Neural/FPGA.kicad\_sch}) against the real
|
|
ball tables above --- confirmed items and real, disclosed findings,
|
|
not a generic checklist.
|
|
\end{fnwarn}
|
|
|
|
\subsection{Confirmed correct}
|
|
JTAG (TCK=T5, TDI=R5, TDO=V4, TMS=U5); the complete real SDRAM bus
|
|
(A0--A12, all 16 DQ, BA0/BA1, LDQM/UDQM, CLK=F2, CKE=F3, CS\#=G9,
|
|
RAS\#=F8); \code{TLV62568}'s real component values (L1=2.2\,\textmu H,
|
|
R1=100\,k$\Omega$/R2=120\,k$\Omega$ feedback divider, C6=4.7\,\textmu F);
|
|
\code{TLV73325}'s 2.5\,V output; the VCCAUX ferrite (180\,$\Omega$,
|
|
matching the approved \code{CBG160808U181T}); \code{FPGA\_DATA\_READY}=G3,
|
|
\code{FPGA\_RESET}=B4, \code{osc\_clk}=H5; CFG\_1's 10\,k$\Omega$
|
|
pull-up (inside the required 1--10\,k$\Omega$ range).
|
|
|
|
\subsection{Real findings (confirmed, to be corrected)}
|
|
\begin{enumerate}
|
|
\item \textbf{Boot-flash net-name mismatch}: the flash chip's own pins
|
|
are labeled \code{FPGA\_SPI\_CS/SCLK/MOSI/MISO}; the ECP5's
|
|
dedicated MSPI pins (CSSPIN/MCLK/D0/D1, ball R2/U3/W2/V2) are
|
|
labeled \code{FGPA\_SPI\_CLK/MISO/MOSI/CS} --- a transposed
|
|
\code{FGPA}/\code{FPGA} typo, and \code{SCLK} vs.\ \code{CLK}
|
|
are two different label strings. KiCad nets are formed by exact
|
|
label-text match; as captured, the boot flash is electrically
|
|
disconnected from the FPGA's own configuration engine ---
|
|
auto-boot from flash would silently fail. \textbf{Fix}: make all
|
|
eight labels identical text.
|
|
\end{enumerate}
|
|
|
|
\begin{fnnote}[Checked and cleared]
|
|
SDRAM CAS\#/WE\#: user confirmed CAS\#=F7, WE\#=F9 in the real
|
|
schematic --- matches this chapter exactly. The apparent swap in the
|
|
original review was a misread of the schematic image, not a real
|
|
error.
|
|
\end{fnnote}
|
|
|
|
\subsection{Open items --- all resolved as of this pass}
|
|
\begin{itemize}
|
|
\item \code{TLV62568}'s EN pin: \textbf{resolved} --- \code{R3}=499\,k$\Omega$
|
|
confirmed on EN (BOM, \S\ref{sec:bom}), matches TI's own
|
|
reference circuit.
|
|
\item The \code{+1V1} label near the VCCAUX ferrite (L2): \textbf{resolved,
|
|
false alarm}. \code{TLV62568} (U1) itself outputs 1.1\,V (confirmed
|
|
by the user directly, matches the R1/R2 divider calculation in
|
|
\S\ref{sec:power-addendum}) --- the label belongs to U1's own
|
|
real output net, merely placed nearby on the schematic page, not
|
|
routed through the VCCAUX ferrite. VCCAUX remains 2.5\,V as
|
|
required.
|
|
\item JTAG pull-up array (R5--R12, 4.7\,k$\Omega$): TDI/TDO/TMS need a
|
|
pull-up to VCCIO8, TCK needs a pull-\emph{down} to GND ---
|
|
\textbf{resolved}: the real BOM (\S\ref{sec:bom}) confirms these
|
|
are 8 \emph{discrete} 0402 parts, not a single bussed-array
|
|
package, so each can carry its own correct polarity (still
|
|
needs a final visual confirmation of the actual net-by-net
|
|
wiring, but the package-level limitation is ruled out).
|
|
\end{itemize}
|
|
|
|
\section{Bill of Materials (real, KiCad-exported, 2026-09-07)}
|
|
\label{sec:bom}
|
|
\begin{fnwarn}[Real export, cross-checked against every value this
|
|
chapter specifies]
|
|
Most values match exactly (feedback divider, inductor, ferrite,
|
|
regulators, SDRAM). One real discrepancy found: see below.
|
|
\end{fnwarn}
|
|
|
|
\begin{tabularx}{\textwidth}{L{2.4cm} C{1.0cm} L{2.6cm} X}
|
|
\toprule
|
|
\rowh \thd{Ref} & \thd{Qty} & \thd{Value} & \thd{Footprint / Part} \\
|
|
\midrule
|
|
C2,C3,C9,C13,C15,C17,C19,C21,C23,C25,C27,C28,C30 & 13 & 100\,nF & 0402 \\
|
|
\rowa C4 & 1 & 1\,\textmu F & 01005 (TLV73325 CIN) \\
|
|
C5,C7,C8,C10,C11,C12,C14,C16,C18,C20,C22,C24,C26,C29 & 14 & 10\,\textmu F & 0603 \\
|
|
\rowa C6 & 1 & 4.7\,\textmu F & 01005 (TLV62568 CIN) \\
|
|
L1 & 1 & 2.2\,\textmu H & 0805, 1.7\,A/215\,m$\Omega$ \\
|
|
\rowa L2 & 1 & 180\,$\Omega$ & 0603, \code{CBG160808U181T} (VCCAUX ferrite) \\
|
|
R1 & 1 & 100\,k$\Omega$ & 0402 (TLV62568 FB) \\
|
|
\rowa R2 & 1 & 120\,k$\Omega$ & 0402 (TLV62568 FB) \\
|
|
R3 & 1 & 499\,k$\Omega$ & 0402 (TLV62568 EN, matches TI's own reference) \\
|
|
\rowa R4 & 1 & 10\,k$\Omega$ & 0402 (CFG\_1 pull-up) \\
|
|
R5--R12 & 8 & 4.7\,k$\Omega$ & 0402, discrete (JTAG/PROGRAMN/INITN/DONE/CSSPIN) \\
|
|
\rowa U1 & 1 & \code{TLV62568DBV} & SOT-23-5 \\
|
|
U2 & 1 & \code{LFE5U-45F-8BG381I} & CABGA381, \textbf{see discrepancy below} \\
|
|
\rowa U3 & 1 & \code{TLV73325PDBV} & SOT-23-5 \\
|
|
U4 & 1 & \code{AS4C32M16SB-7BIN} & 54-ball TFBGA, 8$\times$8$\times$1.2\,mm (real footprint dims match the datasheet exactly) \\
|
|
\rowa U5 & 1 & 16\,MHz & 3225-4Pin crystal \\
|
|
U9 & 1 & \code{W25Q128JVPIM} & WSON-8, 6$\times$5\,mm (real Winbond DTR datasheet linked) \\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
|
|
\subsection{Discrepancy: FPGA grade}
|
|
\textbf{U2 is captured as \code{LFE5U-45F-8BG381I}} (industrial,
|
|
$-40$ to $+85^{\circ}$C) --- every other reference in this project
|
|
(LPF, this chapter, decisions.log) uses \textbf{\code{LFE5U-45F-8BG381C}}
|
|
(commercial). Could be a deliberate upgrade (consistent with the
|
|
SDRAM's own industrial rating), but needs an explicit confirmation ---
|
|
otherwise a real part-number error in the KiCad library.
|
|
|
|
\subsection{Open items resolved by this BOM}
|
|
R3=499\,k$\Omega$ confirms TLV62568's EN is populated (matches TI's
|
|
own reference circuit exactly). R5--R12 being 8 \emph{discrete} 0402
|
|
parts (not a single multi-resistor array footprint) confirms the
|
|
earlier ``bussed array can't mix pull-up/pull-down'' concern does not
|
|
apply --- each resistor can go to its own correct rail. U5 confirms
|
|
the 16\,MHz oscillator, previously missing from the capture, is now
|
|
present.
|
|
|
|
\subsection{Resolved}
|
|
TLV73325's EN pin: no dedicated resistor needed --- direct wire to
|
|
+3.3\,V (VIN), always-enabled. Unlike TLV62568's own soft-start
|
|
R3=499\,k$\Omega$ pull-up, a plain LDO has no equivalent timing
|
|
requirement (per TI's own datasheet: ``active high, do not leave
|
|
floating,'' no sequencing note); no dynamic enable/disable control
|
|
exists elsewhere in this design.
|
|
|
|
\section{PCB module form factor (reserved)}
|
|
\label{sec:pcb-module}
|
|
Target: a castellated-edge SMD module, approximately
|
|
\textbf{50\,mm $\times$ 25\,mm}, for mounting onto a carrier board ---
|
|
dimensions and pin-out placeholder, real layout pending. This section
|
|
will be filled in with the actual module outline, castellation pin
|
|
map, and mechanical drawing once available.
|