Advertisement
Guest User

Untitled

a guest
Mar 1st, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. ACTUAL CODE:
  2. class _CommandChooser(Module):
  3. def __init__(self, requests):
  4. self.want_reads = Signal()
  5. self.want_writes = Signal()
  6. self.want_cmds = Signal()
  7. # NB: cas_n/ras_n/we_n are 1 when stb is inactive
  8. self.cmd = CommandRequestRW(flen(requests[0].a), flen(requests[0].ba))
  9.  
  10. ###
  11.  
  12. rr = RoundRobin(len(requests), SP_CE)
  13. self.submodules += rr
  14.  
  15. self.comb += [rr.request[i].eq(req.stb & ((req.is_cmd & self.want_cmds) | ((req.is_read == self.want_reads) | (req.is_write == self.want_writes))))
  16. for i, req in enumerate(requests)]
  17.  
  18. stb = Signal()
  19. self.comb += stb.eq(Array(req.stb for req in requests)[rr.grant])
  20. for name in ["a", "ba", "is_read", "is_write", "is_cmd"]:
  21. choices = Array(getattr(req, name) for req in requests)
  22. self.comb += getattr(self.cmd, name).eq(choices[rr.grant])
  23. for name in ["cas_n", "ras_n", "we_n"]:
  24. # we should only assert those signals when stb is 1
  25. choices = Array(getattr(req, name) for req in requests)
  26. self.comb += If(self.cmd.stb, getattr(self.cmd, name).eq(choices[rr.grant]))
  27. self.comb += self.cmd.stb.eq(stb \
  28. & ((self.cmd.is_cmd & self.want_cmds) | ((self.cmd.is_read == self.want_reads) \
  29. & (self.cmd.is_write == self.want_writes))))
  30.  
  31. self.comb += [If(self.cmd.stb & self.cmd.ack & (rr.grant == i), req.ack.eq(1))
  32. for i, req in enumerate(requests)]
  33. self.comb += rr.ce.eq(self.cmd.ack)
  34.  
  35. USING DATAFLOW:
  36. class _LiteDRAMCommandChooser(Module):
  37. def __init__(self, bank_cmds):
  38. self.want_reads = Signal()
  39. self.want_writes = Signal()
  40. self.want_cmds = Signal()
  41. a = flen(bank_cmds[0].a)
  42. ba = flen(banks_cmds[0]ba)
  43. self.cmd = Source(dram_bank_cmd_description)
  44. ###
  45.  
  46. nbank = len(bank_cmds)
  47.  
  48. rr = RoundRobin(nbank, SP_CE)
  49. mux = Multiplexer(dram_bank_cmd_description(a, ba), nbank)
  50. self.submodules += rr, mux
  51. for i, bank_cmd in enumerate(bank_cmds):
  52. self.comb += [
  53. rr.request[i].eq(
  54. bank_cmd.stb &
  55. ( (bank_cmd.is_cmd & self.want_cmds) |
  56. (bank_cmd.is_read & self.want_reads) |
  57. (bank_cmd.is_write & self.want_writes)
  58. )
  59. ),
  60. getattr(mux, "sink"+str(i)).eq(bank_cmd)
  61. ]
  62. self.comb += rr.ce.eq(self.cmd.stb & self.cmd.ack)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement