并发和条件信号分配 (VHDL)
concurrent and conditional signal assignment (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,顺序代码中也允许赋值形式。除了没有进程包装器之外,转换是相同的。
并发与顺序是关于执行的独立性。
并发语句只是一个被评估的语句 and/or 独立于它周围的代码执行。进程是并发的。 Component/Entity 实例是并发的。在体系结构中完成的信号分配和过程调用是并发的。
顺序语句(等待除外)运行 当它周围的代码也 运行s 时。
有趣的是,虽然进程是并发的(因为它 运行 独立于其他进程和并发分配),但它包含顺序语句。
通常当我们编写 RTL 代码时,我们编写的过程非常简单,以至于很难看出它们的顺序性质。确实需要状态机或测试台才能看到流程的真正顺序性质。
在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,顺序代码中也允许赋值形式。除了没有进程包装器之外,转换是相同的。
并发与顺序是关于执行的独立性。
并发语句只是一个被评估的语句 and/or 独立于它周围的代码执行。进程是并发的。 Component/Entity 实例是并发的。在体系结构中完成的信号分配和过程调用是并发的。
顺序语句(等待除外)运行 当它周围的代码也 运行s 时。
有趣的是,虽然进程是并发的(因为它 运行 独立于其他进程和并发分配),但它包含顺序语句。
通常当我们编写 RTL 代码时,我们编写的过程非常简单,以至于很难看出它们的顺序性质。确实需要状态机或测试台才能看到流程的真正顺序性质。