1.电路原理分析
1)当系统复位时,也就是rst为0时,寄存器inst的清零端失效,即输出端Q为0,那么经过两个与门后,系统输出端posedge和negedge为0,则系统处于复位状态
2)复位结束后,假设输入信号signal在某一时刻由0变为1,因为寄存器的特性,输出端Q只能在下一个时刻发生跳变,所以此时端口1和2为0,所以negedge为0,而端口3连接的是signal信号为1,而端口4是Q端之后取反,所以也为1,故此时posedge为1
3)下降沿原理与上面上升沿原理类似,所以当信号出现上升沿(即信号由0变为1)时,posedge会出现一个时钟周期的“尖峰脉冲”,同样当信号出现下降沿(即信号由1变为0)时,negedge会出现一个时钟周期的“尖峰脉冲”
最后用硬件描述语言去描述该电路即可
2.边沿检测模块程序
代码如下:
module edge_check(
input clk,
input rst_n,
input signal,
output pos_edge,
output neg_edge
);
reg signal_r; //输入信号寄存器
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
signal_r <= 1'b0;
else
signal_r <= signal;
end
assign neg_edge = signal_r & (~signal);
assign pos_edge = signal & (~signal_r);
endmodule
3.仿真测试文件
代码如下:
`timescale 1 ns/ 1 ps
module edge_check_tb();
parameter T = 20;
/********************系统输入**********************/
reg clk;
reg rst_n;
reg signal;
/*********************系统输出*****************/
wire pos_edge;
wire neg_edge;
initial
begin
clk = 1'b0;
rst_n = 1'b0;
signal = 1;
#1000.1 rst_n = 1'b1;
#200 signal = 0;
#200 signal = 1;
#200 signal = 0;
#200 signal = 1;
$stop;
end
always #(T/2) clk = ~clk;
edge_check edge_check(
.rst_n(rst_n),
.clk(clk),
.signal(signal),
.pos_edge(pos_edge),
.neg_edge(neg_edge)
);
endmodule
时序仿真图