from nmigen.lib.cdc import ResetSynchronizer
from nmigen_soc import wishbone, memory
from nmigen_soc.memory import MemoryMap
+
from nmigen_stdio.serial import AsyncSerial
from lambdasoc.cpu.minerva import MinervaCPU
from lambdasoc.periph import Peripheral
from lambdasoc.soc.base import SoC
from soc.bus.uart_16550 import UART16550 # opencores 16550 uart
+from soc.bus.external_core import ExternalCore # external libresoc/microwatt
+from soc.bus.wb_downconvert import WishboneDownConvert
from gram.core import gramCore
from gram.phy.ecp5ddrphy import ECP5DDRPHY
# set up clock request generator
self.crg = ECPIX5CRG()
- # set up CPU, and interrupt interface
- if False:
- self.cpu = MinervaCPU(reset_address=0)
- self._arbiter.add(self.cpu.ibus) # I-Cache Master
- self._arbiter.add(self.cpu.dbus) # D-Cache Master. TODO JTAG master
- self.intc = GenericInterruptController(width=len(self.cpu.ip))
+ # set up CPU, with 64-to-32-bit downconverters
+ self.cpu = ExternalCore(name="ext_core")
+ cvtdbus = wishbone.Interface(addr_width=30, data_width=32,
+ features={'stall'}, granularity=8)
+ cvtibus = wishbone.Interface(addr_width=30, data_width=32,
+ features={'stall'}, granularity=8)
+ self.dbusdowncvt = WishboneDownConvert(self.cpu.dbus, cvtdbus)
+ self.ibusdowncvt = WishboneDownConvert(self.cpu.ibus, cvtibus)
+ self._arbiter.add(cvtibus) # I-Cache Master
+ self._arbiter.add(cvtdbus) # D-Cache Master. TODO JTAG master
+
+ # CPU interrupt controller
+ self.intc = GenericInterruptController(width=len(self.cpu.irq))
# SRAM (but actually a ROM, for firmware), at address 0x0
if fw_addr is not None:
m.submodules.ddrphy = self.ddrphy
m.submodules.dramcore = self.dramcore
m.submodules.drambone = self.drambone
+ if hasattr(self, "cpu"):
+ m.submodules.extcore = self.cpu
+ m.submodules.dbuscvt = self.dbusdowncvt
+ m.submodules.ibuscvt = self.ibusdowncvt
# add blinky lights so we know FPGA is alive
if platform is not None:
# to the decoder (addressing wishbone slaves)
comb += self._arbiter.bus.connect(self._decoder.bus)
- if False:
+ if hasattr(self, "cpu"):
# wire up the CPU interrupts
- comb += self.cpu.ip.eq(self.intc.ip)
+ comb += self.cpu.irq.eq(self.intc.ip)
# add uart16550 verilog source. assumes a directory
# structure where ls2 has been checked out in a common