FPGA----同步复位OR异步复位?

1. 简介

本文是根据Clifford的文档《Synchronous Resets? Asynchronous Resets?I am so confused!How will I ever know which to use?》写下的一篇学习报告。

本文将研究同步和异步复位的优缺点。 然后,它将查看每种类型的复位的使用情况,然后提出正确使用每种类型的建议。

2.同步复位&异步复位

在这里插入图片描述

3.同步复位

顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。
复位的编码样式应该是if / else优先级样式。

module ctr8sr ( q, co, d, ld, rst_n, clk);
output [7:0] q;
output co;
input [7:0] d;
input ld, rst_n, clk;
reg [7:0] q;
reg co;
always @(posedge clk)
if (!rst_n) {co,q} <= 9'b0; // sync reset
else if (ld) {co,q} <= d; // sync load
else {co,q} <= q + 1'b1; // sync increment
endmodule

Example 3a - Verilog code for a loadable counter with synchronous reset

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ctr8sr is
port (
clk : in std_logic;
rst_n : in std_logic;
d : in std_logic;
ld : in std_logic;
q : out std_logic_vector(7 downto 0);
co : out std_logic);
end ctr8sr;
architecture rtl of ctr8sr is
signal count : std_logic_vector(8 downto 0);
begin
co <= count(8);
q <= count(7 downto 0);
process (clk)
begin
if (clk'event and clk = '1') then
if (rst_n = '0') then
count <= (others => '0'); -- sync reset
elsif (ld = '1') then
count <= '0' & d; -- sync load
else
count <= count + 1; -- sync increment
end if;
end if;
end process;
end rtl;

Example 3b - VHDL code for a loadable counter with synchronous reset
Figure 3 - Loadable counter with synchronous reset

3.1编码风格和示例电路

3.1.1准则1

== 复位不是敏感度列表的一部分。如示例4a 4b==

对于Verilog,省略灵敏度列表中的复位是使复位同步的原因。
对于VHDL,省略灵敏度列表中的复位并在“if clk’event和clk = 1”语句之后,其他赋值语句之间进行复位操作。

module sync_resetFFstyle (q, d, clk, rst_n);
output q;
input d, clk, rst_n;
reg q;
always @(posedge clk)
if (!rst_n) q <= 1'b0;
else q <= d;
endmodule

Example 4a - Correct way to model a flip-flop with synchronous reset using Verilog

library ieee;
use ieee.std_logic_1164.all;
entity syncresetFFstyle is
port (
clk : in std_logic;
rst_n : in std_logic;
d : in std_logic;
q : out std_logic);
end syncresetFFstyle;
architecture rtl of syncresetFFstyle is
begin
process (clk)
begin
if (clk'event and clk = '1') then
if (rst_n = '0') then
q <= '0';
else
q <= d;
end if;
end if;
end process;
end rtl;

Example 4b - Correct way to model a flip-flop with synchronous reset using VHDL

3.1.2准则2

每个Verilog程序块或VHDL过程应该只模拟一种类型的触发器。

当编码两个触发器时,应该将两个触发器放进单独的always模块中。

module badFFstyle (q2, d, clk, rst_n);
output q2;
input d, clk, rst_n;
reg q2, q1;
always @(posedge clk)
if (!rst_n) q1 <= 1'b0;
else begin
q1 <= d;
q2 <= q1;
end
endmodule

Example 1a - Bad Verilog coding style to model dissimilar flip-flops

library ieee;
use ieee.std_logic_1164.all;
entity badFFstyle is
port (
clk : in std_logic;
rst_n : in std_logic;
d : in std_logic;
q2 : out std_logic);
end badFFstyle;
architecture rtl of badFFstyle is
signal q1 : std_logic;
begin
process (clk)
begin
if (clk'event and clk = '1') then
if (rst_n = '0') then
q1 <= '0';
else
q1 <= d;
q2 <= q1;
end if;
end if;
end process;
end rtl;

Example 1b - Bad VHDL coding style to model dissimilar flip-flops

在例1a的Verilog代码和例1b的VHDL代码中,触发器用于捕获数据,然后其输出通过跟随触发器。 该设计的第一阶段通过同步复位进行复位。 第二级是跟随器触发器并且没有复位,但是因为在相同的程序块/过程中推断出两个触发器,所以复位信号rst_n将用作第二次触发器的数据使能。 这种编码风格将产生无关的逻辑,如图1所示。
Figure 1 - Bad coding style yields a design with an unnecessary loadable flip-flop
对跟随器触发器建模的正确方法是使用如示例2a中所示的两个Verilog过程块或如示例2b中所示的两个VHDL过程。 这些编码样式将生成如图2所示的逻辑。

module goodFFstyle (q2, d, clk, rst_n);
output q2;
input d, clk, rst_n;
reg q2, q1;
always @(posedge clk)
if (!rst_n) q1 <= 1'b0;
else q1 <= d;
always @(posedge clk)
q2 <= q1;
endmodule

Example 2a - Good Verilog coding style to model dissimilar flip-flops

library ieee;
use ieee.std_logic_1164.all;
entity goodFFstyle is
port (
clk : in std_logic;
rst_n : in std_logic;
d : in std_logic;
q2 : out std_logic);
end goodFFstyle;
architecture rtl of goodFFstyle is
signal q1 : std_logic;
begin
process (clk)
begin
if (clk'event and clk = '1') then
if (rst_n = '0') then
q1 <= '0';
else
q1 <= d;
end if;
end if;
end process;
process (clk)
begin
if (clk'event and clk = '1') then
q2 <= q1;
end if;
end process;
end rtl;

Example 2b - Good VHDL coding style to model dissimilar flip-flops
在这里插入图片描述
应当注意,由示例1a和示例1b中的代码生成的外来逻辑仅是使用同步复位的结果。 如果使用异步复位方法,则两种编码样式将合成相同的设计而无需任何额外的组合逻辑。 不同触发器样式的生成很大程度上取决于HDL代码中使用的灵敏度列表和if-else语句。

3.2同步复位的优点

1.同步复位将合成较小的触发器,特别是如果使用产生d输入的逻辑门控复位
2.同步复位通常可确保电路100%同步。
3.同步复位确保复位只能在有效时钟边沿发生。 时钟用作小复位毛刺的滤波器; 但是,如果这些毛刺发生在有效时钟边沿附近,则触发器可能会变成亚稳态。

3.3同步复位的缺点

多消耗了组合逻辑资源,复位时间不能太短,否则复位不完全;

4.异步复位

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

4.1编码风格和示例电路

示例5a的Verilog代码和示例5b的VHDL代码示出了对异步复位触发器进行建模的正确方法。

4.1.1准则1

复位是敏感度列表的一部分。 对于Verilog,将重置添加到灵敏度列表是使重置异步的原因。

4.1.2准则2

只有时钟和复位信号可以在灵敏度列表中。
如果包含其他信号(合法的Verilog,非法的Verilog RTL综合编码方式),仿真模型对于触发器来说是不正确的,并且Synopsys在读取合成模型时会报告错误。
对于VHDL,复位操作应该在clk’event and clk = '1语句之前。

module async_resetFFstyle (q, d, clk, rst_n);
output q;
input d, clk, rst_n;
reg q;
// Verilog-2001: permits comma-separation
// @(posedge clk, negedge rst_n)
always @(posedge clk or negedge rst_n)
if (!rst_n) q <= 1'b0;
else q <= d;
endmodule

Example 5a - Correct way to model a flip-flop with asynchronous reset using Verilog

library ieee;
use ieee.std_logic_1164.all;7
entity asyncresetFFstyle is
port (
clk : in std_logic;
rst_n : in std_logic;
d : in std_logic;
q : out std_logic);
end asyncresetFFstyle;
architecture rtl of asyncresetFFstyle is
begin
process (clk, rst_n)
begin
if (rst_n = '0') then
q <= '0';
elsif (clk'event and clk = '1') then
q <= d;
end if;
end process;
end rtl;

Example 5b - Correct way to model a flip-flop with asynchronous reset using VHDL

4.2使用异步复位和异步设置建模Verilog触发器

关于在Verilog中建模异步复位,这里应该另外注意一下。 如果没有设计人员的帮助,在Verilog中包含异步设置和异步复位的触发器的仿真模型可能无法正确模拟。 通常,大多数同步设计没有包含异步设置和异步复位的触发器,但在这种情况下需要这样的触发器。 示例6的编码样式可用于校正Verilog RTL仿真,其中复位和置位同时被置位并且首先移除复位。
首先请注意,问题只是模拟问题而不是综合问题(综合用异步设置/复位推断出正确的触发器)。模拟问题是由于仅在集合,复位或时钟信号的有效边沿上输入的始终块。如果复位变为有效,然后设置变为有效,则如果复位变为无效,则触发器应首先进入复位状态,然后进入置位状态。由于这两个输入都是异步的,一旦复位被移除,该组应该是有效的,但在Verilog中不会出现这种情况,因为在下一个上升时钟沿之前无法触发始终阻塞。
对于那些允许同时置位复位和置位并且首先移除复位的罕见设计,此模拟问题的解决方案是使用translate_off / translate_on指令中包含的自校正代码对触发器进行建模并强制执行输出到这个条件的正确值。这里最好的建议是尽可能避免需要使用异步设置和异步复位的触发器的条件。示例6中的代码显示了将正确模拟并确保合成前和合成后模拟之间匹配的修复。此代码使用translate_off / translate_on指令强制正确输出异常条件[4]。

// Good DFF with asynchronous set and reset and self-
// correcting set-reset assignment
module dff3_aras (q, d, clk, rst_n, set_n);
output q;
input d, clk, rst_n, set_n;
reg q;
always @(posedge clk or negedge rst_n or negedge set_n)
if (!rst_n) q <= 0; // asynchronous reset
else if (!set_n) q <= 1; // asynchronous set
else q <= d;
// synopsys translate_off
always @(rst_n or set_n)
if (rst_n && !set_n) force q = 1;
else release q;
// synopsys translate_on
endmodule

Example 6 – Verilog Asynchronous SET/RESET simulation and synthesis model

4.3异步复位的优点

1.使用异步复位的最大优点是,只要供应商库具有异步重置触发器,数据路径就可以保证干净。
由于插入逻辑以处理同步复位,推动数据路径时序限制的设计无法在数据路径中增加门和额外的净延迟。 当然,如果供应商库具有带有同步复位输入的触发器,并且设计人员可以让Synopsys实际使用这些引脚,那么这个论点就不成立。 使用异步复位,设计人员保证不会将重置添加到数据路径。 示例7中的代码推断出不会添加到数据路径的异步重置。
2.有利于异步复位的另一个优点是可以在存在或不存在时钟的情况下复位电路。

  module ctr8ar ( q, co, d, ld, rst_n, clk);
    output [7:0] q;
    output co;
    input [7:0] d;
    input ld, rst_n, clk;
    reg [7:0] q;
    reg co;
    always @(posedge clk or negedge rst_n)
    if (!rst_n) {co,q} <= 9'b0; // async reset
    else if (ld) {co,q} <= d; // sync load
    else {co,q} <= q + 1'b1; // sync increment
    endmodule

Example 7a- Verilog code for a loadable counter with asynchronous reset

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ctr8ar is
port (
clk : in std_logic;
rst_n : in std_logic;
d : in std_logic;
ld : in std_logic;
q : out std_logic_vector(7 downto 0);
co : out std_logic);
end ctr8ar;
architecture rtl of ctr8ar is
signal count : std_logic_vector(8 downto 0);
begin
co <= count(8);
q <= count(7 downto 0);
process (clk)
begin
if (rst_n = '0') then
count <= (others => '0'); -- sync reset
elsif (clk'event and clk = '1') then
if (ld = '1') then
count <= '0' & d; -- sync load
else
count <= count + 1; -- sync increment
end if;
end if;
end process;
end rtl;

Example 7b- VHDL code for a loadable counter with asynchronous reset

在这里插入图片描述

4.4异步复位的缺点

1.不利于时序约束,
2.复位也容易受到毛刺影响,从而造成亚稳态

5异步复位问题

如果复位的释放发生在时钟边沿或接近时钟边缘,那么FPGA或ASIC将会发生什么,以使触发器变为亚稳态。

当使用同步复位时,复位的前沿和后沿都必须远离时钟的有效边缘。如图5所示,异步复位信号将与时钟信号异步解除断言。这种情况存在两个潜在的问题:
(1)违反复位恢复时间
(2)针对不同顺序元件在不同时钟周期中发生复位移除。
在这里插入图片描述

5.1重置恢复时间

复位恢复时间是指复位取消复位与时钟信号再次变为高电平之间的时间。
Verilog-2001标准[17]有三个内置命令来建模和测试恢复时间和信号删除时序检查:$ recovery,$ removal和$ recrem(后者是恢复和删除时序检查的组合)。
恢复时间也称为表格的tsu设置时间,“在CLK↑之前的PRE或CLR无效设置时间”[1]。 缺少恢复时间会导致已注册数据输出的信号完整性或亚稳态问题。

5.2重置移除

当复位移除与时钟上升沿异步时,复位信号和时钟信号之一或两者中的传播延迟的微小差异可能导致某些寄存器或触发器在其他寄存器或触发器之前退出复位状态。

6.0复位同步器

准则:使用异步复位的每个ASIC都应包含一个复位同步器电路!

如果没有复位同步器,即使复位在仿真期间工作,最终系统中异步复位的有效性也是无效的。
图6的复位同步器逻辑旨在利用异步和同步复位样式中的最佳功能。

在这里插入图片描述
外部复位信号异步复位一对主复位触发器,它们又通过复位缓冲树异步驱动主复位信号到设计中的其余触发器。 整个设计将异步重置。
通过取消置位复位信号来完成复位移除,然后允许第一主复位触发器(其为高电平)的d输入通过复位同步器进行时钟控制。 复位移除后通常需要两个时钟上升沿同步去除主复位。
需要两个触发器来使复位信号与时钟脉冲同步,其中第二触发器用于消除可能由复位信号异步移除且太靠近上升时钟边沿引起的任何亚稳态。 如4.4节所述,这些同步触发器必须远离扫描链。
在这里插入图片描述
现在仔细研究时序表明,复位分配时序是clk-to-q传播延迟,通过复位分配树的总延迟以及满足目标寄存器和触发器的复位恢复时间的总和,如图所示 在图7中。
复位同步器电路的代码如例8所示。

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

Example 8a - Properly coded reset synchronizer using Verilog

library ieee;
use ieee.std_logic_1164.all;
entity asyncresetFFstyle is
port (
clk : in std_logic;
asyncrst_n : in std_logic;
rst_n : out std_logic);
end asyncresetFFstyle;
architecture rtl of asyncresetFFstyle is
signal rff1 : std_logic;
begin
process (clk, asyncrst_n)
begin
if (asyncrst_n = '0') then
rff1 <= '0';
rst_n <= '0';
elsif (clk'event and clk = '1') then
rff1 <= '1';
rst_n <= rff1;
end if;
end process;
end rtl;

Example 8b - Properly coded reset synchronizer using VHDL

7.复位分配树

复位分配树几乎与时钟分配树一样受到关注,因为在典型的数字设计中,复位输入负载通常与时钟输入负载一样多,如图8所示。复位树的时序要求 对于同步和异步重置样式都很常见。
在这里插入图片描述
时钟分配树和复位分配树之间的一个重要区别是需要密切平衡分布式复位之间的偏差。 与时钟信号不同,复位信号之间的偏移并不重要,只要与任何复位信号相关的延迟足够短以允许在一个时钟周期内传播到所有复位负载并仍然满足所有目标寄存器和触发器的恢复时间。
必须注意根据clk-q-reset树时序分析时钟树时序。 对复位树进行计时(同步或异步复位)的最安全方法是从时钟树的叶子时钟为内部主复位触发器提供时钟,如图9所示。如果这种方法符合时序,则寿命为 好。 在大多数情况下,没有足够的时间让时钟脉冲遍历时钟树,为复位驱动触发器提供时钟,然后让复位遍历复位树,所有这些都在一个时钟周期内完成。
Figure 9 - Reset tree driven from a delayed, buffered clock
为了帮助加速复位到达所有系统触发器,复位驱动器触发器以早期时钟计时,如图10所示。必须进行后布局时序分析以确保异步的复位释放 复位,同步复位的断言和释放都没有超过触发器的时钟;
意味着重置不得违反设置并保持触发器。 在布局完成并且两棵树的实际时间可用之前,通常不会进行这样的详细时序调整。
在这里插入图片描述

8.复位 - 毛刺滤波

如本文前面所述,异步复位的一个最大问题是它们是异步的,因此带有一些必须根据复位源处理的特性。 通过异步复位,任何足以满足触发器最小复位脉冲宽度的输入都将导致触发器复位。 如果复位线受到毛刺,这可能是一个真正的问题。 这里介绍的是一种可以过滤毛刺的方法,但它很难看!
该解决方案要求数字延迟(意味着延迟将随温度,电压和过程而变化)以滤除小毛刺。
复位输入焊盘也应该是施密特触发焊盘,以帮助进行毛刺滤波。 图11显示了这种方法的实现。
在这里插入图片描述
为了增加延迟,一些供应商提供了可以手动实例化的延迟硬宏。如果没有这样的延迟宏,设计人员可以在优化后手动将延迟实例化到合成设计中 - 记住在插入延迟后不优化该块或将其删除。当然,元素可能没有触及应用的属性以防止它们被移除。
第二种方法是在模块中实例化慢缓冲区,然后多次实例化该模块以获得所需的延迟。许多变化可能会扩展到这个概念。设计者必须研究系统要求以确定是否需要延迟。

9. DFT用于异步复位

将设计测试(DFT)功能应用于设计是一个两步过程。首先,将设计中的翻转触发器拼接成可从外部I / O引脚访问的扫描链,这称为扫描插入。扫描链通常不是功能设计的一部分。其次,运行软件程序以生成一组扫描向量,当应用于扫描链时,将测试和验证设计。该软件程序称为自动测试程序生成或ATPG。扫描矢量的主要目的是提供铸造矢量,用于晶片和模具的制造测试以及最终封装部件的测试。应用ATPG向量来创建测试的过程基于:
1.将已知状态扫描到芯片中的所有触发器中,
2.将触发器从扫描移位模式切换到功能数据输入模式,
3.应用一个功能时钟,
4.在触摸下一个测试向量时,将触发器切换回扫描移位模式以扫描出一个功能时钟的结果。
DFT过程通常需要两个控制引脚。将设计置于“测试模式”。该引脚用于屏蔽不可测试的逻辑,例如内部生成的异步复位,异步组合反馈环路以及需要特别注意的许多其他逻辑条件。在整个测试过程中,该引脚通常保持不变。第二个控制引脚是移位使能引脚。为了使ATPG矢量工作,测试程序必须能够控制芯片中扫描链上触发器的所有输入。这不仅包括时钟和数据,还包括复位引脚(同步异步)。如果直接从I / O引脚驱动复位,则复位保持在非复位状态。如果在内部产生复位,则通过测试模式信号将主内部复位保持在非复位状态。如果在ATPG期间没有屏蔽掉内部产生的复位,则在扫描期间可能发生复位条件,导致芯片中的触发器复位,从而丢失正在扫描的矢量数据。
即使异步复位保持为ATPG的非复位状态,这也不意味着复位/设置不能作为DFT过程的一部分进行测试。在使用测试模式锁定复位并生成ATPG向量之前,可以手动生成一些向量以创建复位/设置测试向量。测试DFT异步复位所需的过程非常简单,可能会使用一些DFT工具自动完成。如果扫描工具未自动测试异步重置/设置,则必须手动设置它们。手动测试异步重置/集的基本步骤如下:
1.扫描所有的扫描链
2.发出并释放异步复位
3.扫描结果并扫描全零
4.发出并解除重置
5.扫描结果
6.将复位输入设置为非复位状态,然后应用ATPG生成的矢量。
此测试方法将扫描异步复位和集合的测试。这些手动生成的矢量将被添加到ATPG矢量中,以便为制造测试提供更高的故障覆盖率。如果设计使用具有同步复位输入的触发器,则稍微修改上述手动异步复位测试将对同步复位环境进行类似的测试。在应用重置时,添加功能时钟的上述步骤。所有其他步骤将保持不变。
对于本文讨论的复位同步器电路,两个同步器触发器不应包含在扫描链中,而应使用上面讨论的手动过程进行测试。

10.多时钟复位问题

对于多时钟设计,应为每个时钟域使用单独的异步复位同步器电路和复位分配树。 这样做是为了确保确实可以保证复位信号满足每个时钟域中每个寄存器的复位恢复时间。
如前所述,异步复位断言不是问题。 问题是在移除重置后正常移除所有逻辑的复位和同步启动。
根据设计的限制,可以采用两种技术:
(1)非协调复位移除。
(2)复位移除的顺序协调。

在这里插入图片描述

10.1非协调复位移除

对于许多多时钟设计,与在另一个时钟域中移除复位时相比,在一个时钟域内移除复位的时间并不重要。通常在这些设计中,跨越时钟边界的任何控制信号都通过某种类型的请求 - 确认握手序列,并且从一个时钟域到另一个时钟域的延迟确认不会导致硬件的无效执行。对于这种类型的设计,如图12所示创建单独的异步复位同步器就足够了,并且可以按任何顺序移除arst_n,brst_n和crst_n这一事实对设计来说并不重要。

10.2重置移除的顺序协调

对于某些多时钟设计,必须按顺序排序复位。对于这种类型的设计,可能需要创建如图13所示的优先级异步复位同步器,以确保在bclk逻辑之前移除复位后激活所有aclk域逻辑,bclk逻辑也必须在cclk逻辑变为活动之前激活。
在这里插入图片描述
对于这种类型的设计,只有最高优先级的异步复位同步器输入接高电平。其他异步复位同步器输入与来自较高优先级时钟域的主复位相关联。

11.多ASIC复位同步

有些设计有多个ASIC,需要在所有多个ASIC上精确同步复位消除。满足此类设计的一种方法,如本节所述,是使用不同的异步复位同步方案,只需要一个复位移除触发器,而不是6.0节中描述的两个触发器,再加上数字校准同步延迟以正确地从多个ASIC中排除重置。
考虑数字存储示波器(DSO)上数据采集板的实际设计。
从基本的角度来说,DSO是一种测试仪器,可以探测模拟信号,持续进行信号的采样和模数(A2D)转换,并尽可能快地将采样的数字数据连续存储到存储器中。在所请求的触发条件发生之后,将与触发条件相关联的其余数据存储到存储器中,然后DSO控制逻辑(通常是商用微处理器)访问数据并将数据值的波形绘制到屏幕上以进行视觉检查。对于这种类型的实际设计,数据采集板包含四个数字解复用器(demux)ASIC,每个ASIC捕获四分之一的数据样本以发送到存储器,如图14所示。
在这里插入图片描述
对于这种数字采集系统,一旦复位被移除,ASIC就必须开始捕获数据并生成存储器地址以将数据写入存储器。数据采集​​和地址生成都在持续运行,捕获数据样本并覆盖先前写入的存储器位置,直到触发电路导致地址计数器停止并保持最近捕获的数据。通常,触发器被设置为保持并显示90%的波形作为预触发数据,并将10%的波形显示为后触发数据。由于通常不可能预测触发何时发生,因此必须在复位移除之后连续获取数据,直到触发信号停止数据采集为止。
在此设计中用于进行高速数据采集的方法是使用四个解复用ASIC来捕获数字化波形的每四个点。由于解复用ASIC通常以非常快的时钟速率运行,并且由于每个解复用ASIC还必须生成伴随的地址计数值以将数据样本存储到存储器,因此所有四个解复用ASIC以正确的顺序启动它们各自的地址计数器是很重要的。确保存储在存储器中的数据样本可以轻松读回以在DSO显示器上绘制波形。
这种设计的问题是同时准确地从四个ASIC器件中移除复位信号(在相同的相对时钟周期内),以便四个ASIC捕获对应于地址#0的正确顺序数据样本。所有四个ASIC,其次是所有四个ASIC上的地址#1等,以便数据
存储到存储器的内存可以按照正确的顺序从存储器中读取(在触发DSO之后),以在DSO屏幕上显示准确的波形。
对于这种类型的设计,有许多因素会妨碍正确的复位 – 移除,从而正确排序写入存储器的数据值。首先,对于非常高速的设计(DSO通常是非常高速的设计,以便在探测其他高速电路时捕获足够数量的数据样本),到四个ASIC的复位信号的相对电路板走线长度将具有要保持非常严格的宽容;因此,电路板布局是一个问题。
其次,制造的ASIC批次内或之间的工艺变化可能产生超过超短ASIC时钟周期的延迟。选择在制造期间插入的四个ASIC可以导致选择具有不同相对延迟的四个器件放置在同一数据采集板上。无法保证放置在电路板上的四个ASIC的相对处理速度(四个ASIC中哪一个永远是最快的?谁知道!)
第三,不同测试环境中的温度波动也会增加延迟的差异。 DSO机箱内ASIC的相对定位可能会导致该高速系统的温度差异很大。
第四,去除DSO的盖子以对原型进行故障排除可能会导致四个ASIC的温度变化不同于盖子关闭时的温度变化。对于实际设计,公共复位信号(reset_n)被路由到所有四个解复用ASIC以断言复位,但复位信号没有从解复用ASIC中解除复位。使用单独的同步信号来标记每个解复用ASIC上的复位移除许可。
在这里插入图片描述
使用图15中所示的逻辑处理多ASIC复位移除同步逻辑。该逻辑对于主ASIC和从ASIC都是通用的。
置位复位(图15中的rst_n变为低电平)异步复位主复位信号mstrrst_n,后者通过复位树驱动到所有ASIC(主ASIC和从ASIC)上的其余可复位逻辑;因此,重置是异步和立即的。
每个ASIC都有三个专用于复位 - 移除同步的引脚。每个ASIC上的第一个引脚是专用的主/从选择引脚。当该引脚接高电平时,ASIC进入主模式。当引脚接低电平时,ASIC进入从机模式。每个ASIC上的第二个引脚是sync_out引脚。在从属ASIC上,sync_out引脚未使用并且悬空。当复位被移除时(当reset_n变为高电平时),主ASIC产生sync_out脉冲。 sync_out信号由主ASIC驱动,并通过电路板跟踪连接与主ASIC和从ASIC上的sync_in输入相连。 sync_out引脚是控制主ASIC和从ASIC上复位消除的引脚。
每个ASIC上的第三个引脚是sync_in引脚。 sync_in引脚是输入引脚,用于控制主ASIC和从ASIC上的复位消除。 sync_in信号连接到可编程延迟模块,然后通过复位输入上的高电平启用,然后传递给同步复位移除触发器。 ASIC上的下一个上升时钟沿将导致同步移除复位,允许每个ASIC上的地址计数器以同步和有序的方式开始计数。
如前所述,问题是确保sync_in信号以正确的顺序消除四个ASIC上的复位。

Figure 16 - Programmable digital delay block diagram
可编程数字延迟模块,如图16所示,是一组延迟级,与每个延迟级输出串联,驱动下一个延迟级输入和多路复用器上的输入。延迟级可以是简单的缓冲器,也可以是成对的逆变器。选择的延迟级数等于几乎三个ASIC时钟周期。
处理器接口用于对延迟选择寄存器进行编程,这使得多路复用器选择线能够选择哪个延迟的sync_in信号(sdly0到sdly15)将被驱动到多路复用器输出并用于去除ASIC上的复位。
为了确定每个ASIC的正确延迟设置,采用了软件数字校准技术。
为了帮助校准解复用ASIC以及数据采集板上的其他模拟器件,该板设计用于通过数据采集路径捕获可选择的板载斜坡信号。斜坡信号用于校准四个解复用ASIC上的延迟。
在图17-图19中,软件可编程数字校准程序仅显示四个demux ASIC中的两个。
在这里插入图片描述
ASIC #2ASIC#1的初始延迟设置为11(将sdly11信号驱动到多路复用器输出)。 ASIC#2被给予另一个延迟设置,并且数据采集板捕获斜坡信号。如果ASIC#2上的延迟设置太小,例如如图17所示的0-4的延迟值,则与ASIC#1采样的数据点相比,ASIC#2捕获的斜坡值将被提前采样。这由ASIC#2捕获的每个斜坡数据点大于ASIC#1捕获的下一个数据点的事实表明。
如果ASIC#2上的延迟设置在正确的范围内,例如图18所示的延迟值5-11,那么与采样的数据点相比,ASIC#2捕获的斜坡值将以正确的顺序进行采样通过ASIC#1。这由以下事实表明:ASIC#2捕获的每个斜坡数据点大于ASIC#1捕获的先前数据点并且小于ASIC#1捕获的下一个数据点。如果ASIC#2上的延迟设置太大,例如如图19所示的12-15的延迟值,则ASIC#2捕获的斜坡值将与ASIC#1采样的数据点相比较晚采样。这表现在ASIC#2捕获的每个斜坡数据点小于ASIC#1捕获的下一个数据点这一事实。
一旦确定了ASIC#2的正确范围,该范围中的中心点被选择为ASIC#2 sync_in延迟设置。中心点是该范围内最安全的设置,因为此设置大约是复位移除同步触发器的前一个和下一个上升时钟沿之间的半个周期。
在确定正确的ASIC#2设置之后,必须确定围绕初始设置的正确ASIC#1范围(图17中使用11的设置)以找到正确的ASIC#1中点设置。在确定正确的ASIC#1设置之后,使用类似的过程来找到ASIC#3的正确延迟设置,然后进行查找ASIC#4的正确设置。
在这里插入图片描述
在这里插入图片描述
在数字校准之后,不需要使用第二个复位移除同步触发器,因为中间时钟设置用于确保满足触发器恢复时间并确保不会出现亚稳态问题。
图20显示了四重解复用ASIC设计的完整框图,其中每个ASIC上有主/从引脚和sync_in / sync_out引脚以及它们的连接方式。
在这里插入图片描述
在实际设计中,在为其中一个数据采集原型板上的四个ASIC确定一组有效的中点延迟设置后,将这些值编程到ROM中,并用作所有制造电路板的初始设置和初始设置的变化。 跟踪设置。 有趣的是,每块电路板的校准延迟值很少从初始数据采集原型板的原始设置向上或向下偏离一个或两个以上的延迟级。

12.结论

使用异步复位是保证可靠复位断言的最可靠方法。 虽然异步复位是可靠地重置电路的安全方法,但是如果不正确地执行,则移除异步复位可能会导致严重问题。
使用异步复位进行设计的正确方法是添加复位同步器逻辑,以允许异步复位设计并确保同步复位移除以允许安全恢复正常设计功能。
只要在测试期间可以控制异步复位,仍然可以使用DFT进行异步复位。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值