不带elsif和else条件的if语句的VHDL综合

Ocr*_*m82 4 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; 
Run Code Online (Sandbox Code Playgroud)

IF语句将被合成为多路复用器。我认为在这个示例中,两个多路复用器都将以链的形式连接在一起,最后一个D寄存器用于out的注册值。我想当sel0'0'和sel1'0'时qout的值是什么?每个多路复用器的选择器为0时会发生什么?网络是否保持相同的输出并推断出闩锁?

谢谢。

Mor*_*mer 5

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

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

在此处输入图片说明

因此,这显示了一个触发器,该触发器在每个周期更新,其值如下:

  • qout_sra_2 如果 sel1 = '1'
  • a_minus_b如果sel1 = '0'sel0 = '1'
  • qout(以相同的值重新分配),如果sel1 = '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;
Run Code Online (Sandbox Code Playgroud)

其他综合工具可能会以不同的方式实现它,例如Xilinx ISE在触发器上使用时钟使能,因此得出以下结果。

在此处输入图片说明

因此,这显示一个触发器,如果sel0or或sel1is '1',则使用值更新:

  • qout_sra_2 如果 sel1 = '1'
  • a_minus_b 如果 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; 
Run Code Online (Sandbox Code Playgroud)