1 # This file is Copyright (c) 2015-2019 Florent Kermarrec <florent@enjoy-digital.fr>
2 # This file is Copyright (c) 2017 William D. Jones <thor0505@comcast.net>
3 # This file is Copyright (c) 2019 David Shah <dave@ds0.me>
6 from migen
.fhdl
.module
import Module
7 from migen
.fhdl
.specials
import Instance
, Tristate
8 from migen
.fhdl
.bitcontainer
import value_bits_sign
9 from migen
.genlib
.io
import *
10 from migen
.genlib
.resetsync
import AsyncResetSynchronizer
12 # ECPX AsyncResetSynchronizer ----------------------------------------------------------------------
14 class LatticeECPXAsyncResetSynchronizerImpl(Module
):
15 def __init__(self
, cd
, async_reset
):
31 class LatticeECPXAsyncResetSynchronizer
:
34 return LatticeECPXAsyncResetSynchronizerImpl(dr
.cd
, dr
.async_reset
)
36 # ECPX Differential Output -------------------------------------------------------------------------
38 class LatticeECPXDDROutputImpl(Module
):
39 def __init__(self
, i1
, i2
, o
, clk
):
42 synthesis_directive
="ODDRAPPS=\"SCLK_ALIGNED\"",
50 class LatticeECPXDDROutput
:
53 return LatticeECPXDDROutputImpl(dr
.i1
, dr
.i2
, dr
.o
, dr
.clk
)
55 # ECPX Special Overrides ---------------------------------------------------------------------------
57 lattice_ecpx_special_overrides
= {
58 AsyncResetSynchronizer
: LatticeECPXAsyncResetSynchronizer
,
59 DDROutput
: LatticeECPXDDROutput
62 # ECPX Trellis Tristate ----------------------------------------------------------------------------
64 class LatticeECPXTrellisTristateImpl(Module
):
65 def __init__(self
, io
, o
, oe
, i
):
66 nbits
, sign
= value_bits_sign(io
)
69 Instance("TRELLIS_IO",
78 for bit
in range(nbits
):
80 Instance("TRELLIS_IO",
90 class LatticeECPXTrellisTristate(Module
):
93 return LatticeECPXTrellisTristateImpl(dr
.target
, dr
.o
, dr
.oe
, dr
.i
)
95 # ECPX Trellis Special Overrides -------------------------------------------------------------------
97 lattice_ecpx_trellis_special_overrides
= {
98 AsyncResetSynchronizer
: LatticeECPXAsyncResetSynchronizer
,
99 Tristate
: LatticeECPXTrellisTristate
,
100 DDROutput
: LatticeECPXDDROutput
103 # iCE40 AsyncResetSynchronizer ----------------------------------------------------------------------
105 class LatticeiCE40AsyncResetSynchronizerImpl(Module
):
106 def __init__(self
, cd
, async_reset
):
109 Instance("SB_DFFS", i_D
=0, i_S
=async_reset
,
110 i_C
=cd
.clk
, o_Q
=rst1
),
111 Instance("SB_DFFS", i_D
=rst1
, i_S
=async_reset
,
112 i_C
=cd
.clk
, o_Q
=cd
.rst
)
116 class LatticeiCE40AsyncResetSynchronizer
:
119 return LatticeiCE40AsyncResetSynchronizerImpl(dr
.cd
, dr
.async_reset
)
121 # iCE40 Trellis Tristate ---------------------------------------------------------------------------
123 class LatticeiCE40TristateImpl(Module
):
124 def __init__(self
, io
, o
, oe
, i
):
125 nbits
, sign
= value_bits_sign(io
)
129 p_PIN_TYPE
= C(0b101001, 6),
131 i_OUTPUT_ENABLE
= oe
,
137 for bit
in range(nbits
):
140 p_PIN_TYPE
= C(0b101001, 6),
141 io_PACKAGE_PIN
= io
[bit
],
142 i_OUTPUT_ENABLE
= oe
,
149 class LatticeiCE40Tristate(Module
):
152 return LatticeiCE40TristateImpl(dr
.target
, dr
.o
, dr
.oe
, dr
.i
)
154 # iCE40 Differential Output ------------------------------------------------------------------------
156 class LatticeiCE40DifferentialOutputImpl(Module
):
157 def __init__(self
, i
, o_p
, o_n
):
160 p_PIN_TYPE
= C(0b011000, 6),
161 p_IO_STANDARD
= "SB_LVCMOS",
162 io_PACKAGE_PIN
= o_p
,
169 p_PIN_TYPE
= C(0b011000, 6),
170 p_IO_STANDARD
= "SB_LVCMOS",
171 io_PACKAGE_PIN
= o_n
,
177 class LatticeiCE40DifferentialOutput
:
180 return LatticeiCE40DifferentialOutputImpl(dr
.i
, dr
.o_p
, dr
.o_n
)
183 # iCE40 DDR Output ---------------------------------------------------------------------------------
185 class LatticeiCE40DDROutputImpl(Module
):
186 def __init__(self
, i1
, i2
, o
, clk
):
189 p_PIN_TYPE
= C(0b010000, 6),
190 p_IO_STANDARD
= "SB_LVCMOS",
201 class LatticeiCE40DDROutput
:
204 return LatticeiCE40DDROutputImpl(dr
.i1
, dr
.i2
, dr
.o
, dr
.clk
)
206 # iCE40 Trellis Special Overrides ------------------------------------------------------------------
208 lattice_ice40_special_overrides
= {
209 AsyncResetSynchronizer
: LatticeiCE40AsyncResetSynchronizer
,
210 Tristate
: LatticeiCE40Tristate
,
211 DifferentialOutput
: LatticeiCE40DifferentialOutput
,
212 DDROutput
: LatticeiCE40DDROutput