blob: 356cedc8a9668a26d047604af4cafe38d018b28d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
// See LICENSE for license details.
package Chisel
/** A counter module
* @param n number of counts before the counter resets (or one more than the
* maximum output value of the counter), need not be a power of two
*/
class Counter(val n: Int) {
val value = if (n == 1) UInt(0) else Reg(init=UInt(0, log2Up(n)))
/** Increment the counter this cycle. Returns whether the counter is at its
* maximum (and will wrap around on the next inc() call).
*/
def inc(): Bool = {
if (n == 1) {
Bool(true)
} else {
val wrap = value === UInt(n-1)
value := Mux(Bool(!isPow2(n)) && wrap, UInt(0), value + UInt(1))
wrap
}
}
}
/** Counter Object
* Example Usage:
* {{{ val countOn = Bool(true) // increment counter every clock cycle
* val myCounter = Counter(countOn, n)
* when ( myCounter.value === UInt(3) ) { ... } }}}*/
object Counter
{
def apply(n: Int): Counter = new Counter(n)
def apply(cond: Bool, n: Int): (UInt, Bool) = {
val c = new Counter(n)
var wrap: Bool = null
when (cond) { wrap = c.inc() }
(c.value, cond && wrap)
}
}
|