Advertisement
mindrunner

Untitled

Apr 3rd, 2015
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.98 KB | None | 0 0
  1. @DecorateModule(InsertReset)
  2. @DecorateModule(InsertCE)
  3.  class LFSR(Module):
  4.  
  5.      def __init__(self, n_out, n_state=31, taps=[27, 30]):
  6.          self.o = Signal(n_out)
  7.  
  8.          ###
  9.  
  10.          state = Signal(n_state)
  11.          curval = [state[i] for i in range(n_state)]
  12.          curval += [0]*(n_out - n_state)
  13.          for i in range(n_out):
  14.              nv = ~optree("^", [curval[tap] for tap in taps])
  15.              curval.insert(0, nv)
  16.              curval.pop()
  17.  
  18.          self.sync += [
  19.              state.eq(Cat(*curval[:n_state])),
  20.              self.o.eq(Cat(*curval))
  21.          ]
  22.  
  23.  
  24.  class NandDmaWriter(Module):
  25.  
  26.      def __init__(self, lasmim, data):
  27.          self._magic = CSRStatus(16)
  28.          self._reset = CSR()
  29.          self._shoot = CSR()
  30.          self.submodules._dma = DMAWriteController(
  31.              dma_lasmi.Writer(lasmim),
  32.              MODE_EXTERNAL)
  33.  
  34.          ###
  35.  
  36.          self.comb += self._magic.status.eq(nandread_magic)
  37.  
  38.          lfsr = LFSR(lasmim.dw)
  39.          self.submodules += lfsr
  40.          self.comb += lfsr.reset.eq(self._reset.re)
  41.          self.data = data
  42.  
  43.          en = Signal()
  44.          en_counter = Signal(lasmim.aw)
  45.          self.comb += en.eq(en_counter != 0)
  46.          self.sync += [
  47.              If(self._shoot.re,
  48.                 en_counter.eq(self._dma.length)
  49.                 ).Elif(lfsr.ce,
  50.                        en_counter.eq(en_counter - 1)
  51.                        )
  52.          ]
  53.  
  54.          self.comb += [
  55.              self._dma.trigger.eq(self._shoot.re),
  56.              self._dma.data.stb.eq(en),
  57.              lfsr.ce.eq(en & self._dma.data.ack),
  58.              # self._dma.data.d.eq(lfsr.o)
  59.              self._dma.data.d.eq(self.data)
  60.          ]
  61.  
  62.      def get_csrs(self):
  63.          return [self._magic, self._reset, self._shoot] + self._dma.get_csrs()
  64.  
  65.  
  66.  class NandDmaReader(Module):
  67.  
  68.      def __init__(self, lasmim, data):
  69.          self._magic = CSRStatus(16)
  70.          self._reset = CSR()
  71.          self._error_count = CSRStatus(lasmim.aw)
  72.          self.submodules._dma = DMAReadController(
  73.              dma_lasmi.Reader(lasmim),
  74.              MODE_SINGLE_SHOT)
  75.  
  76.          self.data = data
  77.  
  78.          ###
  79.  
  80.          self.comb += self._magic.status.eq(nandread_magic)
  81.  
  82.          lfsr = LFSR(lasmim.dw)
  83.          self.lfsr = lfsr
  84.          self.submodules += lfsr
  85.          self.comb += lfsr.reset.eq(self._reset.re)
  86.  
  87.          self.comb += [
  88.              lfsr.ce.eq(self._dma.data.stb),
  89.              self._dma.data.ack.eq(1)
  90.          ]
  91.          err_cnt = self._error_count.status
  92.          self.sync += [
  93.              If(self._reset.re,
  94.                 err_cnt.eq(0)
  95.                 ).Elif(self._dma.data.stb,
  96.                        If(self._dma.data.d != self.data, err_cnt.eq(err_cnt + 1))
  97.                        ),
  98.              self._dma.data.d[0].eq(1)
  99.          ]
  100.  
  101.      def get_csrs(self):
  102.          return [
  103.              self._magic,
  104.              self._reset,
  105.              self._error_count] + self._dma.get_csrs()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement