cores/gpio: add support for Record on GPIOOut, GPIOIn and GPIOInOut.

This commit is contained in:
Florent Kermarrec 2020-08-03 18:47:17 +02:00
parent 5e53e5d73a
commit 2ec4604c41
1 changed files with 18 additions and 10 deletions

View File

@ -1,4 +1,5 @@
# This file is Copyright (c) 2013-2015 Sebastien Bourdeauducq <sb@m-labs.hk>
# This file is Copyright (c) 2019-2020 Florent Kermarrec <florent@enjoy-digital.fr>
# License: BSD
from migen import *
@ -6,26 +7,33 @@ from migen.genlib.cdc import MultiReg
from litex.soc.interconnect.csr import *
# GPIO Input ----------------------------------------------------------------------------------------
# Helpers ------------------------------------------------------------------------------------------
def _to_signal(obj):
return obj.raw_bits() if isinstance(obj, Record) else obj
# GPIO Input ---------------------------------------------------------------------------------------
class GPIOIn(Module, AutoCSR):
def __init__(self, signal):
self._in = CSRStatus(len(signal), description="GPIO Input(s) Status.")
self.specials += MultiReg(signal, self._in.status)
def __init__(self, pads):
pads = _to_signal(pads)
self._in = CSRStatus(len(pads), description="GPIO Input(s) Status.")
self.specials += MultiReg(pads, self._in.status)
# GPIO Output --------------------------------------------------------------------------------------
class GPIOOut(Module, AutoCSR):
def __init__(self, signal):
self._out = CSRStorage(len(signal), description="GPIO Output(s) Control.")
self.comb += signal.eq(self._out.storage)
def __init__(self, pads):
pads = _to_signal(pads)
self.out = CSRStorage(len(pads), description="GPIO Output(s) Control.")
self.comb += pads.eq(self.out.storage)
# GPIO Input/Output --------------------------------------------------------------------------------
class GPIOInOut(Module):
def __init__(self, in_signal, out_signal):
self.submodules.gpio_in = GPIOIn(in_signal)
self.submodules.gpio_out = GPIOOut(out_signal)
def __init__(self, in_pads, out_pads):
self.submodules.gpio_in = GPIOIn(in_pads)
self.submodules.gpio_out = GPIOOut(out_pads)
def get_csrs(self):
return self.gpio_in.get_csrs() + self.gpio_out.get_csrs()