上升沿检测电路的原理:输入信号d,经过一拍的延迟后,产生delay信号,将dout=d&(~delay)的结果当作是有上升沿的标志,结果为1则检测到上升沿。从波形图上理解就是下图这样。
三条红线处检测到的上升沿,故输出dout是1.
我的代码如下
//rtl代码
module r_edge (
d,
clk,
rstn,
dout
);
input d,clk, rstn;
output dout;
reg d_delay;
//reg dout;
assign dout=d&(~d_delay); //描述组合逻辑
always@(posedge clk or negedge rstn) //描述时序逻辑
begin
if(~rstn)
d_delay<=0;
else
d_delay <= d;
end
endmodule
在写testbench测试时,发现d触发器部分的代码,由于需要建立保持时间,我就人为的延迟了0.1ns,仿真代码如下。
//testbench代码
`timescale 1ns/100ps
module tb ();
reg clk, rstn,d;
wire dout;
parameter clk_period=10;
r_edge U_edge(
.clk(clk),
.rstn(rstn