Source code for hwtLib.logic.cntrGray
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import If
from hwt.constants import Time
from hwt.hwIOs.std import HwIOSignal, HwIOVectSignal
from hwt.hwIOs.utils import addClkRstn
from hwt.hwModule import HwModule
from hwt.hwParam import HwParam
from hwt.mainBases import RtlSignalBase
from hwt.pyUtils.typingFuture import override
from hwt.serializer.mode import serializeParamsUniq
from hwt.simulator.simTestCase import SimTestCase
[docs]
def binToGray(sigOrConst) -> RtlSignalBase:
"""
Convert value or signal from binary encoding to gray encoding
"""
return (sigOrConst >> 1) ^ sigOrConst
#width = sigOrConst._dtype.bit_length()
#return Concat(sigOrConst[width - 1],
# sigOrConst[width - 1:0] ^ sigOrConst[width:1])
[docs]
@serializeParamsUniq
class GrayCntr(HwModule):
"""
Counter for gray code
.. hwt-autodoc::
"""
@override
def hwConfig(self):
self.DATA_WIDTH = HwParam(4)
self.INIT_VAL = HwParam(0) # binary
@override
def hwDeclr(self):
addClkRstn(self)
self.en = HwIOSignal()
self.dataOut = HwIOVectSignal(self.DATA_WIDTH)._m()
@override
def hwImpl(self):
binCntr = self._reg("cntr_bin_reg", self.dataOut._dtype, self.INIT_VAL)
self.dataOut(binToGray(binCntr))
If(self.en,
binCntr(binCntr + 1)
)
[docs]
class GrayCntrTC(SimTestCase):
[docs]
@classmethod
@override
def setUpClass(cls) -> HwModule:
cls.dut = GrayCntr()
cls.compileSim(cls.dut)
[docs]
def test_count(self):
dut = self.dut
dut.en._ag.data.append(1)
self.runSim(170 * Time.ns)
self.assertValSequenceEqual(dut.dataOut._ag.data,
[
0b0000,
0b0001,
0b0011,
0b0010,
0b0110,
0b0111,
0b0101,
0b0100,
0b1100,
0b1101,
0b1111,
0b1110,
0b1010,
0b1011,
0b1001,
0b1000,
])
if __name__ == "__main__":
import unittest
testLoader = unittest.TestLoader()
suite = testLoader.loadTestsFromTestCase(GrayCntrTC)
runner = unittest.TextTestRunner(verbosity=3)
runner.run(suite)
from hwt.synth import to_rtl_str
print(to_rtl_str(GrayCntr()))