X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fnmutil%2Flatch.py;fp=src%2Fnmutil%2Flatch.py;h=84235ffada66bb4b69249e585970e5097e939277;hb=4241aad8550d189a4aff51a0ecba9777347ac3bf;hp=0000000000000000000000000000000000000000;hpb=504b32c5d5ac7e86604802ed25a25fc5ae521003;p=nmutil.git diff --git a/src/nmutil/latch.py b/src/nmutil/latch.py new file mode 100644 index 0000000..84235ff --- /dev/null +++ b/src/nmutil/latch.py @@ -0,0 +1,100 @@ +from nmigen.compat.sim import run_simulation +from nmigen.cli import verilog, rtlil +from nmigen import Signal, Module, Const, Elaboratable + +""" jk latch + +module jk(q,q1,j,k,c); +output q,q1; +input j,k,c; +reg q,q1; +initial begin q=1'b0; q1=1'b1; end +always @ (posedge c) + begin + case({j,k}) + {1'b0,1'b0}:begin q=q; q1=q1; end + {1'b0,1'b1}: begin q=1'b0; q1=1'b1; end + {1'b1,1'b0}:begin q=1'b1; q1=1'b0; end + {1'b1,1'b1}: begin q=~q; q1=~q1; end + endcase + end +endmodule +""" + +def latchregister(m, incoming, outgoing, settrue): + reg = Signal.like(incoming) # make register same as input. reset is OK. + with m.If(settrue): + m.d.sync += reg.eq(incoming) # latch input into register + m.d.comb += outgoing.eq(incoming) # return input (combinatorial) + with m.Else(): + m.d.comb += outgoing.eq(reg) # return input (combinatorial) + + +class SRLatch(Elaboratable): + def __init__(self, sync=True, llen=1): + self.sync = sync + self.llen = llen + self.s = Signal(llen, reset=0) + self.r = Signal(llen, reset=(1<