3f6c7a0adc6ed23bdeacfdb68000010730c7f74c
1 from migen
.fhdl
.structure
import *
2 from migen
.bus
import dfi
3 from migen
.bank
.description
import *
4 from migen
.bank
import csrgen
7 def __init__(self
, phase
):
10 self
._cs
= Field("cs", 1, WRITE_ONLY
, READ_ONLY
)
11 self
._we
= Field("we", 1, WRITE_ONLY
, READ_ONLY
)
12 self
._cas
= Field("cas", 1, WRITE_ONLY
, READ_ONLY
)
13 self
._ras
= Field("ras", 1, WRITE_ONLY
, READ_ONLY
)
14 self
._wren
= Field("wren", 1, WRITE_ONLY
, READ_ONLY
)
15 self
._rden
= Field("rden", 1, WRITE_ONLY
, READ_ONLY
)
16 self
._command
= RegisterFields("command",
17 [self
._cs
, self
._we
, self
._cas
, self
._ras
, self
._wren
, self
._rden
])
19 self
._address
= RegisterField("address", len(self
.phase
.address
))
20 self
._baddress
= RegisterField("baddress", len(self
.phase
.bank
))
22 self
._wrdata
= RegisterField("wrdata", len(self
.phase
.wrdata
))
23 self
._rddata
= RegisterField("rddata", len(self
.phase
.rddata
), READ_ONLY
, WRITE_ONLY
)
25 def get_registers(self
):
26 return [self
._command
,
27 self
._address
, self
._baddress
,
28 self
._wrdata
, self
._rddata
]
30 def get_fragment(self
):
33 self
.phase
.cs_n
.eq(~self
._cs
.r
),
34 self
.phase
.we_n
.eq(~self
._we
.r
),
35 self
.phase
.cas_n
.eq(~self
._cas
.r
),
36 self
.phase
.ras_n
.eq(~self
._ras
.r
)
38 self
.phase
.cs_n
.eq(1),
39 self
.phase
.we_n
.eq(1),
40 self
.phase
.cas_n
.eq(1),
41 self
.phase
.ras_n
.eq(1)
43 self
.phase
.address
.eq(self
._address
.field
.r
),
44 self
.phase
.bank
.eq(self
._baddress
.field
.r
),
45 self
.phase
.wrdata_en
.eq(self
._command
.re
& self
._wren
.r
),
46 self
.phase
.rddata_en
.eq(self
._command
.re
& self
._rden
.r
),
47 self
.phase
.wrdata
.eq(self
._wrdata
.field
.r
),
48 self
.phase
.wrdata_mask
.eq(0)
51 If(self
.phase
.rddata_valid
, self
._rddata
.field
.w
.eq(self
.phase
.rddata
))
53 return Fragment(comb
, sync
)
56 def __init__(self
, csr_address
, a
, ba
, d
, nphases
=1):
57 self
._int
= dfi
.Interface(a
, ba
, d
, nphases
)
58 self
.slave
= dfi
.Interface(a
, ba
, d
, nphases
)
59 self
.master
= dfi
.Interface(a
, ba
, d
, nphases
)
61 self
._sel
= Field("sel")
62 self
._cke
= Field("cke")
63 self
._control
= RegisterFields("control", [self
._sel
, self
._cke
])
65 self
._phase
_injectors
= [PhaseInjector(phase
) for phase
in self
._int
.phases
]
67 registers
= sum([pi
.get_registers() for pi
in self
._phase
_injectors
], [self
._control
])
68 self
.bank
= csrgen
.Bank(registers
, address
=csr_address
)
70 def get_fragment(self
):
71 connect_int
= dfi
.interconnect_stmts(self
._int
, self
.master
)
72 connect_slave
= dfi
.interconnect_stmts(self
.slave
, self
.master
)
74 If(self
._sel
.r
, *connect_slave
).Else(*connect_int
)
76 comb
+= [phase
.cke
.eq(self
._cke
.r
) for phase
in self
._int
.phases
]
78 return Fragment(comb
) \
79 + sum([pi
.get_fragment() for pi
in self
._phase
_injectors
], Fragment()) \
80 + self
.bank
.get_fragment()