【问题标题】:Are multiple non-nested if statements inside a VHDL process a bad practice?VHDL 进程中的多个非嵌套 if 语句是一种不好的做法吗?
【发布时间】:2020-05-14 09:52:33
【问题描述】:

我使用 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 替换为elsif 或else。为什么我不建议这样做?因为您的合成器有可能认为在某些情况下CONDITION1 或CONDITION2 都不是真的,所以它会放入锁存器,即使它们不是必需的。 (如果你最终得到一个elsif,为了避免闩锁,你是否还需要一个else 或一个默认分配。)
  • @MatthewTaylor 它是一个时钟进程,因此不应该出现闩锁。由于我在下面的回答,如果一直没有问题,我会使用双精度。 CONDITION1 可以是同步使能和CONDITION2 同步复位,它允许您分别选择哪些信号使能和复位。 if..else 强制所有信号都连接到两者。
  • @Tricky 哦。是的。这是一个计时过程。那就没有闩锁了。
  • 更正:出于我所说的所有原因,我建议不要在组合过程中进行。

标签: if-statement vhdl synthesis


【解决方案1】:

是的,这是合法的,是的,分配是顺序的。请记住,信号分配是给定给它们的最后一个值,因此最终的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 的链接。如果您忘记将b 放在 srst 分支中,您会将 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 和 enable 引脚之间的意外时序链接是很常见的。

【讨论】:

  • 当 CONDITION1 和 CONDITION2 不互斥时这仍然成立吗?因为在这种情况下,您不能将两个连续的if 替换为if 和elsif 的组合。
  • if..elsif 总是意味着优先级。 if 条件优先于 elsif 条件。因此这两个 if 应该是等价的。
  • 我知道 if 和 elsif 是独占的,这就是为什么我要谈论 CONDITION1 和 CONDITION 2 不是独占的情况(在我的第一个示例中),因为那样你就无法实现带有if 和elsif 的程序你不得不使用两个if...你怎么看这种情况?
  • 我想不出在 if/elseif 中不能完成两个 if 的情况。我从未见过使用 if/elsif 无法完成两个 if 的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多