mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
clean up and add K7SATAGTXReconfig skeleton (empty but we don't need it for now)
This commit is contained in:
parent
674e0b3581
commit
22ea5b08b0
1 changed files with 53 additions and 22 deletions
|
@ -1,26 +1,29 @@
|
||||||
from migen.fhdl.std import *
|
from migen.fhdl.std import *
|
||||||
from migen.genlib.resetsync import AsyncResetSynchronizer
|
from migen.genlib.resetsync import AsyncResetSynchronizer
|
||||||
|
from migen.genlib.record import *
|
||||||
|
from migen.genlib.fsm import FSM, NextState
|
||||||
|
from migen.flow.actor import Sink, Source
|
||||||
|
|
||||||
_K28_5 = 0b1010000011
|
_K28_5 = 0b1010000011
|
||||||
|
|
||||||
def _ones(width):
|
def _ones(width):
|
||||||
return 2**width-1
|
return 2**width-1
|
||||||
|
|
||||||
class DRP(Record):
|
class DRPBus(Record):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
layout = [
|
layout = [
|
||||||
("clk", 1),
|
("clk", 1, DIR_M_TO_S),
|
||||||
("en", 1),
|
("en", 1, DIR_M_TO_S),
|
||||||
("rdy", 1),
|
("rdy", 1, DIR_S_TO_M),
|
||||||
("we", 1)
|
("we", 1, DIR_M_TO_S)
|
||||||
("addr", 8),
|
("addr", 8, DIR_M_TO_S),
|
||||||
("di", 16),
|
("di", 16, DIR_M_TO_S),
|
||||||
("do", 16)
|
("do", 16, DIR_S_TO_M)
|
||||||
]
|
]
|
||||||
Record.__init__(self, layout)
|
Record.__init__(self, layout)
|
||||||
|
|
||||||
class GTXE2_CHANNEL(Module):
|
class GTXE2_CHANNEL(Module):
|
||||||
def __init__(self, pads, start_speed="SATA_III"):
|
def __init__(self, pads, default_speed="SATA3"):
|
||||||
self.drp = DRP()
|
self.drp = DRP()
|
||||||
|
|
||||||
# Channel
|
# Channel
|
||||||
|
@ -127,17 +130,17 @@ class GTXE2_CHANNEL(Module):
|
||||||
|
|
||||||
# startup config
|
# startup config
|
||||||
div_config = {
|
div_config = {
|
||||||
"SATA_I" : 4,
|
"SATA1" : 4,
|
||||||
"SATA_II" : 2,
|
"SATA2" : 2,
|
||||||
"SATA_III" : 1
|
"SATA3" : 1
|
||||||
}
|
}
|
||||||
rxout_div = div_config[start_speed]
|
rxout_div = div_config[default_speed]
|
||||||
txout_div = div_config[start_speed]
|
txout_div = div_config[default_speed]
|
||||||
|
|
||||||
cdr_config = {
|
cdr_config = {
|
||||||
"SATA_I" : 0x0380008BFF40100008
|
"SATA1" : 0x0380008BFF40100008
|
||||||
"SATA_II" : 0x0380008BFF40200008
|
"SATA2" : 0x0380008BFF40200008
|
||||||
"SATA_III" : 0X0380008BFF20200010
|
"SATA3" : 0X0380008BFF20200010
|
||||||
}
|
}
|
||||||
rxcdr_cfg = cdr_config[start_speed]
|
rxcdr_cfg = cdr_config[start_speed]
|
||||||
|
|
||||||
|
@ -777,7 +780,33 @@ class GTXE2_CHANNEL(Module):
|
||||||
#o_TXQPISENP=
|
#o_TXQPISENP=
|
||||||
)
|
)
|
||||||
|
|
||||||
class SATAGTX(Module):
|
class K7SATAGTXReconfig(Module):
|
||||||
|
def __init__(self, channel_drp, mmcm_drp):
|
||||||
|
self.speed = Signal(3)
|
||||||
|
###
|
||||||
|
speed_r = Signal(3)
|
||||||
|
speed_change = Signal()
|
||||||
|
self.sync += speed_r.eq(speed)
|
||||||
|
self.comb += speed_change.eq(speed != speed_r)
|
||||||
|
|
||||||
|
drp_sel = Signal()
|
||||||
|
drp = DRPBus()
|
||||||
|
self.comb += \
|
||||||
|
If(sel,
|
||||||
|
Record.connect(drp, mmcm_drp),
|
||||||
|
).Else(
|
||||||
|
Record.connect(drp, channel_drp)
|
||||||
|
)
|
||||||
|
|
||||||
|
fsm = FSM(reset_state="IDLE")
|
||||||
|
self.submodules += fsm
|
||||||
|
|
||||||
|
# Todo
|
||||||
|
fsm.act("IDLE",
|
||||||
|
sel.eq(0),
|
||||||
|
)
|
||||||
|
|
||||||
|
class K7SATAGTX(Module):
|
||||||
def __init__(self, pads):
|
def __init__(self, pads):
|
||||||
self.reset = Signal()
|
self.reset = Signal()
|
||||||
self.transceiver_reset = Signal()
|
self.transceiver_reset = Signal()
|
||||||
|
@ -785,7 +814,7 @@ class SATAGTX(Module):
|
||||||
self.cd_sata_tx = ClockDomain()
|
self.cd_sata_tx = ClockDomain()
|
||||||
self.cd_sata_rx = ClockDomain()
|
self.cd_sata_rx = ClockDomain()
|
||||||
|
|
||||||
self.channel = GTXE2_CHANNEL(pads, "SATA_III")
|
self.submodules.channel = GTXE2_CHANNEL(pads, "SATA3")
|
||||||
|
|
||||||
# TX clocking
|
# TX clocking
|
||||||
refclk = Signal()
|
refclk = Signal()
|
||||||
|
@ -794,8 +823,6 @@ class SATAGTX(Module):
|
||||||
i_IB=pads.refclk_n,
|
i_IB=pads.refclk_n,
|
||||||
o_O=refclk
|
o_O=refclk
|
||||||
)
|
)
|
||||||
|
|
||||||
# refclk--> BUFG-->MMCM-->BUFG-->SATA TX clock
|
|
||||||
mmcm_reset = Signal()
|
mmcm_reset = Signal()
|
||||||
mmcm_locked = Signal()
|
mmcm_locked = Signal()
|
||||||
mmcm_drp = DRP()
|
mmcm_drp = DRP()
|
||||||
|
@ -819,7 +846,7 @@ class SATAGTX(Module):
|
||||||
# CLK0
|
# CLK0
|
||||||
p_CLKOUT0_DIVIDE_F=4.000, p_CLKOUT0_PHASE=0.000, o_CLKOUT0=mmcm_clk_o,
|
p_CLKOUT0_DIVIDE_F=4.000, p_CLKOUT0_PHASE=0.000, o_CLKOUT0=mmcm_clk_o,
|
||||||
),
|
),
|
||||||
Instance("BUFG", i_I=mmcm_clk, o_O=self.cd_sata_tx.clk),
|
Instance("BUFG", i_I=mmcm_clk_o, o_O=self.cd_sata_tx.clk),
|
||||||
]
|
]
|
||||||
|
|
||||||
# RX clocking
|
# RX clocking
|
||||||
|
@ -899,3 +926,7 @@ class SATAGTX(Module):
|
||||||
AsyncResetSynchronizer(self.cd_sata_tx, ~mmcm_locked | ~self.channel.txresetdone),
|
AsyncResetSynchronizer(self.cd_sata_tx, ~mmcm_locked | ~self.channel.txresetdone),
|
||||||
AsyncResetSynchronizer(self.cd_sata_rx, ~self.channel.cplllock | ~self.channel.rxphaligndone),
|
AsyncResetSynchronizer(self.cd_sata_rx, ~self.channel.cplllock | ~self.channel.rxphaligndone),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# Dynamic Reconfiguration
|
||||||
|
self.submodules.reconfig = K7SATAGTXReconfig(mmcm_drp, self.channel.drp)
|
||||||
|
|
Loading…
Reference in a new issue