From f6456b0c57ff9b8040e838fe185dce4b067ec85f Mon Sep 17 00:00:00 2001 From: Kia <kia@special-circumstanc.es> Date: Tue, 2 Feb 2021 15:36:19 -0700 Subject: [PATCH] getting closer --- gearbox.py | 98 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 33 deletions(-) diff --git a/gearbox.py b/gearbox.py index 8f03f8a..a48036c 100755 --- a/gearbox.py +++ b/gearbox.py @@ -1,23 +1,66 @@ from nmigen import * +from nmigen.hdl.rec import * + from nmigen.cli import main -class ArbitraryGearbox(Elaboratable): # non-registered - def __init__(self, i_width, o_width): - self.i_width = i_width - self.o_width = o_width +class GearboxBusLayout(Layout): + def __init__(self, *, in_width, out_width): + super().__init__([ + # DATA + ("data_in", unsigned(in_width)), # FROM SOURCE + ("data_out", unsigned(out_width)), # TO DEST + + # CONTROL + ("valid_in", 1), # FROM SOURCE + ("ready_out", 1), # TO SOURCE + + ("ready_in", 1), # FROM DEST + ("valid_out", 1), # TO DEST + + ]) + +class GearboxBus(Record): + def __init__(self, *, in_width, out_width): + super().__init__(GearboxBusLayout(in_width=in_width, out_width=out_width)) + +class ArbitraryGearbox(Elaboratable): + def __init__(self, *, in_width, out_width): + self.in_width = in_width + self.out_width = out_width - self.upstream_data_in = Signal(self.i_width) - self.downstream_data_out = Signal(self.o_width) + self.bus = GearboxBus(in_width=in_width, out_width=out_width) def elaborate(self, platform): m = Module() + loop = Signal(1) + len_storage = self.in_width + self.out_width + #storage = Signal(len_storage, reset=0b001_010_011_100_101_110_111) + #storage = Signal(len_storage, reset= 0b111_110_101_100_011_010_001) + + + storage = Signal(len_storage, reset= 0b100_000_000_000_000_000_000) - len_storage = self.i_width + self.o_width - storage = Signal(len_storage) write_ptr = Signal(range(len_storage)) - read_ptr = Signal(range(len_storage)) + read_ptr = Signal(range(len_storage), reset=2) + + # read index logic here + with m.If(read_ptr + self.out_width >= len_storage): + m.d.sync += read_ptr.eq(read_ptr + self.out_width - len_storage) + m.d.comb += loop.eq(1) + with m.Else(): + m.d.sync += read_ptr.eq(read_ptr + self.out_width) + + # read-out case analysis here: + + with m.If(read_ptr + self.out_width <= len_storage): + m.d.comb += self.bus.data_out.eq(storage.bit_select(read_ptr, self.out_width)) + with m.Else(): + m.d.comb += self.bus.data_out.eq(storage.bit_select(read_ptr, len_storage - self.out_width)) + + + return m @@ -25,38 +68,27 @@ class ArbitraryGearbox(Elaboratable): # non-registered class DummyPlug(Elaboratable): - def elaborate(self, platform): - m = Module() - egg = RegisteredSkidBuffer(8) - m.submodules += egg - cntr = Signal(8) - intctr = Signal(8) - data_in = Signal(8) - m.d.sync += intctr.eq(intctr +1) - m.d.comb += egg.upstream_data_in.eq(data_in) + #def __init__(self): - upstream_valid = Signal(1) - m.d.comb += egg.upstream_valid_in.eq(upstream_valid) - m.d.comb += upstream_valid.eq(1) - downstream_ready = Signal(1) - m.d.comb += egg.downstream_ready_in.eq(downstream_ready) - m.d.comb += downstream_ready.eq(1) - m.d.comb += data_in.eq(cntr) - with m.If((intctr == 4) | (intctr == 5) | (intctr == 6)): - m.d.comb += downstream_ready.eq(0) -# with m.If((intctr == 4) | (intctr == 5)): -# m.d.comb += upstream_valid.eq(0) -# m.d.comb += data_in.eq(0) - with m.If(egg.upstream_ready_out == 1): - m.d.sync += cntr.eq(cntr+1) + def elaborate(self, platform): + m = Module() + + m.submodules.table = table = ArbitraryGearbox(in_width=(21-3), out_width=3) + counter = Signal(8) + m.d.sync += counter.eq(counter+1) + + with m.If(counter == 3): + m.d.comb += table.bus.data_in.eq(1) return m + if __name__ == '__main__': baka =DummyPlug() - main(baka) \ No newline at end of file + main(baka) + #platform.build(DummyPlug()) -- GitLab