Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class SRAM(Module):
- def __init__(self, mem_or_size, read_only=None, init=None, bus=None, full_memory_we=False):
- if bus is None:
- bus = Interface()
- self.bus = bus
- bus_data_width = flen(self.bus.dat_r)
- if isinstance(mem_or_size, Memory):
- assert(mem_or_size.width <= bus_data_width)
- self.mem = mem_or_size
- else:
- self.mem = Memory(bus_data_width, mem_or_size//(bus_data_width//8), init=init)
- if read_only is None:
- if hasattr(self.mem, "bus_read_only"):
- read_only = self.mem.bus_read_only
- else:
- read_only = False
- ###
- # memory
- port = self.mem.get_port(write_capable=not read_only, we_granularity=8)
- self.specials += port
- if full_memory_we:
- self.specials += FullMemoryWE(self.mem)
- else:
- self.specials += self.mem
- # generate write enable signal
- if not read_only:
- self.comb += [port.we[i].eq(self.bus.cyc & self.bus.stb & self.bus.we & self.bus.sel[i])
- for i in range(4)]
- # address and data
- self.comb += [
- port.adr.eq(self.bus.adr[:flen(port.adr)]),
- self.bus.dat_r.eq(port.dat_r)
- ]
- if not read_only:
- self.comb += port.dat_w.eq(self.bus.dat_w),
- # generate ack
- self.sync += [
- self.bus.ack.eq(0),
- If(self.bus.cyc & self.bus.stb & ~self.bus.ack, self.bus.ack.eq(1))
- ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement