自定义上升沿检测
class RisingEdgeDetector extends Module {
val io = IO(new Bundle {
val inSig = Input(Bool())
val outSig = Output(Bool())
val clock = Input(Clock())
})
// 定义 risingedge 函数
def risingedge(x: Bool): Bool = x && !RegNext(x)
// 使用 risingedge 函数检测上升沿
io.outSig := risingedge(io.inSig)
// Chisel 会为 RegNext 自动生成一个寄存器来保存 inSig 的值
// 并在下一个时钟周期提供这个值
}
实现主程序
package hello
import chisel3.{Clock, _}
class RisingEdgeDetector extends Module {
val io = IO(new Bundle {
val inSig = Input(Bool())
val outSig = Output(Bool())
})
// 定义 risingedge 函数
def risingedge(x: Bool): Bool = x && !RegNext(x)
// 使用 risingedge 函数检测上升沿
io.outSig := risingedge(io.inSig)
// Chisel 会为 RegNext 自动生成一个寄存器来保存 inSig 的值
// 并在下一个时钟周期提供这个值
}
class risingedge extends Module {
val io = IO(new Bundle {
val detectedRisingEdge = Output(Bool()) // IO names will be the same
val someBoolSignal = Input(Bool()) // (without 'io_' in prefix)
})
// 创建 RisingEdgeDetector 模块的实例
val detector = Module(new RisingEdgeDetector)
// 连接输入和输出
detector.io.inSig := io.someBoolSignal // 这里的 someBoolSignal 应该是你的设计中的一个 Bool 类型的信号
io.detectedRisingEdge := detector.io.outSig // 这将是一个 Bool 类型的信号,表示上升沿的检测结果
}
object risingedgeMain extends App {
(new chisel3.stage.ChiselStage).emitVerilog(new risingedge(), Array("--target-dir", "generated"))
}
运行以上chisel,生成Verilog如下
module RisingEdgeDetector(
input clock,
input io_inSig,
output io_outSig
);
reg _T; // @[risingedge.scala 11:48]
wire _T_1 = ~_T; // @[risingedge.scala 11:40]
assign io_outSig = io_inSig & _T_1; // @[risingedge.scala 14:13]
always @(posedge clock) begin
_T <= io_inSig;
end
endmodule
module risingedge(
input clock,
input reset,
output io_detectedRisingEdge,
input io_someBoolSignal
);
wire detector_clock; // @[risingedge.scala 26:24]
wire detector_io_inSig; // @[risingedge.scala 26:24]
wire detector_io_outSig; // @[risingedge.scala 26:24]
RisingEdgeDetector detector ( // @[risingedge.scala 26:24]
.clock(detector_clock),
.io_inSig(detector_io_inSig),
.io_outSig(detector_io_outSig)
);
assign io_detectedRisingEdge = detector_io_outSig; // @[risingedge.scala 29:25]
assign detector_clock = clock;
assign detector_io_inSig = io_someBoolSignal; // @[risingedge.scala 28:21]
endmodule