If statement VHDL进程中的多个非嵌套if语句是一种不好的做法吗?

If statement VHDL进程中的多个非嵌套if语句是一种不好的做法吗?,if-statement,vhdl,synthesis,If Statement,Vhdl,Synthesis,我使用VHDL有几个月的时间,当我希望按顺序计算某些条件时,我有时会使用非嵌套的if语句构建这种过程: 过程(clk) 开始 如果上升沿(clk),则 如果条件1那么 (一些说明) 如果结束; 如果条件2那么 (一些说明) 如果结束; 如果结束; 结束过程; 它似乎在模拟和合成中都很好地工作,但我在web上查找示例时很少看到这种结构。 我对这些语句的顺序执行有疑问,但IEEE标准VHDL语言参考手册Std 1076-2008指出: 顺序语句用于定义执行的算法 指子程序或过程;它们按照它们的顺序

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

过程(clk)
开始
如果上升沿(clk),则
如果条件1那么
(一些说明)
如果结束;
如果条件2那么
(一些说明)
如果结束;
如果结束;
结束过程;
它似乎在模拟和合成中都很好地工作,但我在web上查找示例时很少看到这种结构。 我对这些语句的顺序执行有疑问,但IEEE标准VHDL语言参考手册Std 1076-2008指出:

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

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


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

是的,这是合法的,是的,分配是有顺序的。请记住,信号分配是最后一次分配给它们的值,因此最终的
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;

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

是的,这是合法的,是的,分配是顺序的。请记住,信号分配是最后一次分配给它们的值,因此最终的
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;

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

我建议不要这样做。您始终可以使用
elsif
else
替换第二个
if
。为什么我建议不要这样做?因为有可能您的合成器认为在某些情况下,
CONDITION1
CONDITION2
都不正确,所以它会将锁存器放入,即使它们不是必需的。(如果您最终使用的是
elsif
,为了避免锁存,您不也需要
else
或默认分配。)@MatthewTaylor这是一个计时过程,因此锁存不应该是可能的。由于我下面的回答,我一直使用双if,没有任何问题
CONDITION1
可以是sync enable和
CONDITION2
sync reset,它允许您选择分别启用和重置的信号
if..else
强制将所有信号同时连接到两者。@Oh。对这是一个循序渐进的过程。那么就没有闩锁了。更正:出于我所说的所有原因,我建议不要在组合过程中这样做。我建议不要这样做。您始终可以使用
elsif
else
替换第二个
if
。为什么我建议不要这样做?因为有可能您的合成器认为在某些情况下,
CONDITION1
CONDITION2
都不正确,所以它会将锁存器放入,即使它们不是必需的。(如果您最终使用的是
elsif
,为了避免锁存,您不也需要
else
或默认分配。)@MatthewTaylor这是一个计时过程,因此锁存不应该是可能的。由于我下面的回答,我一直使用双if,没有任何问题
CONDITION1
可以是sync enable和
CONDITION2
sync reset,它允许您选择分别启用和重置的信号
if..else
强制将所有信号同时连接到两者。@Oh。对这是一个循序渐进的过程。那么就没有锁存。更正:出于我所说的所有原因,我建议不要在组合过程中这样做。当条件1和条件2不是相互排斥时,这仍然是真的吗?因为在这种情况下,不能将两个连续的
if
替换为
if
elsif
if..elsif
始终表示优先级。
if
条件比
elsif
条件更精确。因此这两个ifs应该是等价的。我知道
如果
elsif
是互斥的,这就是为什么我要讨论条件1和条件2不是互斥的情况(在我的第一个示例中),因为这样你就不能用
if
elsif
来实现程序,你不得不用两个
if
…你怎么看这种情况?我想不出在一个if/elseif中不能做两个if的情况。我从来没有见过两个if不能用if/elsif完成的情况。如果条件1和条件2不是互斥的,这仍然是真的吗?因为在这种情况下,不能将两个连续的
if
替换为
if
elsif
if..elsif
始终表示优先级。
if
条件比
elsif
条件更精确。因此这两个ifs应该是等价的。我知道
if
elsif
是互斥的,这就是为什么我要讨论条件1和条件2不是互斥的情况(在我的第一个示例中),因为这样你就不能用
if
el来实现程序