|
| 1 | +from migen.fhdl.structure import * |
| 2 | +from migen.fhdl.module import Module |
| 3 | +from migen.genlib.cdc import MultiReg |
| 4 | +from migen.genlib.fifo import SyncFIFO |
| 5 | +from migen.genlib.misc import optree |
| 6 | +from migen.bank.description import * |
| 7 | + |
| 8 | +_control_tokens = [0b1101010100, 0b0010101011, 0b0101010100, 0b1010101011] |
| 9 | + |
| 10 | +class ChanSync(Module, AutoReg): |
| 11 | + def __init__(self, nchan=3, depth=8): |
| 12 | + self.char_synced = Signal() |
| 13 | + self.chan_synced = Signal() |
| 14 | + |
| 15 | + self._r_channels_synced = RegisterField(1, READ_ONLY, WRITE_ONLY) |
| 16 | + |
| 17 | + lst_control_starts = [] |
| 18 | + all_control_starts = Signal() |
| 19 | + for i in range(nchan): |
| 20 | + name = "data_in" + str(i) |
| 21 | + data_in = Signal(10, name=name) |
| 22 | + setattr(self, name, data_in) |
| 23 | + name = "data_out" + str(i) |
| 24 | + data_out = Signal(10, name=name) |
| 25 | + setattr(self, name, data_out) |
| 26 | + |
| 27 | + ### |
| 28 | + |
| 29 | + fifo = SyncFIFO(10, depth) |
| 30 | + self.add_submodule(fifo, "pix") |
| 31 | + self.comb += [ |
| 32 | + fifo.we.eq(self.char_synced), |
| 33 | + fifo.din.eq(data_in), |
| 34 | + data_out.eq(fifo.dout) |
| 35 | + ] |
| 36 | + is_control = Signal() |
| 37 | + is_control_r = Signal() |
| 38 | + self.sync.pix += If(fifo.re, is_control_r.eq(is_control)) |
| 39 | + control_starts = Signal() |
| 40 | + self.comb += [ |
| 41 | + is_control.eq(optree("|", [data_out == t for t in _control_tokens])), |
| 42 | + control_starts.eq(is_control & ~is_control_r), |
| 43 | + fifo.re.eq(~is_control | all_control_starts) |
| 44 | + ] |
| 45 | + lst_control_starts.append(control_starts) |
| 46 | + |
| 47 | + self.comb += all_control_starts.eq(optree("&", lst_control_starts)) |
| 48 | + self.sync.pix += If(~self.char_synced, |
| 49 | + self.chan_synced.eq(0) |
| 50 | + ).Elif(all_control_starts, self.chan_synced.eq(1)) |
| 51 | + self.specials += MultiReg(self.chan_synced, self._r_channels_synced.field.w) |
0 commit comments