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

异步复位同步释放

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

关于波形读有个问题: 如果同步释放代码这样写

    //异步复位,同步释放
    always @(posedge clk, negedge rst_n) begin
        if(!rst_n) begin
            rstn_reg <= 1'b0;
            rstn_reg_1 <= 1'b0;   
        end
        else begin
            rstn_reg <= 1'b1;
            rstn_reg_1 <= rstn_reg;  
        end
        
    end

在波形图 alt 红色方框处是不是输出dout <= d 等于1 啊

所以同步释放应该这样写

    //异步复位,同步释放
    always @(posedge clk, negedge rst_n) begin
        if(!rst_n) begin
            rstn_reg <= 1'b0;
            rstn_reg_1 <= 1'b0;   
        end
        else begin
            rstn_reg <= rst_n;
            rstn_reg_1 <= rstn_reg;  
        end
        
    end

整体代码

`timescale 1ns/1ns

module ali16(
input clk,
input rst_n,
input d,
output reg dout
 );
    reg rstn_reg, rstn_reg_1;
    
    //异步复位,同步释放
    always @(posedge clk, negedge rst_n) begin
        if(!rst_n) begin
            rstn_reg <= 1'b0;
            rstn_reg_1 <= 1'b0;   
        end
        else begin
            rstn_reg <= rst_n;
            rstn_reg_1 <= rstn_reg;  
        end
        
    end
    
    //同步释放
//     always @(posedge clk) begin
//             rstn_reg_1 <= rstn_reg;       
//     end  
    
    //赋值
    always @(posedge clk, negedge rstn_reg_1) begin
        if(!rstn_reg_1) begin
            dout <= 1'b0;
        end
        else
            dout <= d;
        
    end    

//*************code***********//


//*************code***********//
endmodule
全部评论
我看到一个观点是扇出的原因
点赞 回复 分享
发布于 2024-12-17 16:57 陕西
您好!我觉得那个地方直接写高电平1b'1是对的,因为采用的是打两拍的方式实现的同步释放,所以,在rst_n拉高时,需要经过两个时钟后才能让输出寄存器上的rst信号拉高,这样的话,图示红框中就应该是0啊!这是我自己的想法,也不能保证是对的,只是想跟您探讨下。
点赞 回复 分享
发布于 2022-07-08 20:22

相关推荐

06-26 15:33
青岛工学院 Java
积极的秋田犬要冲国企:他现在邀请我明天面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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