IC学习笔记4——异步复位,同步释放

一、同步复位和异步复位

1.1 同步复位

同步复位的意思就是当复位信号(rst_n)有效的时候,寄存器在下一个时钟沿到来之后被复位,时钟沿到来之前寄存器还是保持其之前的值。
同步复位信号代码如下所示:

 always_ff @(posedge clk)
  begin
        if (rst_n==1'b0)
        begin
          q2 <= 1'b0;
        end
        else 
        begin
         q2 <=  d2;
        end
  end

综合出来的电路如下所示:
在这里插入图片描述
如上图所示,同步复位电路综合出来之后的电路图,可以看出rst_n使两级寄存器之间的组合逻辑多加了一个与门。

1.2 异步复位

异步复位就是说,当复位信号有效的时候,寄存器立刻被复位,与时钟沿到来与否没有关系。
异步复位信号代码如下所示:

always_ff @(posedge clk or negedge rst_n)
begin
 if(rst_n==1'b0)
  begin
    q2 <= 1'b0;
  end
 else 
 begin
  q2 <= d2;
 end
end 

综合出来的电路如下所示:
在这里插入图片描述
如上图所示,异步复位电路综合出来之后的电路图,综合出来的寄存器自带rst_n pin,所以复位信号不参与中间的组合逻辑。

1.3 同步复位和异步复位的比较

异步复位电路由于对寄存器之间的路径没有贡献,所以在时序上面能够略微比同步复位电路好一些,所以在对逻辑路径抠得很细的设计中,可以使用异步复位来避免引入更多的组合延迟。

同步复位的优势是由于复位信号会最终起作用在寄存器的D输入端,那么通过复位的组合逻辑都会被STA所约束,也就是说复位信号和其他路径的信号一起要满足寄存器的setup time, hold time, min pulse等一系列时序检查。在时序约束的情况下寄存器不会因为复位信号的变化产生亚稳态。而纯粹的异步复位在当前的STA check中是没有办法检查的。

二、Recovery time 和 Removal time

为了解决异步复位没有办法进行STA check,这里我们介绍Recovery time(恢复时间)和Removal time(去除时间)。Recovery time(恢复时间)和Removal time(去除时间)都是相对于复位信号的释放而言的。因为当复位信号有效时,寄存器的值都是稳定在复位值,只要复位信号持续有效,来多少时钟信号,其他路径上的信号怎么变,寄存器的值都不会变化,所以复位信号在什么时候复位都没什么关系。但是复位信号的释放就不一样了,一旦复位信号从有效变为无效,那么寄存器之后的值就得取决于其他信号输入和时钟沿的关系了,所以在这里要详细的介绍Recovery time(恢复时间)和Removal time(去除时间)。

2.1 Recovery time

recovery time指的是复位信号释放之后要求距离下一个时钟沿的最小时间间隔。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步复位信号的释放与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。图形如下图所示。

2.2 Removal time

removal time指的是reset release之后要求距离上一个时钟沿的最小时间间隔。这个时间的意义是,如果保证不了这个去除时间,也就是说异步复位信号的释放与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。图形如下图所示。
在这里插入图片描述

三、异步复位、同步释放

由之前可得,异步复位信号的复位不需要制约,但是异步复位信号的释放需要满足恢复时间和去除时间,如果能把异步复位信号的释放变为同步释放是不是就解决了上述的问题呢?
因此引出了异步复位、同步释放电路,代码如下所示:

   always @ (posedge clk or negedge rst_n)
   begin
    if (rst_n==1'b0) begin
        rst_s1 <= 1'b0;
        rst_s2 <= 1'b0;
    end
    else begin
        rst_s1 <= 1'b1;
        rst_s2 <= rst_s1;
    end
    end

电路图如下所示:
在这里插入图片描述
可以看到,当rst_n有效时,两个flop被异步复位,它们的Q会经过rst-to-q的延时之后立刻发生变化,使得rst_s2有效。
而当rst_n 释放后,rst_s2并不是立刻发生变化,而是要等待clk的时钟沿,并且打两拍之后才能将1传递到rst_s2。因为rst_s2是来自于flop的Q,而Q是经过clk上的同步信号。那为什么要两级flop,还是为了减小产生亚稳态的概率。
对于一个使用异步rst的模块,rst synchronizer是必须的。

  • 11
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!感谢提问。下面是有关 K210 学习笔记五中串口通信的一些内容: 在 K210 开发板上,串口是一种常见的通信接口,用于将数据从一个设备传输到另一个设备。串口通信通常使用 UART (Universal Asynchronous Receiver/Transmitter) 协议。 要在 K210 上进行串口通信,首先需要使用两个引脚:一个用于接收数据(RX),一个用于发送数据(TX)。这些引脚可以通过 GPIO 端口与外部设备连接。 在 K210 的开发环境中,可以使用 MaixPy 或者 Kendryte Standalone SDK 进行串口编程。 在 MaixPy 中,可以使用 `uart` 模块来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```python from machine import UART uart = UART(UART.UART1, 115200) ``` 然后,可以使用 `uart.write()` 函数发送数据,使用 `uart.read()` 函数接收数据。例如: ```python uart.write("Hello, world!\n") data = uart.read(10) ``` 在 Kendryte Standalone SDK 中,可以使用 `uart.h` 头文件中的函数来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```c #include "uart.h" uart_init(UART_DEVICE_1, 115200); ``` 然后,可以使用 `uart_send_data()` 函数发送数据,使用 `uart_receive_data()` 函数接收数据。例如: ```c uart_send_data(UART_DEVICE_1, "Hello, world!\n", 14); char buffer[10]; uart_receive_data(UART_DEVICE_1, buffer, 10); ``` 以上是关于 K210 学习笔记五中串口通信的简要介绍。如果你有更具体的问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值