VHDL(使用Xilinx)的简单SR锁存器仿真不会振荡

时间:2017-10-14 15:03:18

标签: vhdl xilinx

我知道当S和R都是' 0'时,SR-Latch会振荡。在他们只是' 1'在以下电路VHDL代码中。

这里是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;

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

Xilinx Simul of SR LATCH
(点击放大)

2 个答案:

答案 0 :(得分:2)

不错的问题,你的导师是对的 - 如果S和R都在&#34;同一&#34;释放,那么这个电路会振荡。时间。你的问题是你的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;

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

enter image description here

这不是演示异步行为的好方法,因为您有效地简化了电路的物理特性,并使用VHDL调度程序来表明存在问题(使用&#39) ; delta延迟&#39;)。更好的方法是通过添加信号延迟来模拟实际电路行为(这正是您的工具在对时序仿真进行反标注时所做的工作)。使用after查找信号分配,以及传输和惯性延迟之间的差异。如果您绘制电路图,如果SR同时发布在“小”字母中,您就会发现问题出现了。时间窗口,在第二个控制信号发生变化之前,不允许信号在电路周围传播完成。您现在需要编写一个在此时间窗口内更改SR的测试平台。

您设计的所有内容都是异步的,与SR电路完全相同。我们制作电路&#39;同步&#39;只有确保输入信号不会同时发生变化。计时工具的工作是告诉我们什么是相同的&#39;实际上意味着:当您获得报告或数据表值给您设置或保留时间时,那么该数字只是数字版本的&#39;不一样的&#39;。

答案 1 :(得分:1)

有人教你错误的知识!

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

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

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