VHDL中的Case语句与If-else

VHDL中的Case语句与If-else,vhdl,Vhdl,VHDL中if-else和case语句的主要区别是什么。虽然两者看起来很相似,有时会互相替换。但经过综合后,逻辑电路会出现什么我们什么时候应该使用if else或case语句?假设if语句和case语句描述相同的行为,那么在合成工具完成转换和优化后,生成的电路可能是相同的 正如Paebbels在评论中所写,相关综合指南中描述了每个工具的详细信息,并且可能存在结果可能不同的工具依赖情况,但作为一般工作假设,综合工具将进入相同的电路,以获得等效的if语句和case语句 关键点通常是生成正确且可维护的

VHDL中if-else和case语句的主要区别是什么。虽然两者看起来很相似,有时会互相替换。但经过综合后,逻辑电路会出现什么我们什么时候应该使用if else或case语句?

假设if语句和case语句描述相同的行为,那么在合成工具完成转换和优化后,生成的电路可能是相同的

正如Paebbels在评论中所写,相关综合指南中描述了每个工具的详细信息,并且可能存在结果可能不同的工具依赖情况,但作为一般工作假设,综合工具将进入相同的电路,以获得等效的if语句和case语句

关键点通常是生成正确且可维护的VHDL代码,这里的可读性很重要,因此,根据代码最直接的部分选择if语句或case语句,,不要试图通过VHDL构造控制生成的电路,除非有特殊原因需要这样做


请注意,在if语句中,早期条件优先于后期条件,但在case语句中,所有
when
具有相同的优先级。

请记住,VHDL是并行编程语言,是声明式编程的一种形式,与c/c++和其他顺序语言等过程式编程不同

这意味着本质上,您是在告诉或试图用代码向编译器描述行为应该是什么,而不是具体告诉编译器在过程编程中应该做什么或行为是什么样的。这可能是促使你提出这个问题的原因

但是现在请记住,if或case的顺序将影响合成。现在的FPGA,逻辑的所有组合部分都是以循环表的形式出现的,循环表内部设计为级联阵列多路复用器,组合在一起形成LUT,输入编号N通常为4,编译器决定如何配置这些LUT阵列

排序会影响编译器在解析输出之前计算的级联多路复用器的数量

请注意,尽管理论上讲,if和switch都有可能获得相同的行为。Case是查看单个变量并为每个可能的结果确定案例,而If语句可以同时应用于多个变量

那么灵活性呢?我想说如果。然而,强大的力量带来巨大的责任,如果它很容易使用来自各地的多个信号,如果做得不好,可能会导致糟糕的设计,即耦合太多的变量,任何更改都可能由于太多的依赖性问题而失败。Case适用于状态机,但我想对于过程语言也是如此


此外,如果使用太多不同的信号作为if的条件,则可能会影响计时。这可能意味着你的时钟频率受到限制,如果你在高速工作,而且这个列表还在继续。时钟偏移、需要限制信号等。

只有使用合成工具“合成指南”才能详细回答此问题。每个供应商都有如何将VHDL语句转换为逻辑的文档。这两种陈述都有优点和缺点。通常情况下,您的合成工具应该为这两种表单生成最佳代码,因此请使用可读性和可维护性更好的代码。
if/then/elsif/else
可能有不相关的条件,
case
根据一组值或范围测试同一对象。case/selected signal赋值语句需要覆盖计算表达式-选项的每个值。If/conditional signal assignment语句选择表示优先级的第一个有效条件表达式,