If statement VHDL进程中的多个非嵌套if语句是一种不好的做法吗?
我使用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指出: 顺序语句用于定义执行的算法 指子程序或过程;它们按照它们的顺序
过程(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来实现程序