VHDL(使用 Xilinx)中的简单 SR 锁存器模拟不振荡
Simple SR Latch Simulation in VHDL(with Xilinx) doesn't oscillate
我了解到 SR-Latch 在以下电路 VHDL 代码中仅在 S 和 R 为“1”之后都为“0”时确实会振荡。
这里是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;
而且我完全不知道为什么模拟没有反映...
(点击放大)
有人在教你错误的知识!
SR 和 RS 基本触发器(也称为锁存器)不振荡。 S = R = 1
(forbidden) 上的问题是你不知道离开 S = R = 1
后的状态,因为你永远不可能同时去 S = R = 0
(save)。您将通过 S = 1; R = 0
(设置)或 S = 0; R = 1
(重置)从 S = R = 1
过渡到 S = R = 0
。这将在您到达状态 save.[=21= 之前触发 set 或 reset 操作]
请注意,VHDL 使用离散时间进行仿真,并且在每个 运行 上重现相同的仿真结果。您不能(轻松地)模拟导致每次模拟不同信号延迟的物理效应 运行.
顺便说一句。你的VHDL描述也是错误的。 Q
和 NOTQ
的模式是 out
,而不是 inout
。使用支持 VHDL-2008(允许回读输出端口)的适当模拟器或使用中间信号。
问得好,你的老师是对的——如果 S 和 R 在 "same" 时间都被释放,这个电路就会振荡。你的问题是你的 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 调度程序显示存在问题(使用 'delta delays' ).一个更好的方法是通过添加信号延迟来模拟真实的电路行为(这正是您的工具在为时序模拟进行反向注释时正在做的事情)。使用 after
查找信号分配,以及传输延迟和惯性延迟之间的差异。如果你画一个电路图,你会发现如果 S
和 R
在 'small' 时间 window 不允许信号释放,就会出现问题在第二个控制信号发生变化之前完成电路周围的传播。您现在需要编写一个测试平台,在 window.
内更改 S
和 R
几乎所有你设计的东西都是异步的,就像你的 SR 电路一样。我们只通过确保输入信号不会同时改变来制作电路 'synchronous'。时序工具的作用是告诉我们 'same' 的实际含义:当您获得一份报告或数据表值,为您提供设置或保持时间时,该数字只是 [=32= 的数字版本].
我了解到 SR-Latch 在以下电路 VHDL 代码中仅在 S 和 R 为“1”之后都为“0”时确实会振荡。
这里是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;
而且我完全不知道为什么模拟没有反映...
(点击放大)
有人在教你错误的知识!
SR 和 RS 基本触发器(也称为锁存器)不振荡。 S = R = 1
(forbidden) 上的问题是你不知道离开 S = R = 1
后的状态,因为你永远不可能同时去 S = R = 0
(save)。您将通过 S = 1; R = 0
(设置)或 S = 0; R = 1
(重置)从 S = R = 1
过渡到 S = R = 0
。这将在您到达状态 save.[=21= 之前触发 set 或 reset 操作]
请注意,VHDL 使用离散时间进行仿真,并且在每个 运行 上重现相同的仿真结果。您不能(轻松地)模拟导致每次模拟不同信号延迟的物理效应 运行.
顺便说一句。你的VHDL描述也是错误的。 Q
和 NOTQ
的模式是 out
,而不是 inout
。使用支持 VHDL-2008(允许回读输出端口)的适当模拟器或使用中间信号。
问得好,你的老师是对的——如果 S 和 R 在 "same" 时间都被释放,这个电路就会振荡。你的问题是你的 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 调度程序显示存在问题(使用 'delta delays' ).一个更好的方法是通过添加信号延迟来模拟真实的电路行为(这正是您的工具在为时序模拟进行反向注释时正在做的事情)。使用 after
查找信号分配,以及传输延迟和惯性延迟之间的差异。如果你画一个电路图,你会发现如果 S
和 R
在 'small' 时间 window 不允许信号释放,就会出现问题在第二个控制信号发生变化之前完成电路周围的传播。您现在需要编写一个测试平台,在 window.
S
和 R
几乎所有你设计的东西都是异步的,就像你的 SR 电路一样。我们只通过确保输入信号不会同时改变来制作电路 'synchronous'。时序工具的作用是告诉我们 'same' 的实际含义:当您获得一份报告或数据表值,为您提供设置或保持时间时,该数字只是 [=32= 的数字版本].