2017-10-14 93 views
2

我已经了解到,当S和R在它们在下面的电路VHDL代码中仅为'1'时均为'0'时,SR锁存器会发生振荡。VHDL中的简单SR锁存器仿真(带Xilinx)不会振荡

这里是SRLATCH

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; 

的VHDL和以下的测试平台代码的过程,其仿真结果

-- 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
(点击放大)

+0

您尚未提供展示振荡的[最小,完整和可验证示例](https://stackoverflow.com/help/mcve),您提供的刺激也不会这样做。治愈的办法是平衡延误,以赢得胜利。这相当于提供了共识。在钟控触发器中,这是设置和保持时间的源泉,也是使用主从触发器的动力。我们正在处理丢失的数字设计艺术以及零门延迟的抽象。 – user1155120

+0

如果您要为Q和NOTQ的赋值添加统一的延迟:1ns后的Q <= R NOR NOTQ;在1 ns后NOTQ <= S NOR Q;'并且在同一个增量周期内(不插入WAIT)在S和R上提供'0'到'1'的转换,您可以证明[振荡](https:// i .stack.imgur.com/d23rt.png“srlatch_vhdl_with_delay.png”),而不需要可以显示增量循环或导致超过增量循环的最大数量的波形显示。 – user1155120

回答

1

有人教你错误的知识!

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

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

Btw。你的VHDL描述也是错误的。 QNOTQ的模式是out,而不是inout。使用支持VHDL-2008的正确模拟器(允许读出端口)或使用中间信号。

+0

THANX A LOT :)我只是说在S = R = 1之后,S = R = 0状态会发生振荡!我解决了这个问题。当你回答我的时候,它只是一件事情。时间尺度与isim中的'0'几乎相同,所以迭代限制'10000'时存在isim错误!我通过拖延行为的定义来解决它:)再次感谢你:) –

+0

OP是告诉你嫁接's ='0'; r <='0';等待100 ns;'在's ='1'之后现有的stim_proc的末尾; r <='1';等待500纳秒;'会导致增量循环振荡 - 模拟停止 - 停止增量。 OP的问题没有证明问题没有提供[最小化,完整和可验证的示例](https://stackoverflow.com/help/mcve),也没有回答解决他有关的问题。 – user1155120

+0

对于Q和NOTQ具有相同的分配延迟,您可以获得显示振荡的波形。当S和R都为'1'时,不平衡延迟,一方获胜。有一个使用共识术语的简单方法 - 谷歌*危险逻辑*或*厄尔锁存*(D锁存器,用于防止振荡的共识术语,IBM的J. G. Earle)。从本质上来说,禁止S和R同时从'1'和'0'同时出现。在物理实现中,它可以退出很少,但确实发生,通常表示设置或保持时间违反。路由会导致延迟不平衡。 – user1155120

2

不错的问题,你的导师是正确的 - 如果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; 

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

enter image description here

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

几乎所有你设计的东西都是异步的,就像你的SR电路一样。只有确保输入信号不会同时发生变化,我们才能使电路“同步”。计时工具的作用是告诉我们“相同”实际上意味着什么:当你得到一份报告或数据表值给你一个设置或一个保持时间时,那么这个数字就是'不一样'的数字版本。