牛客网——同步复位异步释放
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