【问题标题】:Simple SR Latch Simulation in VHDL(with Xilinx) doesn't oscillateVHDL(使用 Xilinx)中的简单 SR 锁存器仿真不振荡
【发布时间】:2017-10-14 15:03:17
【问题描述】:

我了解到,当 S 和 R 都为“0”时,SR-Latch 确实会振荡,而在下面的电路 VHDL 代码中它们只是“1”。

这里是 SRLATCH 的 VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity SRLATCH_VHDL is
port(
        S : in STD_LOGIC;
        R : in STD_LOGIC;
        Q : inout STD_LOGIC;
        NOTQ: inout STD_LOGIC);
end SRLATCH_VHDL;

architecture Behavioral of SRLATCH_VHDL is
begin

process(S,R,Q,NOTQ)
    begin
        Q <= R NOR NOTQ;
        NOTQ<= S NOR Q;
end process;

end Behavioral;

以下是Testbench代码中的过程及其仿真结果

   -- Stimulus process
   stim_proc: process
   begin        
    S <= '1'; R <= '0'; WAIT FOR 100NS;
    S <= '0'; R <= '0'; WAIT FOR 100NS;
    S <= '0'; R <= '1'; WAIT FOR 100NS;
    S <= '0'; R <= '0'; WAIT FOR 100NS;
    S <= '1'; R <= '1'; WAIT FOR 500NS;
   end process;

我完全不知道为什么模拟不能反映......


(点击放大)

【问题讨论】:

  • 您没有提供Minimal, Complete and Verifiable example 演示振荡,您提供的刺激也没有这样做。解决方法是平衡延迟,从而赢得胜利。这相当于提供了一个共识术语。在时钟触发器中,这是建立和保持时间的来源,也是使用主从触发器的动力。我们正在处理丢失的数字设计艺术和零门延迟的抽象。
  • 如果您要为 Q 和 NOTQ 的分配添加统一延迟:Q &lt;= R NOR NOTQ after 1 ns; NOTQ &lt;= S NOR Q after 1 ns; 并在相同的增量周期中在 S 和 R 上提供“0”到“1”的转换(没有干预WAIT)您可以演示oscillation,而无需显示增量周期或导致超出最大增量周期数的波形显示。

标签: vhdl xilinx


【解决方案1】:

问得好,你的教练是对的 - 如果 S 和 R 在“同一”时间释放,这个电路就会振荡。您的问题是您的 TB 没有这样做,但这个却做到了:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity TOP is
end entity TOP;

architecture A of TOP is
  signal S,R,Q,NOTQ: std_logic;

  component SRLATCH_VHDL is
    port(
      S    : in    std_logic;
      R    : in    std_logic;
      Q    : inout std_logic;
      NOTQ : inout std_logic);
  end component SRLATCH_VHDL;

begin
  U1 : SRLATCH_VHDL port map(S, R, Q, NOTQ);

  process is
  begin
    S <= '1';
    R <= '1';
    wait for 10 ns;
    S <= '0';
    R <= '0';
    wait;
  end process;
end architecture A;

这将产生无限的增量延迟振荡:

这不是演示异步行为的好方法,因为您正在有效地简化电路的物理性质,并使用 VHDL 调度程序来显示存在问题(使用“增量延迟”)。一个更好的方法是通过添加信号延迟来模拟真实的电路行为(这正是您的工具在为时序仿真进行反向注释时所做的事情)。使用after 查找信号分配,以及传输延迟和惯性延迟之间的差异。如果您绘制电路图,您会发现如果SR 都在一个“小”时间窗口中释放,并且不允许在第二次控制之前完成电路周围的信号传播,则会出现问题信号变化。您现在需要编写一个测试平台,在此时间窗口内更改 SR

您设计的几乎所有东西都将是异步的,与您的 SR 电路完全相同。只有确保输入信号不会同时发生变化,我们才能使电路“同步”。计时工具的工作是告诉我们“相同”的实际含义:当您获得一份报告或数据表值给您设置或保持时间时,那么该数字只是“不一样”的数字版本。

【讨论】:

    【解决方案2】:

    有人在教你错误的知识!

    SR 和 RS 基本触发器(也称为锁存器)不会振荡。 S = R = 1(禁止)的问题是你不知道离开S = R = 1后的状态,因为你永远不能同时去S = R = 0(保存)。您将通过S = 1; R = 0(设置)或S = 0; R = 1(重置)将S = R = 1 转换为S = R = 0。这将在您到达 save 状态之前触发 setreset 操作。

    请注意,VHDL 以离散时间进行仿真,并且每次运行都会重现相同的仿真结果。您不能(轻松)模拟导致每次模拟运行时不同信号延迟的物理效应。

    顺便说一句。你的VHDL描述也是错误的。 QNOTQ 是模式 out,而不是 inout。使用支持 VHDL-2008(允许回读输出端口)的适当模拟器或使用中间信号。

    【讨论】:

    • 非常感谢 :) 我的意思是在 S=R=1 之后,S=R=0 状态会发生振荡!我解决了这个问题。正如你回答我的那样,这只是关于 isim 的事情。时间尺度与isim中的'0'几乎相同,因此存在迭代限制'10000'的isim错误!我通过延迟行为定义解决了这个问题:)再次感谢你:)
    • OP 告诉你将s &lt;= '0'; r &lt;= '0'; wait for 100 ns; 嫁接到s &lt;= '1'; r &lt;= '1'; wait for 500 ns; 之后的现有stim_proc 的末尾会导致增量周期振荡-simulation stopped by --stop-delta。 OP 的问题并没有证明没有提供Minimal, Complete and Verifiable example 的问题,您也没有回答解决他与轶事相关的问题。
    • 对 Q 和 NOTQ 具有相同的分配延迟,您可以获得显示振荡的波形。当 S 和 R 都为“1”时,使延迟失衡,一方获胜。有一个使用共识术语的简单方法 - google hazard logicEarle latch(一个 D 锁存器,具有防止振荡的共识术语,IBM 的 J. G. Earle)。没有什么本质上禁止 S 和 R 同时从“1”变为“0”。在物理实现中,它可能很少发生,但确实会发生,通常表示建立或保持时间违规。路由往往会导致延迟失衡。
    • 时钟触发器的一般治疗方法是使用主从触发器,其中设置和保持时间可以严格表征。
    • @paebbels:您应该考虑修复此答案或将其删除。真实(和模拟)电路确实显示出亚稳态输出行为,包括实际振荡,正是出于这个原因——这就是亚稳态的全部意义所在。这种情况持续多长时间取决于 IIRC、相关输出级的增益带宽积,因此高度依赖于技术,但它总是会发生。
    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多