litex/migen/bus/dfi.py

54 lines
1.5 KiB
Python
Raw Normal View History

from migen.fhdl.std import *
from migen.genlib.record import *
2012-02-15 12:09:14 -05:00
def phase_description(a, ba, d):
return [
("address", a, DIR_M_TO_S),
("bank", ba, DIR_M_TO_S),
("cas_n", 1, DIR_M_TO_S),
("cke", 1, DIR_M_TO_S),
("cs_n", 1, DIR_M_TO_S),
("ras_n", 1, DIR_M_TO_S),
("we_n", 1, DIR_M_TO_S),
2012-02-15 12:09:14 -05:00
("wrdata", d, DIR_M_TO_S),
("wrdata_en", 1, DIR_M_TO_S),
("wrdata_mask", d//8, DIR_M_TO_S),
2012-02-15 12:09:14 -05:00
("rddata_en", 1, DIR_M_TO_S),
("rddata", d, DIR_S_TO_M),
("rddata_valid", 1, DIR_S_TO_M)
]
2012-02-15 12:09:14 -05:00
class Interface(Record):
2012-02-15 12:09:14 -05:00
def __init__(self, a, ba, d, nphases=1):
layout = [("p"+str(i), phase_description(a, ba, d)) for i in range(nphases)]
Record.__init__(self, layout)
self.phases = [getattr(self, "p"+str(i)) 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 field, size, direction in phase.layout:
if (m2s and direction == DIR_M_TO_S) or (s2m and direction == DIR_S_TO_M):
2012-02-15 15:48:05 -05:00
if add_suffix:
if direction == DIR_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_" + field + suffix, getattr(phase, field)))
2012-02-15 12:09:14 -05:00
return r
class Interconnect(Module):
2012-02-15 12:09:14 -05:00
def __init__(self, master, slave):
self.comb += master.connect(slave)