同步与异步逻辑 - SR-Flipflop
Synchronous vs Asynchronous logic - SR-Flipflop
我遇到了一个逻辑设计,我有一些问题。第一个问题是这个设计中是否有两个独立的 SR 触发器?第二个问题是时钟是否通常用于通过设计传播输入,或者这是否可以称为组合?因为我很难理解将输入传播到输出需要多少个时钟周期。如果我理解正确的话,首先需要一个时钟周期来传播设计的第一部分(第一个触发器?),然后第二个时钟周期会将新输入传播到设计的第二部分(第二个触发器?)。
我正在尝试在 VHDL 中实现此设计,但不完全确定我是否可以做这样的事情:
entity logic_design is
port(
R : in std_logic;
S1 : in std_logic;
R1 : in std_logic;
A : in std_logic;
Q : out std_logic;
Q_bar : out std_logic
);
end logic_design;
architecture Behavioral of logic_design is
signal sig_Q1_out : std_logic;
signal sig_Q1_bar_out : std_logic;
signal sig_Q2_out : std_logic;
signal sig_Q2_bar_out : std_logic;
begin
process(S1, R1)
begin
sig_Q1_out <= S1 nand sig_Q1_bar_out;
sig_Q1_bar_out <= R1 nand sig_Q1_out;
sig_Q2_out <= sig_Q1_out nor sig_Q2_bar_out;
sig_Q2_bar_out <= (sig_Q2_out nor A) nor R;
end process;
Q <= signal_Q2_out;
Q_bar <= signal_Q2_bar_out;
另外,有没有应用这种设计的例子。我读到过,在没有正确理解这如何有助于避免弹跳的情况下使用开关和按钮时,这种谴责是很常见的。
目前你的设计是组合的,因为你没有任何时钟,也没有移位寄存器触发器。这意味着如果您更改输入,输出将直接更新,可能会有延迟,但在模拟期间不会考虑。
如果您希望您的设计是连续的,您需要添加寄存器(又名 D 触发器)来存储临时结果。 DFF 的行为是存储输入并将其作为上升沿时钟的输出传递。
考虑到 D 是输入而 Q 是输出,您会发现需要等待时钟的下一个上升沿才能将输入信号传播到输出或在组合设计中。这就是使电路同步并顺便创建管道的方法。
我建议你尝试用这种行为自己实现一个D Flip Flop,并在每个输入前添加一个,在每个输出后添加一个。为了获得这个设计:
然后你应该模拟它,你会看到你的输出只在上升沿时钟上变化,你也会看到在输入变化和输出更新之间只有一个时钟周期。这也是创建同步电路的原理。
如果你想要更多的周期(例如为了提高时钟频率),你必须将你的设计分成两个组合设计并在它们之间添加一个 DFF。例如在 Q1 和 S2 之间。如果这样做,第一个时钟周期将从输入计算 Q1 并将其存储在中间 DFF 中,第二个时钟周期将计算 Q1 的输出。
我觉得你应该找一些书或课程来解释如何做这样的设计,如果你想做一些数字电路,这是一个必要的基础。
设计中有两个级联的SR 锁存器,不是触发器。它们都是经典的交叉耦合 NAND 锁存器(如果你对第二个锁存器进行去摩根化,你可以看到这一点)。
这是一个完全组合的电路;没有时钟,你必须从组合的角度思考,而不是 clocked/sequential 逻辑。
不过,我不确定它到底做了什么。通常,S1 和 R1 是低电平有效控制输入,Q2 是低电平有效输出。 S1 'sets' (and forces) Q2 (to 0), 但reset (to 1) 更复杂——你必须释放R1,然后设置A或R2,并不清楚这是什么意思.它可能是更大电路的一部分 - 可能是某种触发器实现(请注意,您认为的 'clocked' 逻辑实际上基本上是一个异步组合电路,就像这个电路一样)。单个 SR 锁存器可用于去抖动,但这是针对板级设计的——您不会在芯片中这样做(而是让所有东西都计时)。
您的 VHDL 是一个好的开始,但您需要在敏感度列表中添加 A 和 R2。根据您当前的逻辑,当 S1 或 R1 发生变化时,它们实际上是 sampled(因此您添加了两个采样电路,即触发器)。我会把它分成两个过程,第一个对 S1 和 R1 敏感,第二个对 Q1、A、R2 敏感。
您可以将此电路综合到 FPGA 中,但您需要注意时序,否则将无法工作。
我遇到了一个逻辑设计,我有一些问题。第一个问题是这个设计中是否有两个独立的 SR 触发器?第二个问题是时钟是否通常用于通过设计传播输入,或者这是否可以称为组合?因为我很难理解将输入传播到输出需要多少个时钟周期。如果我理解正确的话,首先需要一个时钟周期来传播设计的第一部分(第一个触发器?),然后第二个时钟周期会将新输入传播到设计的第二部分(第二个触发器?)。
我正在尝试在 VHDL 中实现此设计,但不完全确定我是否可以做这样的事情:
entity logic_design is
port(
R : in std_logic;
S1 : in std_logic;
R1 : in std_logic;
A : in std_logic;
Q : out std_logic;
Q_bar : out std_logic
);
end logic_design;
architecture Behavioral of logic_design is
signal sig_Q1_out : std_logic;
signal sig_Q1_bar_out : std_logic;
signal sig_Q2_out : std_logic;
signal sig_Q2_bar_out : std_logic;
begin
process(S1, R1)
begin
sig_Q1_out <= S1 nand sig_Q1_bar_out;
sig_Q1_bar_out <= R1 nand sig_Q1_out;
sig_Q2_out <= sig_Q1_out nor sig_Q2_bar_out;
sig_Q2_bar_out <= (sig_Q2_out nor A) nor R;
end process;
Q <= signal_Q2_out;
Q_bar <= signal_Q2_bar_out;
另外,有没有应用这种设计的例子。我读到过,在没有正确理解这如何有助于避免弹跳的情况下使用开关和按钮时,这种谴责是很常见的。
目前你的设计是组合的,因为你没有任何时钟,也没有移位寄存器触发器。这意味着如果您更改输入,输出将直接更新,可能会有延迟,但在模拟期间不会考虑。
如果您希望您的设计是连续的,您需要添加寄存器(又名 D 触发器)来存储临时结果。 DFF 的行为是存储输入并将其作为上升沿时钟的输出传递。
考虑到 D 是输入而 Q 是输出,您会发现需要等待时钟的下一个上升沿才能将输入信号传播到输出或在组合设计中。这就是使电路同步并顺便创建管道的方法。
我建议你尝试用这种行为自己实现一个D Flip Flop,并在每个输入前添加一个,在每个输出后添加一个。为了获得这个设计:
然后你应该模拟它,你会看到你的输出只在上升沿时钟上变化,你也会看到在输入变化和输出更新之间只有一个时钟周期。这也是创建同步电路的原理。
如果你想要更多的周期(例如为了提高时钟频率),你必须将你的设计分成两个组合设计并在它们之间添加一个 DFF。例如在 Q1 和 S2 之间。如果这样做,第一个时钟周期将从输入计算 Q1 并将其存储在中间 DFF 中,第二个时钟周期将计算 Q1 的输出。
我觉得你应该找一些书或课程来解释如何做这样的设计,如果你想做一些数字电路,这是一个必要的基础。
设计中有两个级联的SR 锁存器,不是触发器。它们都是经典的交叉耦合 NAND 锁存器(如果你对第二个锁存器进行去摩根化,你可以看到这一点)。
这是一个完全组合的电路;没有时钟,你必须从组合的角度思考,而不是 clocked/sequential 逻辑。
不过,我不确定它到底做了什么。通常,S1 和 R1 是低电平有效控制输入,Q2 是低电平有效输出。 S1 'sets' (and forces) Q2 (to 0), 但reset (to 1) 更复杂——你必须释放R1,然后设置A或R2,并不清楚这是什么意思.它可能是更大电路的一部分 - 可能是某种触发器实现(请注意,您认为的 'clocked' 逻辑实际上基本上是一个异步组合电路,就像这个电路一样)。单个 SR 锁存器可用于去抖动,但这是针对板级设计的——您不会在芯片中这样做(而是让所有东西都计时)。
您的 VHDL 是一个好的开始,但您需要在敏感度列表中添加 A 和 R2。根据您当前的逻辑,当 S1 或 R1 发生变化时,它们实际上是 sampled(因此您添加了两个采样电路,即触发器)。我会把它分成两个过程,第一个对 S1 和 R1 敏感,第二个对 Q1、A、R2 敏感。
您可以将此电路综合到 FPGA 中,但您需要注意时序,否则将无法工作。