--- /dev/null
+from migen.fhdl.std import *
+from migen.genlib.misc import optree
+from migen.fhdl import verilog
+
+class LFSR(Module):
+ def __init__(self, n_out, n_state=31, taps=[27, 30]):
+ self.ce = Signal()
+ self.o = Signal(n_out)
+
+ ###
+
+ state = Signal(n_state)
+ curval = [state[i] for i in range(n_state)]
+ curval += [0]*(n_out - n_state)
+ for i in range(n_out):
+ nv = optree("^", [curval[tap] for tap in taps])
+ curval.insert(0, nv)
+ curval.pop()
+
+ self.sync += If(self.ce,
+ state.eq(Cat(*curval[:n_state])),
+ self.o.eq(Cat(*curval))
+ )
+
+def _printcode():
+ dut = LFSR(3, 4, [3, 2])
+ print(verilog.convert(dut, ios={dut.ce, dut.o}))
+
+if __name__ == "__main__":
+ _printcode()