我想了解如何在RTL中综合VHDL代码中的不同构造。
- 谁能告诉我VHDL中流程的If-Else构造和 Case语句构造之间的区别,即如何通过综合工具将代码推断到RTL电路中?
- 一定要考虑多个嵌套if-else的情况,并在一个进程内将case语句与if-else构造混合在一起。
- 还有什么时候使用哪种构造?
PS:我已经看到一个相关的问题“ vhdl中正在处理多个if语句”,但是无论如何都无法回答我的问题。
我想了解如何在RTL中综合VHDL代码中的不同构造。
PS:我已经看到一个相关的问题“ vhdl中正在处理多个if语句”,但是无论如何都无法回答我的问题。
Answers:
谁能告诉我VHDL中流程的If-Else构造和Case语句构造之间的区别,即如何通过综合工具将代码推断到RTL电路中?
该if-elsif-else
构造推断优先级路由网络:
模拟该电路 –使用CircuitLab创建的原理图
这对应于
if bool_expr_1 then
sig <= val_expr_1;
elsif bool_expr_2 then
sig <= val_expr_2;
elsif bool_expr_3 then
sig <= val_expr_3;
else
sig <= val_expr_4;
end if;
case
另一方面,该构造可以推断出一个很大的混合体:
这对应于
case case_expr is
when c0 =>
sig <= val_expr_0;
when c1 =>
sig <= val_expr_1;
when c2 =>
sig <= val_expr_2;
...
when others =>
sig <= val_expr_N;
end case;
显然,这些是非常简化的设计,仅具有一个值表达式,从而产生一个输出。
一定要考虑多个嵌套if-else的情况,并在一个进程内将case语句与if-else构造混合在一起。
通过上面的内容,您可以看到它们如何嵌套/混合。
还有什么时候使用哪种构造?
由于if-else
推断出优先级,因此当可能出现多个输入条件时应使用该优先级。使用case
中,一个另一方面,当输入是相互排斥的是适当的。
if-else
但是,构造的性质是该链出现的地方。第一个条件必须失败才能测试第二个条件。case
构造不是这样的,这就是为什么if-else
不能将一个语句作为单个大复用器进行合成的原因。
case
语句也可以生成顺序逻辑。我找到了“真实世界VHDL”,这是格拉斯哥大学的一系列演讲幻灯片,可能对您有所帮助。
在此旧博客文章中,作者编写并合成了两个功能等效的VHDL代码版本。一个使用if-else,另一个使用案例。结果:
我合成了这段代码并获得了准确的结果,即使两个程序的RTL原理图也完全相同。
他的结论是:
这表明'case'和'if ... elsif ... else'语句都同样有效。但是,如果您想编写清晰的代码,则最好使用'case'。当输出取决于大量条件。但是,如果条件数量很少(2或3),则可以使用'if..elseif..else'。
关于每种可能的语言,在Stack Overflow上也有许多关于此主题的文章。结论通常是相同的,即在性能方面没有区别。有时,如果存在大量情况,则编译器可能足够聪明,可以创建一个查找表,从而产生更好的性能。
VHDL合成器可能能够执行类似的操作。但是您仍然需要大量的案例,在这种情况下(双关语意味深长),您可能仍想使用一个case语句,因为它在存在大量选项的情况下提供了更好的可读性。
dec
/jz
指令,这效率更高。也许在这里应用了类似的优化。