1
0
Fork 0
rocket-chip/src/main/scala/util/ClockDivider.scala

50 lines
1.2 KiB
Scala

// See LICENSE.Berkeley for license details.
package util
import Chisel._
/** This black-boxes a Clock Divider by 2.
* The output clock is phase-aligned to the input clock.
* If you use this in synthesis, make sure your sdc
* declares that you want it to do the same.
*
* Because Chisel does not support
* blocking assignments, it is impossible
* to create a deterministic divided clock.
*/
class ClockDivider2 extends BlackBox {
val io = new Bundle {
val clk_out = Clock(OUTPUT)
val clk_in = Clock(INPUT)
}
}
class ClockDivider3 extends BlackBox {
val io = new Bundle {
val clk_out = Clock(OUTPUT)
val clk_in = Clock(INPUT)
}
}
/** Divide the clock by power of 2 times.
* @param pow2 divides the clock 2 ^ pow2 times
* WARNING: This is meant for simulation use only. */
class Pow2ClockDivider(pow2: Int) extends Module {
val io = new Bundle {
val clock_out = Clock(OUTPUT)
}
if (pow2 == 0) {
io.clock_out := clock
} else {
val dividers = Seq.fill(pow2) { Module(new ClockDivider2) }
dividers.init.zip(dividers.tail).map { case (last, next) =>
next.io.clk_in := last.io.clk_out
}
dividers.head.io.clk_in := clock
io.clock_out := dividers.last.io.clk_out
}
}