【问题标题】:VHDL using signals to hold temp valuesVHDL 使用信号来保存温度值
【发布时间】:2016-12-21 17:31:27
【问题描述】:

我知道信号分配是在流程结束时完成的。但是假设我有两个信号“A”和“B”。 A 的值在我的过程中变化如此频繁(几乎在每个周期中),B 用于将 A 的值保存为临时值,以便在下一个时钟周期将其分配给其他信号。但是,除非发生某些特定事情,否则我不希望 B 的值发生变化。因此,如果我在此过程中将 A 分配给 B 一次,B 的值是否会在 A 的值发生变化时自动更新?如果答案是肯定的,我怎样才能让 B 只有在 if 语句成立时才改变它的值?使用变量而不是信号作为 B 可以解决这个问题吗?

【问题讨论】:

  • 我不明白你的问题。生成MCVE 怎么样?如果你这样做,你可能会自己回答。
  • 你不清楚。用代码说明。敏感度列表中发生了什么?
  • 我认为您不了解流程中的分配在更基础的层面上的作用。如果您在每次运行时在进程中分配B <= A,那么在进程结束时(0 时差)B 将获得值A 在进入时过程。如果您if 语句中分配B <= A,则当进程运行但不满足if 语句时,B 将保留其先前的值。假设您的进程是计时的,这将在触发器中实现B。如果它是一个非时钟进程,它将使用闩锁(坏)来实现它。

标签: vhdl fpga


【解决方案1】:

信号和变量之间的主要区别之一是变量分配立即发生,而信号分配发生在过程评估结束时(通常是时钟周期结束)。

当 A 和 B 都被声明为信号时:

process (reset, clk)
begin
   if (reset = '1') then
      A <= '0';
      B <= '0';
   elsif rising_edge(clk) then

      A <= Some_Frequently_Changing_Signal;

      if ("certain thing happens") then
         B <= A;
      end if;

   end if;
end process;

当 if 语句的计算结果为 true 时,B 被赋予 A 在进入进程时所具有的值(这将是 Some_Frequently_Changing_Signal 在前一个时钟周期内的任何值)。

如果我们将 A 声明为变量而不是信号:

process (reset, clk)
begin
   if (reset = '1') then
      A := '0';
      B <= '0';
   elsif rising_edge(clk) then

      A := Some_Frequently_Changing_Signal;

      if ("certain thing happens") then
         B <= A;
      end if;

   end if;
end process;

当 if 语句的计算结果为真时,B 被赋值为 A。但是,A 保存 Some_Frequently_Changing_Signal 的当前值,因为变量赋值立即发生。不推荐这种类型的编码风格。最好只使用:

process (reset, clk)
begin
   if (reset = '1') then
      B <= '0';
   elsif rising_edge(clk) then

      if ("certain thing happens") then
         B <= Some_Frequently_Changing_Signal;
      end if;

   end if;
end process;

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多