Source code for hwtLib.clocking.clkDivider
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import If
from hwt.hdl.constants import Time
from hwt.hdl.types.bits import Bits
from hwt.interfaces.std import Clk
from hwt.interfaces.utils import addClkRstn
from hwt.simulator.simTestCase import SimTestCase
from hwt.synthesizer.unit import Unit
[docs]class ClkDiv3(Unit):
"""
:attention: this clock divider implementation suits well for generating of slow output clock
inside fpga you should use clocking primitives
(http://www.xilinx.com/support/documentation/ip_documentation/clk_wiz/v5_1/pg065-clk-wiz.pdf)
"""
[docs] def _declr(self):
addClkRstn(self)
self.clkOut = Clk()
[docs] def _impl(self):
clk = self.clk
r_cnt = self._sig("r_cnt", Bits(2))
f_cnt = self._sig("f_cnt", Bits(2))
rise = self._sig("rise")
fall = self._sig("fall")
CNTR_MAX = 2
If(self.rst_n._isOn(),
r_cnt(CNTR_MAX),
rise(1),
f_cnt(1),
fall(0)
).Else(
If(clk._onRisingEdge(),
If(r_cnt._eq(CNTR_MAX),
r_cnt(0),
rise(~rise)
).Else(
r_cnt(r_cnt + 1),
)
),
If(clk._onFallingEdge(),
If(f_cnt._eq(CNTR_MAX),
f_cnt(0),
fall(~fall)
).Else(
f_cnt(f_cnt + 1),
)
)
)
self.clkOut((r_cnt != CNTR_MAX) & (f_cnt != CNTR_MAX)) # fall._eq(rise)
[docs]class ClkDiv3TC(SimTestCase):
[docs] def test_oscilation(self):
u = ClkDiv3()
self.prepareUnit(u)
self.runSim(10 * 10 * Time.ns)
expected = [(0, 0),
(20000.0, 1),
(35000.0, 0),
(50000.0, 1),
(65000.0, 0),
(80000.0, 1),
(95000.0, 0)]
self.assertValSequenceEqual(u.clkOut._ag.data,
expected)
if __name__ == "__main__":
from hwt.synthesizer.utils import toRtl
print(toRtl(ClkDiv3()))
import unittest
suite = unittest.TestSuite()
# suite.addTest(ClkDiv3TC('test_oscilation'))
suite.addTest(unittest.makeSuite(ClkDiv3TC))
runner = unittest.TextTestRunner(verbosity=3)
runner.run(suite)