Moved all components to F.Cu
This commit is contained in:
+70
-19
@@ -59,8 +59,10 @@ from exi_bba.bba_top import BBATop
|
||||
# LEDs which are active-low. No physical button exists on this board (the
|
||||
# iCEbreaker's BTN_N was dev-board-only); panel_btn is tied idle instead.
|
||||
# RGB status LED (D11=red/rx, D12=green/tx, D13=yellow/ready) is on the
|
||||
# iCE40UP5K's dedicated SB_RGBA_DRV pins 39/40/41 — fixed by the chip
|
||||
# package on any board, not board-specific, so no resource needed here.
|
||||
# iCE40UP5K's dedicated SB_RGBA_DRV pads 39/40/41. It IS declared as a
|
||||
# "rgb" resource and requested RAW (dir="-") so SB_RGBA_DRV drives the pads
|
||||
# directly — leaving o_RGB* dangling (the old code) never bonds them and the
|
||||
# LEDs stay dark. See the "rgb" Resource + elaborate() below, and BRINGUP.md.
|
||||
|
||||
# nextpnr P&R options. The binding constraint is the isolated 54 MHz capture
|
||||
# domain (the SPI Mode-3 bit engine); the 24 MHz sync domain has wide margin.
|
||||
@@ -75,6 +77,26 @@ from exi_bba.bba_top import BBATop
|
||||
# sync domain. Plain --opt-timing is the better baseline.
|
||||
_PNR_TIMING_OPTS = "--opt-timing"
|
||||
|
||||
# UART pin override for bring-up. The re-bba-rb V1 lab unit had its UART_RXD
|
||||
# trace (FPGA pin 19 → FT2232H pin 39) severed by a via-repair drill hole, and
|
||||
# the 0.5 mm FT2232H pitch is not hand-reworkable. Set env UART_J4=1 to relocate
|
||||
# the UART onto the accessible J4 debug header — DBG0 = J4 pin 2 = FPGA pin 9
|
||||
# (FPGA TX), DBG1 = J4 pin 3 = FPGA pin 10 (FPGA RX), GND = J4 pin 1 — so an
|
||||
# external USB-UART dongle can drive the shell, bypassing the FT2232H channel B
|
||||
# completely. Unset (default) keeps the normal FT2232H channel-B pins
|
||||
# (tx = 19 = UART_RXD net, rx = 18 = UART_TXD net).
|
||||
_UART_TX, _UART_RX = ("9", "10") if os.environ.get("UART_J4") else ("19", "18")
|
||||
|
||||
# ETH_D3 relocation for the damaged V1 lab unit: the W5100 data bit-3 trace
|
||||
# (FPGA pin 28 → W5100 U11 pin 40, top copper) was nicked by a drill hole, and
|
||||
# neither the 0.5 mm pin nor the 0.1 mm trace is hand-reworkable. Set
|
||||
# ETH_D3_PIN=<n> to drive W5100 D3 from a coarse J4 header pad instead, and bodge
|
||||
# that pad to the W5100 D3 net: DBG0=9 (J4 pin2), DBG1=10 (J4 pin3),
|
||||
# DBG2=11 (J4 pin4), DBG3=12 (J4 pin5), DBG4=6 (J4 pin6). NOTE pin 9 collides
|
||||
# with UART_J4 TX — fine for the W5100/eth test builds (no UART), not for the
|
||||
# full UART_J4 design. Default = 28 (real board). See BRINGUP.md.
|
||||
_ETH_D3 = os.environ.get("ETH_D3_PIN", "28")
|
||||
|
||||
|
||||
class IceBreakerPlatform(LatticeICE40Platform):
|
||||
device = "iCE40UP5K"
|
||||
@@ -99,7 +121,7 @@ class IceBreakerPlatform(LatticeICE40Platform):
|
||||
# W5100 indirect parallel bus
|
||||
Resource("w5100", 0,
|
||||
Subsignal("addr", Pins("42 38", dir="o")),
|
||||
Subsignal("data", Pins("34 32 31 28 27 26 25 23", dir="io")),
|
||||
Subsignal("data", Pins(f"34 32 31 {_ETH_D3} 27 26 25 23", dir="io")),
|
||||
Subsignal("cs_n", Pins("43", dir="o")),
|
||||
Subsignal("rd_n", Pins("37", dir="o")),
|
||||
Subsignal("wr_n", Pins("36", dir="o")),
|
||||
@@ -114,11 +136,23 @@ class IceBreakerPlatform(LatticeICE40Platform):
|
||||
Resource("ledr", 0, Pins("48", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||
Resource("ledg", 0, Pins("47", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||
|
||||
# UART debug console → FT2232H Channel B.
|
||||
# On the PC: open the second USB serial port at 115200 8N1.
|
||||
# RGB status LED on the iCE40UP5K's dedicated SB_RGBA_DRV pads
|
||||
# (39=D11 red, 40=D12 green, 41=D13 yellow). Requested RAW (dir="-") in
|
||||
# elaborate and wired straight from the SB_RGBA_DRV hard block — a normal
|
||||
# buffered (dir="o") output fails nextpnr packing:
|
||||
# "SB_RGB_DRV/SB_RGBA_DRV port connected to more than just package pin!"
|
||||
# (Bug found at bring-up 2026-08-23: these were previously left dangling,
|
||||
# so the rx/tx/ready RGB indicators never lit. See BRINGUP.md item 5.)
|
||||
Resource("rgb", 0,
|
||||
Subsignal("r", Pins("39", dir="o")),
|
||||
Subsignal("g", Pins("40", dir="o")),
|
||||
Subsignal("b", Pins("41", dir="o"))),
|
||||
|
||||
# UART debug console → FT2232H Channel B (or J4 header if UART_J4=1).
|
||||
# On the PC: open the serial port at 115200 8N1.
|
||||
Resource("uart", 0,
|
||||
Subsignal("tx", Pins("19", dir="o")),
|
||||
Subsignal("rx", Pins("18", dir="i")),
|
||||
Subsignal("tx", Pins(_UART_TX, dir="o")),
|
||||
Subsignal("rx", Pins(_UART_RX, dir="i")),
|
||||
Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||
]
|
||||
|
||||
@@ -170,20 +204,37 @@ class BBATopSynth(BBATop):
|
||||
if self._status_panel:
|
||||
ledr = platform.request("ledr", 0)
|
||||
ledg = platform.request("ledg", 0)
|
||||
rgb = platform.request("rgb", 0, dir="-") # raw pads (no buffer)
|
||||
led = self.panel_led
|
||||
|
||||
# Green-LED PWM dimming. Both green emitters are over-bright on
|
||||
# the re-bba-rb V1 (bring-up 2026-08-23): the discrete LED_G/D6
|
||||
# heartbeat has a wrong 49.9 Ohm series resistor (R37, should be
|
||||
# ~330 Ohm), and the RGB green D12 die is very efficient even at
|
||||
# the SB_RGBA_DRV minimum current code. The current code is
|
||||
# already the minimum, so time-average both greens down with a
|
||||
# low-duty PWM. Red (D11/LED_R) and yellow (D13) are fine — left
|
||||
# solid. Tune _GRN_DUTY (0..15, /16 duty) at bring-up; see
|
||||
# BRINGUP.md items 1 & 5. PWM freq = 24 MHz/16 = 1.5 MHz (no
|
||||
# visible flicker).
|
||||
_GRN_DUTY = 2 # ~1/8 duty
|
||||
pwm_cnt = Signal(4)
|
||||
grn_pwm = Signal()
|
||||
m.d.sync += pwm_cnt.eq(pwm_cnt + 1)
|
||||
m.d.comb += grn_pwm.eq(pwm_cnt < _GRN_DUTY)
|
||||
|
||||
m.d.comb += [
|
||||
ledg.o.eq(led[0]), # heartbeat (active-high LED)
|
||||
ledr.o.eq(led[1]), # EXI activity (active-high LED)
|
||||
ledg.o.eq(led[0] & grn_pwm), # heartbeat (green) — PWM-dimmed
|
||||
ledr.o.eq(led[1]), # EXI activity (red) — fine
|
||||
# all 3 bits idle/released (active-low idle = 1) — no
|
||||
# physical button exists on this board to read
|
||||
self.panel_btn.eq(C(0b111, 3)),
|
||||
]
|
||||
|
||||
# iCEbreaker RGB LED has no series resistors — must use
|
||||
# SB_RGBA_DRV (raw pad driver with built-in current source).
|
||||
# RGB0=red→rx_act RGB1=green→tx_act RGB2=blue→ready
|
||||
# Verify colour-to-element mapping against schematic at bring-up.
|
||||
# RGB LED has no series resistors — must use SB_RGBA_DRV (raw pad
|
||||
# driver with built-in current source). o_RGB* MUST connect
|
||||
# directly to the pads (rgb.*.io) — a buffered output fails
|
||||
# packing. RGB0=red→rx RGB1=green→tx RGB2=yellow→ready.
|
||||
m.submodules.rgb_drv = Instance("SB_RGBA_DRV",
|
||||
p_CURRENT_MODE="0b1",
|
||||
p_RGB0_CURRENT="0b000001",
|
||||
@@ -191,12 +242,12 @@ class BBATopSynth(BBATop):
|
||||
p_RGB2_CURRENT="0b000001",
|
||||
i_CURREN=Const(1, 1),
|
||||
i_RGBLEDEN=Const(1, 1),
|
||||
i_RGB0PWM=led[2],
|
||||
i_RGB1PWM=led[3],
|
||||
i_RGB2PWM=led[4],
|
||||
o_RGB0=Signal(name="rgb_r"),
|
||||
o_RGB1=Signal(name="rgb_g"),
|
||||
o_RGB2=Signal(name="rgb_b"),
|
||||
i_RGB0PWM=led[2], # rx → red D11 (solid)
|
||||
i_RGB1PWM=led[3] & grn_pwm, # tx → green D12 (PWM-dimmed)
|
||||
i_RGB2PWM=led[4], # ready → yellow D13 (solid)
|
||||
o_RGB0=rgb.r.io,
|
||||
o_RGB1=rgb.g.io,
|
||||
o_RGB2=rgb.b.io,
|
||||
)
|
||||
|
||||
# ── UART debug console/shell → FT2232H Channel B ───────────────
|
||||
|
||||
Reference in New Issue
Block a user