FPGA学习日记(6)同步复位与异步复位

该博客介绍了同步复位和异步复位的概念及其在FPGA设计中的实现。同步复位只在时钟上升沿有效,确保了数据在稳定时钟边沿转换,而异步复位则在复位信号下降沿即生效,不受时钟控制,可用于快速响应系统复位需求。文中通过Verilog代码示例展示了两种复位方式如何影响信号延迟和系统状态。

同步复位就是指复位信号只有在时钟上升沿到来时,才能有效

module flip_flop
(   input wire sys_clk,
    input wire sys_rset_n,
    input wire key_in,
    
    output reg led_out

);

always@(posedge sys_clk )//上升沿,同步复位
    if(sys_rset_n == 1'b0)
        led_out<= 1'b0;
    else 
        led_out<= key_in;
endmodule

仅在时钟信号的上升沿时刻  led_out=key_in  延迟一个单位

测试文件

`timescale 1ns/1ns 
module tb_flip_flop();
reg sys_clk;
reg sys_rset_n;
reg key_in;

wire led_out;

initial 
    begin
        sys_clk=1'b1;
        sys_rset_n<=1'b0;
        key_in=1'b0;
        #20
        sys_rset_n<=1'b1;
        #210
        sys_rset_n<=1'b0;
        #40
        sys_rset_n<=1'b1;
    end

always #10 sys_clk=~sys_clk;

always #20 key_in<={$random}%2;

initial 
    begin
        $timeformat(-9,0,"ns",6);  //时间尺度10e-9ns,小数点后位数0,   打印的最小数字字符
        $monitor("@time %t:key_in=%b led_out=%b ",$time,key_in,led_out);
    end
    
flip_flop flip_flop_inst
(
    .sys_clk(sys_clk),
    .sys_rset_n(sys_rset_n),
    .key_in(key_in),
    
    .led_out(led_out)
);


endmodule

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

module flip_flop
(   input wire sys_clk,
    input wire sys_rset_n,
    input wire key_in,
    
    output reg led_out

);

always@(posedge sys_clk or negedge sys_rset_n)//时钟上升沿或者复位信号的下降沿执行,异步复位
    if(sys_rset_n == 1'b0)
        led_out<= 1'b0;
    else 
        led_out<= key_in;
endmodule

寄存器一次延迟

led_out 为key_in延迟一次,在复位信号有效时,上升沿到来,led_out=key_in,并延迟一个单位,在复位信号的下降沿,led_out=key_in,为低电平。

直到复位信号再次变为高电平后,等待时钟信号的上升沿时刻,led_out=key_in,延迟一个时间单位并保持。

FPGA设计中,同步复位异步复位是两种常见的复位信号设计方式,它们的区别如下: ### 复位生效条件 - **同步复位**:同步复位信号触发器的时钟同步,只有在时钟的跳变沿到来之后才会生效。例如,在Verilog代码中,使用`always@(posedge clk)`块来描述同步复位逻辑,只有当时钟信号`clk`的上升沿到来时,才会检查复位信号`rst_n`的状态,如果`rst_n`为低电平,则执行复位操作。代码示例如下: ```verilog always@(posedge clk) begin if(!rst_n) begin // 复位操作 end end ``` - **异步复位**:异步复位信号受时钟信号的约束,只要复位信号有效,无论时钟处于什么状态,触发器都会立即复位。在Verilog代码中,使用`always@(posedge clk or negedge rst_n)`块来描述异步复位逻辑,当复位信号`rst_n`的下降沿到来时,触发器会立即复位,而需要等待时钟的跳变沿。代码示例如下: ```verilog always@(posedge clk or negedge rst_n) begin if(!rst_n) begin // 复位操作 end else begin // 正常逻辑操作 end end ``` ### 电路实现资源利用 - **同步复位**:同步复位通常会使综合后的电路更加规则,因为所有的复位操作都在时钟的控制下进行。但可能会增加一些额外的逻辑门,因为需要在时钟的跳变沿进行复位判断,这可能会消耗更多的FPGA资源。 - **异步复位**:异步复位的电路实现相对简单,因为它需要等待时钟信号,能够更快地响应复位信号。但异步复位可能会引入一些亚稳态问题,因为复位信号的撤销可能时钟信号同步。 ### 可靠性稳定性 - **同步复位**:由于同步复位依赖于时钟信号,因此在时钟信号稳定的情况下,复位操作更加可靠。它可以避免由于复位信号的毛刺而导致的误复位,因为只有在时钟的跳变沿才会检查复位信号。 - **异步复位**:异步复位能够快速响应复位信号,在系统出现异常时可以及时将电路复位。但由于异步复位信号时钟信号同步,在复位信号撤销时可能会导致触发器进入亚稳态,影响系统的稳定性。 ### 可测试性 - **同步复位**:同步复位便于进行时序分析和测试,因为所有的复位操作都时钟信号相关,可以通过控制时钟信号来精确控制复位的时机。 - **异步复位**:异步复位的测试相对复杂,因为复位信号的撤销可能会引入亚稳态问题,需要采取额外的措施来保证测试的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值