Source code for hwtLib.logic.lfsr
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import Xor, Concat
from hwt.constants import Time
from hwt.hdl.types.bits import HBits
from hwt.hwIOs.std import HwIOSignal
from hwt.hwIOs.utils import addClkRstn
from hwt.hwModule import HwModule
from hwt.hwParam import HwParam
from hwt.pyUtils.typingFuture import override
from hwt.simulator.simTestCase import SimTestCase
from hwt.synthesizer.vectorUtils import iterBits
from pyMathBitPrecise.bit_utils import get_bit
[docs]
class Lfsr(HwModule):
"""
Linear shift feedback register generator,
form of hardware pseudorandom generator.
.. hwt-autodoc::
"""
@override
def hwConfig(self):
self.POLY_WIDTH = HwParam(8)
self.POLY = HwParam(0x88)
self.INIT = HwParam(1)
@override
def hwDeclr(self):
addClkRstn(self)
self.dataOut = HwIOSignal()._m()
@override
def hwImpl(self):
accumulator = self._reg("accumulator",
HBits(self.POLY_WIDTH),
def_val=self.INIT)
POLY = int(self.POLY)
xorBits = []
for i, b in enumerate(iterBits(accumulator)):
if get_bit(POLY, i):
xorBits.append(b)
assert xorBits
nextBit = Xor(*xorBits)
accumulator(Concat(accumulator[self.POLY_WIDTH - 1:], nextBit))
self.dataOut(accumulator[0])
[docs]
class LfsrTC(SimTestCase):
[docs]
@classmethod
@override
def setUpClass(cls):
cls.dut = Lfsr()
cls.compileSim(cls.dut)
[docs]
def test_simple(self):
self.runSim(300 * Time.ns)
self.assertValSequenceEqual(
self.dut.dataOut._ag.data,
[1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1])
if __name__ == "__main__":
from hwt.synth import to_rtl_str
print(to_rtl_str(Lfsr()))