题解 | #异步复位同步释放#

异步复位同步释放

https://www.nowcoder.com/practice/9b892b6f75954267b4574b042f8a8d6a

`timescale 1ns/1ns

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

reg rst_n_r,rst_n_r1;
//*************code***********//
always@(posedge clk, negedge rst_n)
if(rst_n == 1'b0) begin
    rst_n_r <= 1'b0;
    rst_n_r1 <= 1'b0;
end
else begin
    rst_n_r <= 1'b1;
    rst_n_r1 <= rst_n_r;
end

always@(posedge clk, negedge rst_n_r1)
if(rst_n_r1 == 1'b0) 
    dout <= 1'b0;
else 
    dout <= d;


/*
always@(posedge clk, negedge rst_n)
if(rst_n == 1'b0) 
    rst_n_r <= 1'b0;
else
    rst_n_r <= 1'b1;

always@(posedge clk, negedge rst_n_r)
if(rst_n_r == 1'b0) begin
    dout <= 1'b0;
end
else if(rst_n_r == 1'b1) begin
    dout <= d;
end
*/
/*
else begin
    dout <= dout;
    rst_n_r <= 1'b0;
end
*/
//*************code***********//
endmodule

注意rst信号一定要打两拍,因为需要确保rst信号拉高(无效)之后,复位信号rst_n_r1也能至少维持一拍有效,等到下一个时钟边沿再拉高(无效),保证寄存器不会在复位撤销的时钟边沿采样

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务