【问题标题】:Difference between process and "vanilla" VHDL过程和“香草”VHDL之间的区别
【发布时间】:2019-03-08 10:02:16
【问题描述】:

我正在练习 VHDL,我有一个关于不需要过程的“简单”语句的基本问题。

我想知道两者的区别

c <= a and b;

语句不在进程内部,只是在架构开始后编写,并且

process(a,b)
begin
    c <= a and b;
end process;

这些结果会产生同样的结果吗? 泰:)

【问题讨论】:

  • 第一种形式是后一种形式的语法糖。
  • IEEE Std 1076-2008 11.6 并发信号赋值语句“并发信号赋值语句表示为信号赋值的等效过程语句。”、“等效于并发信号赋值语句的过程语句,其目标是一个信号名称,构造如下:...”,14.2 设计层次结构的细化“设计层次结构的细化创建了由网络互连的过程集合;然后可以执行该过程和网络的集合以模拟行为的设计。”
  • 告诉(11.6)“并发信号赋值语句的执行等同于等效过程语句的执行。”

标签: vhdl fpga hardware-programming asic


【解决方案1】:

是的,这两种描述是等价的。

在每次更新任何参数(ab)时都会评估并发信号分配 c &lt;= a and b,并且每次更新敏感度列表中的任何参数(@ 987654324@ 或 b)。

在简单示例中不需要使用process,但对于更复杂的表达式,process 的优点是可以使用iffor 等控制结构,这不是直接可能的在并发信号分配中。此外,对于顺序逻辑,process 是必需的。

【讨论】:

  • "process 的优点是可以使用iffor 等控制结构":循环可以,但并发信号分配也可以实现@ 987654334@ (sig &lt;= val1 when cond1 else val2 when cond2...) 或 case 控制结构 (with...select)。
  • 顺序逻辑需要一个进程”:Q &lt;= D when rising_edge(CLK);呢?
  • @RenaudPacalet:感谢您的补充。我同意when-else-... 可以用if-then-... 代替并发分配。此外,如果在并发分配中需要if-then-...,则可以将它们包装在一个函数中,这是另一个不使用process 的示例。对于顺序逻辑,我将反对使用Q &lt;= D when rising_edge(CLK); 进行并发分配,因为工具可能会失败;例如,英特尔 Quartus 18.1 综合在呈现此构造时崩溃,认为是合法代码,并且 ModelSim 接受它。
  • Altera Quartus II 支持Q &lt;= D when rising_edge(CLK); 形式。如果 Intel Quartus Prime 不接受这一点,这是 Quartus 中引入的错误。 Xilinx ISE、Xilinx Vivado 和 Lattice LSE 也支持它。甚至可以编写自己的rising_edge 函数。这在所有提到的工具中都正确合成,除了 Vivado,它创建锁存器而不是 FF...
  • @Paebbels:为了仔细检查这是否是 Quartus 18.1 的问题,我制作了一个只有两个 FF 的模块,一个作为进程,一个作为并发分配,使用上面的方法,它打破了“内部错误:子系统:BPM,文件:/quartus/db/bpm/bpm_hard_block_util.cpp,行:3458 ... Quartus Prime 信息 ...版本:18.1.0 构建:625 版:精简版”。 ModelSim 处理得很好,表现出相同的行为,当我将并发 FF 更改为像其他那样处理时,它也通过 Quartus 运行。我可以把我的例子发给你,但不多。我会尝试向英特尔报告。
【解决方案2】:

您可以将任何 VHDL 单行视为隐含过程,其中 RHS 上的参数为

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2012-08-16
    • 1970-01-01
    • 2010-12-28
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多