Skip to content

Commit

Permalink
cores/hyperbus: Cleanup/Improve Config/Reg Interfaces.
Browse files Browse the repository at this point in the history
  • Loading branch information
enjoy-digital committed Apr 15, 2024
1 parent 6e00cfa commit 8e48d0d
Showing 1 changed file with 30 additions and 17 deletions.
47 changes: 30 additions & 17 deletions litex/soc/cores/hyperbus.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,26 +34,28 @@ def __init__(self, pads, latency=6, latency_mode="fixed", sys_clk_freq=None, wit
self.pads = pads
self.bus = bus = wishbone.Interface(data_width=32, address_width=32, addressing="word")

# Parameters.
# -----------
assert latency_mode in ["fixed", "variable"]
self.latency = Signal(8, reset=latency)

# Reg Interface.
# --------------
# Config/Reg Interface.
# ---------------------
self.conf_rst = Signal()
self.conf_latency = Signal(8, reset=latency)
self.reg_write = Signal()
self.reg_read = Signal()
self.reg_addr = Signal(2)
self.reg_write_done = Signal()
self.reg_read_done = Signal()
self.reg_write_data = Signal(16)
self.reg_read_data = Signal(16)

if with_csr:
self.add_csr(default_latency=latency)

# # #

# Parameters.
# -----------
assert latency_mode in ["fixed", "variable"]

# Internal Signals.
# -----------------
clk = Signal()
clk_phase = Signal(2)
cs = Signal()
Expand All @@ -71,7 +73,7 @@ def __init__(self, pads, latency=6, latency_mode="fixed", sys_clk_freq=None, wit

# Rst.
if hasattr(pads, "rst_n"):
self.comb += pads.rst_n.eq(1)
self.comb += pads.rst_n.eq(1 & ~self.conf_rst)

# CSn.
self.comb += pads.cs_n[0].eq(~cs)
Expand Down Expand Up @@ -245,8 +247,8 @@ def __init__(self, pads, latency=6, latency_mode="fixed", sys_clk_freq=None, wit
# Set CSn.
cs.eq(1),
# Wait for 1X or 2X Latency cycles... (-4 since count start in the middle of the command).
If(((cycles == 2*(self.latency * 4) - 4 - 1) & refresh) | # 2X Latency (No DRAM refresh required).
((cycles == 1*(self.latency * 4) - 4 - 1) & ~refresh) , # 1X Latency ( DRAM refresh required).
If(((cycles == 2*(self.conf_latency * 4) - 4 - 1) & refresh) | # 2X Latency (No DRAM refresh required).
((cycles == 1*(self.conf_latency * 4) - 4 - 1) & ~refresh) , # 1X Latency ( DRAM refresh required).
# Latch Bus.
bus_latch.eq(1),
# Early Write Ack (to allow bursting).
Expand Down Expand Up @@ -311,16 +313,27 @@ def add_tristate(self, pad):
return t

def add_csr(self, default_latency=6):
self._latency = CSRStorage(8, reset=default_latency)
self.comb += self.latency.eq(self._latency.storage)
# Config Interface.
# -----------------
self.config = CSRStorage(fields=[
CSRField("rst", offset=0, size=1, pulse=True, description="HyperRAM Rst."),
CSRField("latency", offset=8, size=8, description="HyperRAM Latency (X1).", reset=default_latency),
])
self.comb += [
self.conf_rst.eq( self.config.fields.rst),
self.conf_latency.eq(self.config.fields.latency),
]

# Reg Interface.
# --------------
self.reg_control = CSRStorage(fields=[
CSRField("write", offset=0, size=1, pulse=True, description="Issue Register Write."),
CSRField("read", offset=1, size=1, pulse=True, description="Issue Register Read."),
CSRField("addr", offset=8, size=4, values=[
("``0``", "Identification Register 0 (Read Only)."),
("``1``", "Identification Register 1 (Read Only)."),
("``2``", "Configuration Register 0."),
("``3``", "Configuration Register 1."),
("``0b00``", "Identification Register 0 (Read Only)."),
("``0b01``", "Identification Register 1 (Read Only)."),
("``0b10``", "Configuration Register 0."),
("``0b11``", "Configuration Register 1."),
]),
])
self.reg_status = CSRStatus(fields=[
Expand Down

0 comments on commit 8e48d0d

Please sign in to comment.