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

时间:2017-03-06 18:28:28

标签: 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是并发任务?

2 个答案:

答案 0 :(得分:4)

您在问题中暗示的地方与并发分配或顺序语句无关。它更多地与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 ; 

从编码的角度来看,上面的顺序形式比赋值形式具有更多的编码能力,因为情况和允许的代码块,其中赋值形式仅分配给一个信号。除此之外,它们具有相同的语言限制并生成相同的硬件(就像综合工具那样)。此外,对于许多简单的硬件问题,分配表格运行良好,并且是对问题的简要描述。

所以,你的想法在哪里,实际上归结为if和case之间的区别。如果语句(及其等效的条件赋值)中有多个“elsif”(或隐含),则倾向于创建优先级逻辑或至少级联逻辑。情况(及其等效的选定分配)往往非常适合多路复用器之类的东西,它们的逻辑结构往往更像是一个平衡的树结构。

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

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

答案 1 :(得分:2)

Concurrent vs Sequential是关于执行的独立性。

并发语句只是一个独立于其周围的代码进行评估和/或执行的语句。进程是并发的。组件/实体实例是并发的。在架构中完成的信号分配和过程调用是并发的。

顺序语句(等待除外)在其周围的代码也运行时运行。

有趣的是,虽然进程是并发的(因为它独立于其他进程和并发分配运行),但它包含顺序语句。

通常当我们编写RTL代码时,我们编写的流程很简单,很难看到它们的顺序性。确实需要一个状态机或测试平台才能看到流程的真正顺序性。