我知道当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;
完全我不知道为什么模拟没有反映......
答案 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;
这将产生无限的延迟振荡:
这不是演示异步行为的好方法,因为您有效地简化了电路的物理特性,并使用VHDL调度程序来表明存在问题(使用&#39) ; delta延迟&#39;)。更好的方法是通过添加信号延迟来模拟实际电路行为(这正是您的工具在对时序仿真进行反标注时所做的工作)。使用after
查找信号分配,以及传输和惯性延迟之间的差异。如果您绘制电路图,如果S
和R
同时发布在“小”字母中,您就会发现问题出现了。时间窗口,在第二个控制信号发生变化之前,不允许信号在电路周围传播完成。您现在需要编写一个在此时间窗口内更改S
和R
的测试平台。
您设计的所有内容都是异步的,与SR电路完全相同。我们制作电路&#39;同步&#39;只有确保输入信号不会同时发生变化。计时工具的工作是告诉我们什么是相同的&#39;实际上意味着:当您获得报告或数据表值给您设置或保留时间时,那么该数字只是数字版本的&#39;不一样的&#39;。
答案 1 :(得分:1)
有人教你错误的知识!
SR和RS基本触发器(也称为锁存器)不振荡。 S = R = 1
(禁止)上的问题是您离开S = R = 1
后不知道状态,因为您永远不能同时转到S = R = 0
(保存)。您将S = R = 1
转换为S = R = 0
至S = 1; R = 0
(设置)或S = 0; R = 1
(重置)。这将在您到达状态 save 之前触发 set 或 reset 操作。
请注意,VHDL使用离散时间进行模拟,并在每次运行时重现相同的模拟结果。您不能(轻松地)模拟每次模拟运行导致不同信号延迟的物理效应。
顺便说一下。你VHDL描述也是错误的。 Q
和NOTQ
的模式为out
,而非inout
。使用支持VHDL-2008的适当模拟器(允许读取输出端口)或使用中间信号。