VHDL信号分配

VHDL signal assignment

假设有这段代码和我附上的图表..

entity t_trigger is
     port (Test, Reset, clk, en : in std_logic;
     Q_out: out std_logic);
end t_trigger;

architecture beh_t_trigger of t_trigger is
signal temp: std_logic ;

begin
 process (Reset, clk)
 begin
 if (clk'event and clk='1') then
  if Reset='1' then
   temp <= '0';
  elsif en = '1' then
   temp <= Test xor temp;
  end if;
 end if;
end process;
Q_out <= temp;
end beh_t_trigger;

序列末尾 Q_out 的状态是什么?如果第一个条件为真那么我们跳过第二个? temp 的初始值是多少? 我无法理解我们分配给它的内容,因为起初 "if" 条件中的 none 为真..

我创建了下图,看起来很糟糕,但希望能解释整个过程以获得答案;

你的逻辑有 5 个时钟上升沿,除了第一个,你有 Reset0,因此首先你得到 Q_out 值作为 0,rest 始终是 temp xor Test signal for Q_out 的结果,我在那里画的线表示这些值之间的异或运算,无论多么丑陋,我希望这有用:)

temp 的初始值是 U,正如 here 所解释的那样,直到你得到一个时钟上升沿,无论如何你都不应该担心它的值,如果您的实体在硬件上,它的初始输出信号可能是 0,但在模拟中您只能假设它是 U,如果您担心时钟事件之前的输出信号,您可以为其分配一些初始值,但显然会在第一个时钟沿后被覆盖。

关于 Q_out 的 "state" 随着波形的进展,我拼凑了一个测试台(使用粗略的时间)来指示输出。

注意温度的 "uninitialised" 状态。

关于为什么当 Reset 被断言时背后的逻辑,我们忽略逻辑的二级分支(即如果 en 为高)。 if/elsif 类型的语句倾向于推断优先级逻辑。下面通过您的代码生成的 RTL 对此进行了演示。

您可以从逻辑中看出,如果 Reset 信号被断言,temp 翻牌上的 D 输入将始终为 '0'