Vhdl MUX是否更多;“昂贵的”;而不是其他逻辑?

Vhdl MUX是否更多;“昂贵的”;而不是其他逻辑?,vhdl,fpga,xilinx,synthesis,Vhdl,Fpga,Xilinx,Synthesis,这主要是出于好奇 我最近研究的一些VHDL代码的一个片段类似于以下内容: led_q <= (pwm_d and ch_ena) when pwm_ena = '1' else ch_ena; led_q对于一个简单的逻辑表达式,如图所示,其中合成工具可以轻松创建一个完整的真值表,该表达式可能会转换为一个内部真值表,然后直接映射到可用的FPGA LUT资源。由于两个等价表达式的真值表相同,因此硬件也将相同 但是,对于无法生成完整真值表的复杂表达式,例如,在使用算术运算时,和/或在专用资源

这主要是出于好奇

我最近研究的一些VHDL代码的一个片段类似于以下内容:

led_q <= (pwm_d and ch_ena) when pwm_ena = '1' else ch_ena;

led_q对于一个简单的逻辑表达式,如图所示,其中合成工具可以轻松创建一个完整的真值表,该表达式可能会转换为一个内部真值表,然后直接映射到可用的FPGA LUT资源。由于两个等价表达式的真值表相同,因此硬件也将相同

但是,对于无法生成完整真值表的复杂表达式,例如,在使用算术运算时,和/或在专用资源可用的情况下,合成工具可以选择保留与原始VHDL代码更密切相关的内部表示形式,在这种情况下,VHDL编码风格会对生成的逻辑产生很大的影响,即使对于等价的表达式也是如此


最后,实现是特定于工具的,因此找出生成什么逻辑的最佳方法是使用特定工具进行尝试,特别是对于设计中的大型或时间关键部分,其中实现是关键的。

通常,这取决于目标体系结构。对于Xilinx FPGA,逻辑主要映射到LUT,偶尔使用硬逻辑资源,映射器可以使用它们。每种可能的LUT配置基本上都具有相同的性能,因此仔细检查映射器的工作几乎没有什么好处,除非您真的在推动设备的速度限制,而您将被迫手动实例化手动映射的LUT

非基于LUT的架构(如Actel/Microsemi设备系列)使用2输入多路复用器作为主要逻辑原语,所有内容都映射到它们。您无法概括什么是所有类型的FPGA和CPLD中最好的,但是现在您可以相信,映射器将通过使用时间约束来完成足够出色的工作,从而将其推向您需要的结果

关于这个问题,我认为最好尽可能避免模糊的布尔表达式。几个月后,当你忘记了你想让他们做什么时,他们往往很难理解。从代码维护的角度来看,我会倾向于
,而不是
。即使对于这个简单的例子,您也必须仔细考虑它描述了什么行为,而
when-else
则直接用人类级别的语法描述了预期的行为

HDL在使用尽可能高的抽象性时工作得最好,并且避免在低级别的位旋转中打滚。如果您充分利用该语言的更高级功能,而不去到处描述原始逻辑,那么VHDL将在这里大放异彩。让合成器来做这项工作。介绍性学习材料侧重于低级结构门描述和逻辑表达式,因为这对于初学者来说是最容易开始的,但从长远来看,这并不是将VHDL用于复杂设计的最佳方式


当然,在某些情况下,布尔运算更好,尤其是在并行执行向量的逐位运算时,这需要凌乱的循环来强制执行相同的操作。这完全取决于上下文。

我倾向于不同意。我曾经有过很多经验,在这些经验中,综合工具在优化高级VHDL方面做了一件非常糟糕的工作,而与低级等效工具相比。这里有一件棘手的事情,你永远不知道合成工具是否做得很好。此外,高级HDL写入方式的微小变化也会对合成结果产生很大影响。如果您使用HDL风格,作为DHL开发人员,您可以很容易地看到代码的数字等价物,那么就可以避免这些不确定性。
led_q <= ch_ena and (pwm_d or not pwm_ena);