concurrency - 并发和条件信号分配 (VHDL)

标签 concurrency vhdl

在VHDL中,信号分配有两种类型:

concurrent   ---->    when...else
             ---->    select...when...else

sequential   ---->    if...else
             ---->    case...when

问题是有人说 when...else 条件是逐行检查的(顺序之王)而 select...when...else 条件被检查一次。看这个reference例如。

我说 when..else 也是顺序赋值,因为你是逐行检查的。换句话说,我说没有必要在进程中说 if..else 等同于 when..else。为什么他们假设 when..else 是并发分配?

最佳答案

您在问题中暗示的位置与并发赋值或顺序语句无关。它更多地与 if 和 case 之间的区别有关。在我们开始之前,首先让我们了解一些等价物。并发条件赋值:

Y <= A when ASel = '1' else B when BSel = '1' else C ; 

完全等同于一个流程,代码如下:

process(A, ASel, B, BSel, C) 
begin
  if ASel = '1' then
    Y <= A ;
  elsif BSel = '1' then 
    Y <= B ; 
  else 
    Y <= C ; 
  end if ;
end process ; 

同时选择的作业也是如此:

With MuxSel select
  Y <= A when "00", B when "01", C when others ; 

相当于一个具有以下内容的进程:

process(MuxSel, A, B , C) 
begin
  case MuxSel is 
    when "00" =>    Y <= A; 
    when "01" =>    Y <= B ; 
    when others =>  Y <= C ;
  end case ; 
end process ; 

从编码的角度来看,上面的顺序形式比赋值形式具有更多的编码能力,因为 case 和 if 允许代码块,其中赋值形式只分配给一个信号。然而除此之外,它们具有相同的语言限制并生产相同的硬件(就像综合工具那样)。此外,对于许多简单的硬件问题,分配形式很有效,并且是对问题的简洁捕获。

因此,您的想法最终归结为 if 和 case 之间的区别。 If 语句(及其等效的条件赋值)在(或暗示)中具有多个“elsif”,往往会创建优先级逻辑或至少级联逻辑。其中 as case(及其等效的选定分配)往往非常适合多路复用器之类的东西,并且它们的逻辑结构更倾向于平衡的树结构。

有时工具会重构 if 语句,使其等同于 case 语句。同样对于某些目标(特别是基于 LUT 的逻辑,如 Xilinx 和 Altera),它们在硬件效率方面的差异在有足够的“elsif”分支之前不会显现出来。

在 VHDL-2008 中,顺序代码中也允许赋值形式。除了没有进程包装器之外,转换是相同的。

关于concurrency - 并发和条件信号分配 (VHDL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632957/

相关文章:

math - Xst :647 Warnings during Synthesis of Shift6 with Top module

c# - ConcurrentBag 与 List 的性能比较

concurrency - Erlang 中的 future 和 promise

scala - 封装在 Future 中的同步 HTTP 请求是否被视为 CPU 或 IO 限制?

for-loop - 实现 FOR-LOOP 和 FOR-GENERATE 之间的实际区别是什么?什么时候使用其中一种比另一种更好?

c - 如何将带小数点的有符号数解释为 C 代码中的实际值(256 -> 4)

java - 并行运行操作,同时保留有序的增量输出

go - big.Rat 中的数据竞赛

variables - 信号与变量

sublimetext2 - 如何为 Sublime Text 2 安装 VHDL 语法高亮?