首页 > 解决方案 > VHDL 进程中的多个非嵌套 if 语句是一种不好的做法吗?

问题描述

我使用 VHDL 几个月,有时当我希望按顺序评估某些条件时,我会使用非嵌套if 语句构建这种过程:

    process(clk)
    begin
        if rising_edge(clk) then
            if CONDITION1 then
                (some instructions)
            end if;

            if CONDITION2 then
                (some instructions)
            end if;
        end if;
    end process;

它似乎在模拟和合成中都运行良好,但在网上寻找示例时,我几乎从未见过这种结构。我对这些语句的顺序执行表示怀疑,但 IEEE 标准 VHDL 语言参考手册 Std 1076-2008 指出:

顺序语句用于定义执行子程序或进程的算法;它们按照它们出现的顺序执行。

if语句位于顺序语句列表中。

为什么我找不到更多这样的例子?这是一个不好的做法吗?

标签: if-statementvhdlsynthesis

解决方案


是的,这是合法的,是的,分配是顺序的。请记住,信号分配被赋予给它们的最后一个值,因此最终if“获胜”。所以下面的两个代码在功能上是相同的。

process(clk)
begin
  if rising_edge(clk) then
    if cond1 then
      --do something 
    end if;

    if cond2 then
      -- do something else
    end if;
  end if;
end process;

-- same as this:

process(clk)
begin
  if rising_edge(clk) then
    if cond2 then 
      -- do soemthing else
    elsif cond1 then
      -- do something
    end if;
  end if;
end process;

这有一个实际用途。传统的流程​​模板有一个重置作为if..else设置:

-- sync process
if srst then
  a <= '0';
  b <= '0';
else
  --do something with a and b
end if;

这很好,但你是在强迫a并且b总是有一个到 srst 的链接。如果您忘记放入bsrst 分支,您将 srst 连接到 b 的使能引脚,因为您在代码中说当 srst 处于活动状态时 b 寄存器不能被锁存。这会迫使您将所有寄存器放在您可能不想要的重置分支中。因此,要在同一进程中允许复位和非复位信号而不创建启用链接,您可以使用 double if:

--sync process
--do some logic with A and B here

if srst then  -- reset wins
  a <= '0'; 
  -- B has no link to reset 
end if;

这不是您在互联网上常见的风格(可能是因为旧教程总是教授这种if..else风格)。但是,使用“传统”方法在开发代码中发现 srst 和使能引脚之间的意外时序链接是很常见的。


推荐阅读