牛客网——同步复位异步释放

verilog企业真题 VL74 异步复位同步释放

1)同步复位指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。

module load_syn_ff(clk,in,out,load,rst_n);
input    clk,in,load,rst_n;
output    out;
always@(posedge clk)
    if(!rst_n)
        out <= 1'b0;
    else if(load)
        out <= in;
endmodule

同步复位虽然解决了当时钟的有效沿来临的时候rst的边沿也正好来临所出现的冒险与竞争。但是从综合的电路上可以看出,多了一个组合逻辑MUX。

如果设计中所有的复位都是这样的,那会增加很多的资源,导致芯片面积很大,而异步复位同步释放机制可以解决这一问题。

 

2)异步复位:指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。

module load_syn_ff(clk,in,out,load,rst_n);
input    clk,in,load,rst_n;
output    out;
always@(posedge clk or negedge rst_n)
    if(!rst_n)
        out <= 1'b0;
    else if(load)
        out <= in;
endmodule

倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。

 

3)异步复位同步释放:指复位信号产生时不受时钟信号的控制,但是释放的时候受到时钟信号的同步。主要目的是防止复位信号释放时候产生亚稳态。

 异步复位:当复位信号拉低时,直接进入复位状态。

 同步释放:当复位信号释放时,加入两级同步缓存器,电路不会立即释放,而是同步到时钟有效时再进行释放。

`timescale 1ns/1ns

module ali16(
input clk,
input rst_n,
input d,
output reg dout
 );

//*************code***********//
reg rst0,rst1;
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        rst0 <= 0;
        rst1 <= 0;
    end
    else begin
        rst0 <= 1;
        rst1<= rst0;
    end
end

always@(posedge clk or negedge rst1) begin
    if(!rst1) begin
        dout <= 1'b0;
    end
    else begin
        dout <= d;
    end
end

//*************code***********//
endmodule

 

 

 

posted @ 2023-08-26 19:44  super_sweet  阅读(48)  评论(0编辑  收藏  举报