2012-02-15 12:09:14 -05:00
|
|
|
from migen.fhdl.structure import *
|
|
|
|
from migen.bus.simple import *
|
|
|
|
|
|
|
|
def phase_description(a, ba, d):
|
|
|
|
return Description(
|
|
|
|
(M_TO_S, "address", a),
|
|
|
|
(M_TO_S, "bank", ba),
|
|
|
|
(M_TO_S, "cas_n", 1),
|
|
|
|
(M_TO_S, "cke", 1),
|
|
|
|
(M_TO_S, "cs_n", 1),
|
|
|
|
(M_TO_S, "ras_n", 1),
|
|
|
|
(M_TO_S, "we_n", 1),
|
|
|
|
|
|
|
|
(M_TO_S, "wrdata", d),
|
|
|
|
(M_TO_S, "wrdata_en", 1),
|
|
|
|
(M_TO_S, "wrdata_mask", d//8),
|
|
|
|
|
|
|
|
(M_TO_S, "rddata_en", 1),
|
|
|
|
(S_TO_M, "rddata", d),
|
|
|
|
(S_TO_M, "rddata_valid", 1)
|
|
|
|
)
|
|
|
|
|
|
|
|
class Interface:
|
|
|
|
def __init__(self, a, ba, d, nphases=1):
|
|
|
|
self.pdesc = phase_description(a, ba, d)
|
|
|
|
self.phases = [SimpleInterface(self.pdesc) for i in range(nphases)]
|
2012-04-01 11:43:24 -04:00
|
|
|
for p in self.phases:
|
2012-11-28 17:18:43 -05:00
|
|
|
p.cas_n.reset = 1
|
|
|
|
p.cs_n.reset = 1
|
|
|
|
p.ras_n.reset = 1
|
|
|
|
p.we_n.reset = 1
|
2012-02-15 12:09:14 -05:00
|
|
|
|
|
|
|
# Returns pairs (DFI-mandated signal name, Migen signal object)
|
2012-02-15 15:48:05 -05:00
|
|
|
def get_standard_names(self, m2s=True, s2m=True):
|
2012-02-15 12:09:14 -05:00
|
|
|
r = []
|
|
|
|
add_suffix = len(self.phases) > 1
|
|
|
|
for n, phase in enumerate(self.phases):
|
|
|
|
for signal in self.pdesc.desc:
|
2012-02-15 15:48:05 -05:00
|
|
|
if (m2s and signal[0] == M_TO_S) or (s2m and signal[0] == S_TO_M):
|
|
|
|
if add_suffix:
|
|
|
|
if signal[0] == M_TO_S:
|
2012-02-19 11:57:04 -05:00
|
|
|
suffix = "_p" + str(n)
|
2012-02-15 15:48:05 -05:00
|
|
|
else:
|
2012-02-19 11:57:04 -05:00
|
|
|
suffix = "_w" + str(n)
|
2012-02-15 12:09:14 -05:00
|
|
|
else:
|
2012-02-15 15:48:05 -05:00
|
|
|
suffix = ""
|
|
|
|
r.append(("dfi_" + signal[1] + suffix, getattr(phase, signal[1])))
|
2012-02-15 12:09:14 -05:00
|
|
|
return r
|
|
|
|
|
2012-02-17 17:51:32 -05:00
|
|
|
def interconnect_stmts(master, slave):
|
|
|
|
r = []
|
|
|
|
for pm, ps in zip(master.phases, slave.phases):
|
|
|
|
r += simple_interconnect_stmts(master.pdesc, pm, [ps])
|
|
|
|
return r
|
|
|
|
|
2012-02-15 12:09:14 -05:00
|
|
|
class Interconnect:
|
|
|
|
def __init__(self, master, slave):
|
|
|
|
self.master = master
|
|
|
|
self.slave = slave
|
|
|
|
|
|
|
|
def get_fragment(self):
|
2012-02-17 17:51:32 -05:00
|
|
|
return Fragment(interconnect_stmts(self.master, self.slave))
|