def __init__(self, port, depth): self.sink = Sink(dmatpl(depth)) self.source = Source(D_LAST) self.busy = Signal() self.pos = Signal(max=depth, reset=0) self.pos_next = Signal(max=depth, reset=0) self.ct = Signal(max=depth, reset=0) self.ct_next = Signal(max=depth) self.comb += [ self.ct_next.eq(self.ct), self.pos_next.eq(self.pos), port.adr.eq(self.pos_next), ] self.sync += [ self.pos.eq(self.pos_next), self.ct.eq(self.ct_next) ] self.submodules.fsm = FSM() self.fsm.act("IDLE", self.busy.eq(0), If(self.sink.stb, self.busy.eq(1), self.sink.ack.eq(1), self.pos_next.eq(self.sink.payload.start), self.ct_next.eq(self.sink.payload.count-1), NextState('d'), ) ) self.fsm.act("d", self.busy.eq(1), self.source.stb.eq(1), self.source.payload.d.eq(port.dat_r), If(self.ct == 0, self.source.payload.last.eq(1)), If(self.source.ack, If(self.ct, _inc(self.pos, depth, self.pos_next), self.ct_next.eq(self.ct - 1), ).Else( NextState("IDLE") ) ) )
def __init__(self): self.source = Source(dmatpl(1024)) SimActor.__init__(self, _deferred_src_gen())