build/efinix/common: Add initial Tristate/SDRTristate support.

This commit is contained in:
Florent Kermarrec 2021-10-22 20:02:17 +02:00
parent 89b66be323
commit 68b67af1bd
1 changed files with 52 additions and 1 deletions

View File

@ -10,6 +10,8 @@ from migen.genlib.resetsync import AsyncResetSynchronizer
from litex.build.io import * from litex.build.io import *
from litex.build.efinix.efinity import EfinityToolchain
# Efinix AsyncResetSynchronizer -------------------------------------------------------------------- # Efinix AsyncResetSynchronizer --------------------------------------------------------------------
class EfinixAsyncResetSynchronizerImpl(Module): class EfinixAsyncResetSynchronizerImpl(Module):
@ -38,8 +40,57 @@ class EfinixAsyncResetSynchronizer:
def lower(dr): def lower(dr):
return EfinixAsyncResetSynchronizerImpl(dr.cd, dr.async_reset) return EfinixAsyncResetSynchronizerImpl(dr.cd, dr.async_reset)
# Efinix Tristate ----------------------------------------------------------------------------------
class EfinixTristateImpl(Module):
def __init__(self, platform, io, o, oe, i):
nbits, sign = value_bits_sign(io)
assert nbits == 1
io_name = platform.get_pin_name(io)
print(io_name)
io_loc = platform.get_pin_location(io)
self.comb += [
platform.add_iface_io(io_name + "_OUT").eq(o),
platform.add_iface_io(io_name + "_OE").eq(oe),
i.eq(platform.add_iface_io(io_name + "_IN"))
]
block = {
"type" : "GPIO",
"mode" : "INOUT",
"name" : io_name,
"location": [io_loc[0]],
}
platform.toolchain.ifacewriter.blocks.append(block)
#platform.delete(io) # FIXME!
class EfinixTristate(Module):
@staticmethod
def lower(dr):
return EfinixTristateImpl(dr.platform, dr.target, dr.o, dr.oe, dr.i)
# Efinix SDRTristate -------------------------------------------------------------------------------
class EfinixSDRTristateImpl(Module):
def __init__(self, platform, io, o, oe, i, clk):
_o = Signal()
_oe = Signal()
_i = Signal()
self.specials += SDROutput(o, _o, clk)
self.specials += SDRInput(_i, i, clk)
self.submodules += InferedSDRIO(oe, _oe, clk)
tristate = Tristate(io, _o, _oe, _i)
tristate.platform = platform
self.specials += tristate
class EfinixSDRTristate(Module):
@staticmethod
def lower(dr):
return EfinixSDRTristateImpl(dr.platform, dr.io, dr.o, dr.oe, dr.i, dr.clk)
# Efinix Special Overrides ------------------------------------------------------------------------- # Efinix Special Overrides -------------------------------------------------------------------------
efinix_special_overrides = { efinix_special_overrides = {
AsyncResetSynchronizer: EfinixAsyncResetSynchronizer AsyncResetSynchronizer : EfinixAsyncResetSynchronizer,
Tristate : EfinixTristate,
SDRTristate : EfinixSDRTristate,
} }