VHDL中的简单SR锁存器模拟(使用Xilinx)不';不振荡

VHDL中的简单SR锁存器模拟(使用Xilinx)不';不振荡,vhdl,xilinx,Vhdl,Xilinx,我已经了解到,在下面的电路VHDL代码中,当S和R都是“0”时,SR锁存器确实会振荡 这是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 SR

我已经了解到,在下面的电路VHDL代码中,当S和R都是“0”时,SR锁存器确实会振荡

这是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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体SRU VHDL是
港口(
S:标准逻辑;
R:在标准逻辑中;
Q:inout标准逻辑;
NOTQ:inout标准逻辑);
结束sru-VHDL;
SRU VHDL的体系结构是
开始
过程(S、R、Q、NOTQ)
开始

有人教你错误的知识

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

请注意,VHDL使用离散时间进行模拟,并且在每次运行时都复制相同的模拟结果。您无法(轻松)模拟每次模拟运行都会导致不同信号延迟的物理效果


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

问题很好,您的导师是对的-如果S和R同时释放,该电路将振荡。你的问题是你的结核病没有做到这一点,但这一个做到了:

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体顶部是
末端实体顶部;
TOP的架构是
信号S、R、Q、NOTQ:std_逻辑;
组件SRU VHDL是
港口(
S:标准逻辑;
R:在标准逻辑中;
Q:inout标准逻辑;
NOTQ:inout标准逻辑);
端组件sru-VHDL;
开始
U1:SRLATCH_VHDL端口映射(S、R、Q、NOTQ);
过程是
开始

我的意思是,在S=R=1,S=R=0之后,状态会振荡!我解决了这个问题。正如你回答我的,这只是关于isim的事情。时间尺度与isim中的“0”几乎相同,因此存在迭代限制为“10000”的isim错误!我通过在行为定义中延迟来解决这个问题:)再次感谢:)OP告诉你,将具有相同分配延迟的
s嫁接到Q和NOTQ,你可以得到一个显示振荡的波形。当S和R都为“1”时,延迟不平衡,一方获胜。有一种使用一致性术语的简单方法——谷歌危险逻辑或Earle-latch(IBM的J.G.Earle,一种带有一致性术语以防止振荡的D-latch)。本质上没有什么东西禁止S和R同时从“1”转到“0”。在物理实现中,这可能很少见,但确实发生了,通常表示设置或保持时间冲突。路由往往会导致延迟不平衡。时钟触发触发器的一般解决方案是使用主从触发器,在这种情况下,设置和保持时间可以被严格地刻画。@ PaBeels:你应该考虑修复这个答案或者把它取下来。真实(和模拟)电路确实表现出亚稳态输出行为,包括实际振荡,正是出于这个原因——这就是亚稳态的全部含义。这种情况持续多久取决于,IIRC,相关输出级的增益带宽乘积,因此高度依赖于技术,但它总是发生。你没有提供演示振荡,你提供的刺激也没有。解决的办法是平衡延迟,这样一个人就赢了。这相当于提供一个一致的术语。在时钟触发器中,这是设置和保持时间的来源,也是使用主从触发器的动力。我们正在处理数字设计和零门延迟的抽象的失落艺术。如果你要在Q和NOTQ的赋值中添加统一的延迟:
Q
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;