【问题标题】:should this be a multiple drive error in vhdl这应该是 vhdl 中的多驱动器错误吗
【发布时间】:2017-08-08 10:52:28
【问题描述】:

考虑这个 VHDL 代码:

process(a, b)
begin
    equal <= '0'; --default
    gt <= '0'; --default
    if a=b then
        equal <= '1';
    end if;
    if a>b then
        gt <= '1';
    end if;
end process;

所谓的“默认”值是为了防止信号gtequal 出现锁存器。但是,由于这不是一个时钟进程,这不应该是信号gtequal 的多个驱动程序的错误吗?

【问题讨论】:

  • 不,这很好,因为您只有一个进程驱动信号。
  • IEEE Std 1076-2008 14.7.2 驱动程序,第 1 段(部分):进程语句中的每个信号分配语句都为某些标量信号定义了一组 驱动程序。进程语句中的给定标量信号 S 有一个驱动程序,前提是该进程语句中至少有一个信号赋值语句,并且该信号赋值语句的目标信号的最长静态前缀表示 S 或表示S 为子元素的复合信号。 ...
  • 那么写 a
  • 有或没有时钟。 10.5.2.2 执行简单赋值语句,第 1 段(部分):执行简单波形赋值语句的效果是根据其对代表当前和未来值的投影输出波形(见 14.7.2)的影响来定义的信号的驱动程序。 (规则在 10.5 中描述,对于任何一次,只有一个投影输出波形(一个队列),没有延迟提供当前 sim 时间。第二个波形替换第一个。要查看两者,需要中间等待.)
  • 在尝试避免锁存器时,没有时钟对于易于编码是有意义的。但是有时钟吗?它不会造成不必要的电路吗?

标签: vhdl fpga


【解决方案1】:

这不是多驱动情况,因为您的信号由一个进程驱动(当然,除非您也从另一个进程驱动它们)。所以没关系。也许让您感到困惑的是,在同一流程执行期间多次分配同一信号时。对于这个简短的答案,完整而详细的答案太复杂了。但是为了简单起见,如果您只使用 simple 信号分配(没有after 子句,没有波形...),那么最后一个分配获胜。

原因是每次执行gt &lt;= &lt;value&gt;指令时,&lt;value&gt;并没有立即分配给信号gt。相反,它被记录在模拟器内存​​中的某处,在当前模拟步骤结束时分配给信号gt 的值。在当前模拟步骤结束时,在所有进程都已执行并在wait 语句(或它们的敏感度列表,相当于wait 语句)上暂停之后,模拟器更新信号gt 与记录的值。

所以,如果你执行,在同一个模拟步骤中:

gt <= '0';
...
gt <= '1';

第二个赋值将覆盖第一个赋值记录的值,gt 将在模拟步骤结束时取值 '1'

【讨论】:

  • 这对合成也安全吗?所以 gt 实际上会紧到 '1'?
  • @user2609910 当然,这是一个非常简单的结构,我知道的所有合成器都可以按预期处理。
猜你喜欢
  • 2019-08-05
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
相关资源
最近更新 更多