Advertisement
Guest User

Untitled

a guest
May 26th, 2014
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.26 KB | None | 0 0
  1. class SRAM(Module):
  2.     def __init__(self, mem_or_size, read_only=None, init=None, bus=None, full_memory_we=False):
  3.         if bus is None:
  4.             bus = Interface()
  5.         self.bus = bus
  6.         bus_data_width = flen(self.bus.dat_r)
  7.         if isinstance(mem_or_size, Memory):
  8.             assert(mem_or_size.width <= bus_data_width)
  9.             self.mem = mem_or_size
  10.         else:
  11.             self.mem = Memory(bus_data_width, mem_or_size//(bus_data_width//8), init=init)
  12.         if read_only is None:
  13.             if hasattr(self.mem, "bus_read_only"):
  14.                 read_only = self.mem.bus_read_only
  15.             else:
  16.                 read_only = False
  17.    
  18.         ###
  19.    
  20.         # memory
  21.         port = self.mem.get_port(write_capable=not read_only, we_granularity=8)
  22.         self.specials += port
  23.         if full_memory_we:
  24.             self.specials += FullMemoryWE(self.mem)
  25.         else:
  26.             self.specials += self.mem
  27.         # generate write enable signal
  28.         if not read_only:
  29.             self.comb += [port.we[i].eq(self.bus.cyc & self.bus.stb & self.bus.we & self.bus.sel[i])
  30.                 for i in range(4)]
  31.         # address and data
  32.         self.comb += [
  33.             port.adr.eq(self.bus.adr[:flen(port.adr)]),
  34.             self.bus.dat_r.eq(port.dat_r)
  35.         ]
  36.         if not read_only:
  37.             self.comb += port.dat_w.eq(self.bus.dat_w),
  38.         # generate ack
  39.         self.sync += [
  40.             self.bus.ack.eq(0),
  41.             If(self.bus.cyc & self.bus.stb & ~self.bus.ack, self.bus.ack.eq(1))
  42.         ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement