没有elsif和其他条件的if语句的VHDL综合

时间:2014-11-05 22:56:41

标签: if-statement vhdl

我试图更好地理解合成如何适用于没有指定其他条件的过程。

我认为这不是代码的方式,因为我没有考虑其他选项,但我的问题是如何解释这段代码?

process(clock)
begin
if (clock'event and clock ='1') then 
  if sel0 = '1' then qout <= A - B;    end if; 
  if sel1 = '1' then qout <=  qout sra 2;        end if;
end if;
end process; 

IF语句将被合成为多路复用器。我认为,对于这个例子,两个多路复用器将在一个链中连接在一起,最后一个D寄存器用于注册的out值。我猜测当sel0&#39; 0&#39;时,qout的价值是多少?和sel1&#39; 0&#39;? 当每个多路复用器的选择器为&#39; 0时会发生什么?网络是否保持相同的输出,推断出一个锁存器?

感谢。

3 个答案:

答案 0 :(得分:5)

为了展示和了解综合工具如何实现设计,您可以使用Altera Quartus II进行综合,然后使用内置RTL查看器来显示最终设计的高级表示。

使用1位向量来简化结构的代码给出了如下所示的结果。

enter image description here

因此,这显示了每个周期更新的触发器,值为:

  • qout_sra_2 if sel1 = '1'
  • a_minus_b如果sel1 = '0'sel0 = '1'
  • 如果qoutsel1 = '0' ,则
  • sel0 = '0'(重新分配相同的值)

因此等同于:

if clock'event and clock ='1' then 
  if sel1 = '1' then
    qout <= qout sra 2;
  elsif sel0 = '1' then
    qout <= A - B;
  else
    qout <= qout;
  end if; 
end if;

其他综合工具可以在不同的方面实现它,例如在触发器上使用时钟使能的Xilinx ISE,从而得到下面的结果。

enter image description here

因此,如果sel0sel1'1',则会显示更新的触发器,其值为:

  • qout_sra_2 if sel1 = '1'
  • a_minus_b if sel1 = '0'

因此等同于:

if clock'event and clock ='1' then 
  if not ((sel0 = '0') and (sel1 = '0')) then  -- (sel0 = '1') or (sel1 = '1')
    if sel1 = '1' then
      qout <= qout sra 2;
    else
      qout <= A - B;
    end if;
  end if;
end if; 

答案 1 :(得分:1)

你基本上会得到一个多路复用器和一个寄存器(当然还有处理每个输入计算的逻辑)。不需要锁存器,因为寄存器将启用时钟,因此输入网络可以是纯粹的组合。

也不需要2个多路复用器。由于信号分配在VHDL中的工作方式,以下代码段:

if sel0 = '1' then
  qout <= A - B;
end if; 
if sel1 = '1' then
  qout <= qout sra 2;
end if;

相当于:

if sel1 = '1' then
  qout <= qout sra 2;
elsif sel0 = '1' then
  qout <= A - B;
end if; 

如果两个if条件都为真,则后一个赋值会覆盖前一个赋值。之后暗示是&#34;否则什么都不做&#34;,即&#34;否则不用时钟启用寄存器&#34;。逻辑可以简化为仅依赖于sel1的多路复用(如果sel1'0',则网络的输出可以由sel0选择,或者不要小心,因为它不会被打入时间。寄存器的时钟使能为sel0 or sel1。这至少是我的表现。

答案 2 :(得分:0)

如果if语句都没有执行,则qout保持其当前值。最初,它将是bit的类型声明“0”和std_ulogic的“U”中最左边的元素。合成器可能会抱怨缺少有效的初始化或默认为“0”或“1”。