所谓边缘检测(又名沿提取),便是检测输入信号的上升沿和下降沿。在规划数字体系时,边缘检测是一种很重要的思维,实践编程时用的最多的时序电路应该便是边缘检测电路和分频电路了。
那么,边缘检测电路该怎么完成呢?
咱们知道,在always块的灵敏信号列表中能够直接用posedge和negedge来提取上升沿和下降沿,可是假如要在always程序块的内部检测上升沿或许下降沿呢?仍是用poesedge和negedge吗?显然是不能够的,由于这样的句子不行归纳,我在QuartusII中尝试了,编译时提示 ”multiple event control statements not supported for synthesis !“,意思便是不行归纳。实践上,posedge和negedge只能用在always块的灵敏信号列表中或许testbench中,所以咱们仍是通过其他的办法来完成吧。
要完成边缘检测,最直接的主意是用两级寄存器,第二级寄存器锁存住某个时钟上升沿到来时的输入电平,榜首级寄存器锁存住下一个时钟沿到来时的输入电平,假如这两个寄存器锁存住的电平信号不同,就阐明检测到了边缘,详细是上升沿仍是下降沿能够通过组合逻辑来完成。如下图所示:
图1 用两级寄存器完成边缘检测
上图运用 block 图表明的,也能够用verilog编写出来,代码如下:
//边缘检测电路 //2014/12/10 module edge_cap ( input clk, rst_n, input pulse, output pos_edge, output neg_edge ); reg pulse_r1, pulse_r2; always @ (posedge clk or negedge rst_n) if(!rst_n) begin pulse_r1 <= 1'b0; pulse_r2 <= 1'b0; end else begin pulse_r1 <= pulse; pulse_r2 <= pulse_r1; end assign pos_edge = (pulse_r1 && ~pulse_r2) ?1:0; assign neg_edge = (~pulse_r1 && pulse_r2) ?1:0; endmodule
当检测到上升沿时, pos_edge信号输出一个时钟周期的高电平; 检测到下降沿时,neg_edge输出一个时钟周期的高电平。
乍一看,这个电路好像很简单地完成了边缘检测的功用,可是仔细分析就能够发现这种办法存在一个潜在的危险:当待测信号pulse是一个异步信号时,输出或许是亚稳态,假如pulse信号的改动刚好产生在clk时钟的树立时刻和坚持时刻之内,那么榜首级寄存器的输出 pulse_r1 就会进入亚稳态,而pulse_r1的亚稳态会当即传递给pos_edge和neg_edge信号,然后使得整个电路的输出进入亚稳态,从而影响下一级电路的正常作业,乃至导致整个体系溃散!
因此,在进行异步信号边缘提取时,不能直接运用上面的这种电路,而应该先将异步信号同步化,一般选用多加一级寄存器的办法来减小亚稳态的产生概率,如下图所示:
图2 异步信号边缘检测
也能够用verilog编写出来,代码如下:
//异步信号边缘检测电路,三级寄存器完成 //2014/12/08 module edge_cap ( input clk, rst_n, input pulse, output pos_edge, output neg_edge ); reg pulse_r1, pulse_r2, pulse_r3; always @ (posedge clk or negedge rst_n) if(!rst_n) begin pulse_r1 <= 1'b0; pulse_r2 <= 1'b0; pulse_r3 <= 1'b0; end else begin pulse_r1 <= pulse; pulse_r2 <= pulse_r1; pulse_r3 <= pulse_r2; end assign pos_edge = (pulse_r2 && ~pulse_r3) ?1:0; assign neg_edge = (~pulse_r2 && pulse_r3) ?1:0; endmodule
通过这样的同步处理后, 能够大大减小电路进入亚稳态的概率,假如榜首级寄存器进入了亚稳态,一般也会在一个clk周期内安稳下来(或许安稳为0也或许安稳为1),如下图所示:
图中pulse信号的改动刚好产生在 clk 的树立时刻和坚持时刻之内,因此榜首级寄存器的输出pulse_r1或许会进入亚稳态,图中Tco为榜首级寄存器pulse_r1的状况树立时刻(即clock to output),一般情况下,亚稳态的决断时刻(即从进入亚稳态到安稳下来的时刻)不会超越一个时钟周期,因此在下一个clk上升沿到来之前,pulse_r1现已安稳下来(或许安稳到0也或许安稳到1),这样第二级寄存器就会收集到一个安稳的状况,然后把亚稳态约束在第二级寄存器之前,确保了整个电路输出的安稳性。
综上所述,在异步信号边缘检测电路中,至少需求选用三级寄存器来完成,在对体系安稳性要求较高的数字体系中,能够选用更多级的寄存器来减小亚稳态产生概率,进步体系安稳性。