本文共 1588 字,大约阅读时间需要 5 分钟。
在IC系统中,复位的目的是为了将芯片强制到一个已知的状态。同步复位与异步复位都能达到这个目的,但它们在工作原理上有明显的区别。
同步复位需要时钟信号有效沿到达寄存器之前才能起作用,这意味着在没有时钟信号的情况下,复位无法正常工作。这种设计在基于周期的仿真器中特别常见,因为它能有效地过滤掉复位信号的毛刺。然而,同步复位在实际应用中也存在一些缺点。复位信号需要通过复位树从上至下传播,这会导致复位路径的延迟较大。此外,如果在总线上出现反射或噪声,可能会引发短路问题,这时就需要额外的上电复位电路来解决。
异步复位与同步复位相比,不依赖时钟信号就能工作。这种设计无需时钟,简化了电路结构,减少了复位延迟对总线的影响。然而,异步复位也存在一些缺点。复位信号的毛刺需要通过特殊电路来消除,否则可能会导致寄存器状态异常。此外,异步复位的无效沿与时钟信号之间必须保持严格的时间序(recovery和removal)。综合来看,异步复位的优势在于不依赖时钟,但其复位毛刺处理和时序要求使得实际应用中需要额外考虑。
为了结合同步复位和异步复位的优点,工程师常采用混合的方式。通常,先通过强制驱动异步复位到同步器,再通过同步器输出至下一个阶段。这种设计既保证了复位信号的有效性,又避免了异步复位的时序问题。以下图展示了一种典型的复位同步器设计,外部的复位信号输入后,经过同步器处理后再传递到寄存器。
复位同步器的工作原理如下:当复位信号低电平有效时,同步器内的两个寄存器都会被置为低电平状态,输出复位信号会立即有效,无需等待时钟信号。只有当复位信号恢复高电平时,才需要等待时钟信号的跳变,才能确保输出信号的无效沿与时钟同步。这一设计巧妙地解决了异步复位时序问题,同时仍然能保证复位信号的高效传递。
以下是实现复位同步器的典型代码示例:
module async_resetFFstyle2(rst_n, clk, asyncrst_n); output rst_n; input clk, asyncrst_n; reg rst_n, rff1; always @(posedge clk or negedge asyncrst_n) if (!asyncrst_n) { rst_n, rff1 <= 2'b0; } else { rst_n, rff1 <= {rff1, 1'b1}; }endmodule
在实际应用中,复位信号的毛刺仍然是一个需要关注的问题。为了解决这一问题,可在输入复位信号前加入去毛刺电路。以下是一个常见的去毛刺方法:
// 去掉复位信号的毛刺always @(posedge clk_i) global_rst_dly3, global_rst_dly2, global_rst_dly1 <= {global_rst_dly2, global_rst_dly1, rst_n_hw};always @(posedge clk_i) global_rst_n_no_glitch <= global_rst_dly3 | global_rst_dly2 | global_rst_dly1;
这是一个基于时钟自带的去毛刺电路,其核心原理是通过延迟多个时钟周期,以确保复位信号稳定后再传播到各个使用的部件。
此外,确保上电复位电路的稳定性也非常重要。特别是在多个总线上使用复位信号时,需要预留足够的延迟和缓冲区,以防止晶振尚未稳定或锁相环未完全启动的时期所引起的总线冲突。
总结来说,综合考虑信号的时序、延迟以及电路复杂度,选择合适的复位方式至关重要。在实际设计中,需要根据具体需求和场景权衡同步复位和异步复位的优缺点,以达到最佳的系统性能与稳定性。
转载地址:http://aoviz.baihongyu.com/