我想了解如何在 RTL 中综合 VHDL 代码中的不同结构。
- 谁能告诉我VHDL 中的If-Else构造和 Case 语句构造之间的区别在于代码是如何通过综合工具推断到 RTL 电路中的?
- 请考虑多个嵌套 if-else的情况以及在流程中将 case语句与 if-else构造混合的情况。
- 还有什么时候使用哪个构造?
PS:我看到了一个相关的问题“vhdl 中的多个 if 语句”,但这并不能回答我的问题。
我想了解如何在 RTL 中综合 VHDL 代码中的不同结构。
PS:我看到了一个相关的问题“vhdl 中的多个 if 语句”,但这并不能回答我的问题。
谁能告诉我 VHDL 中的 If-Else 构造和 Case 语句构造之间的区别在于代码是如何通过综合工具推断到 RTL 电路中的?
该if-elsif-else
构造推断优先级路由网络:
这对应于
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
另一方面,当输入互斥时,使用是合适的。
在这篇旧博文中,作者编写并合成了两个功能等效的 VHDL 代码版本。一个使用 if-else,另一个使用 case。结果:
我合成了这段代码并得到了确切的结果。即使是 RTL 原理图,这两个程序也完全相同。
他的结论是:
这说明 'case' 和 'if...elsif...else' 语句都是同样有效的。但是如果你想写一个清晰的代码,那么你最好使用 'case'。'case' 在输出取决于大量条件。但如果条件数量非常少(2 或 3),那么您可以使用“if..elseif..else”。
Stack Overflow 上也有几十篇关于这个主题的帖子,适用于每一种可以想象的语言。结论通常是相同的,即在性能方面没有差异。有时,如果有大量情况,编译器可能足够聪明,可以创建一个查找表,从而产生稍好的性能。
VHDL 合成器可能能够做类似的事情。但是你仍然需要大量的情况,在这种情况下(双关语)你可能还是想使用 case 语句,因为它在有大量选项的情况下提供了更好的可读性。