VHDL中If-else和Case语句的区别

电器工程 视频文件 代码设计 rtl
2022-01-24 03:39:33

我想了解如何在 RTL 中综合 VHDL 代码中的不同结构。

  • 谁能告诉我VHDL 中的If-Else构造和 Case 语句构造之间的区别在于代码是如何通过综合工具推断到 RTL 电路中的?
  • 请考虑多个嵌套 if-else的情况以及在流程中将 case语句与 if-else构造混合的情况。
  • 还有什么时候使用哪个构造?

PS:我看到了一个相关的问题“vhdl 中的多个 if 语句”,但这并不能回答我的问题。

2个回答

谁能告诉我 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另一方面,当输入互斥时,使用是合适的。

这篇旧博文中,作者编写并合成了两个功能等效的 VHDL 代码版本。一个使用 if-else,另一个使用 case。结果:

我合成了这段代码并得到了确切的结果。即使是 RTL 原理图,这两个程序也完全相同。

他的结论是:

这说明 'case' 和 'if...elsif...else' 语句都是同样有效的。但是如果你想写一个清晰的代码,那么你最好使用 'case'。'case' 在输出取决于大量条件。但如果条件数量非常少(2 或 3),那么您可以使用“if..elseif..else”。

Stack Overflow 上也有几十篇关于这个主题的帖子,适用于每一种可以想象的语言。结论通常是相同的,即在性能方面没有差异。有时,如果有大量情况,编译器可能足够聪明,可以创建一个查找表,从而产生稍好的性能。

VHDL 合成器可能能够做类似的事情。但是你仍然需要大量的情况,在这种情况下(双关语)你可能还是想使用 case 语句,因为它在有大量选项的情况下提供了更好的可读性。