多路复用器是否比其他逻辑更多 "expensive"?

Are muxes more "expensive" than other logic?

这主要是出于好奇。

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

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

当然,这是一个 mux 风格的表达式。但它也等同于以下基本逻辑表达式(至少在忽略非二进制状态时):

led_q <= ch_ena and (pwm_d or not pwm_ena);

当实际在 FPGA 中实现时,一个 "better" 在逻辑利用率或效率方面是否优于另一个?是更好地使用一个而不是另一个,还是编译器足够聪明,可以自己选择 "best"?

(出于好奇,该表达式的目的是定义 LED 的状态——如果 ch_ena 为假,则应始终关闭,因为通道被禁用,否则它应该打开根据 pwm_d 稳定或闪烁,根据 pwm_ena(PWM 启用)。我认为第一种形式比第二种形式更清楚地描述了这一点,尽管不难理解第二种形式的行为。)

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

但是,对于无法生成完整事实的复杂表达式 table,例如当使用算术运算时,and/or 在有专用资源可用的情况下,综合工具可能会选择保留与原始 VHDL 代码更密切相关的内部表示,在这种情况下,VHDL 编码风格会产生很大影响在结果逻辑上,即使是等效表达式。

最后,实现是特定于工具的,所以找出生成什么逻辑的最佳方法是使用特定工具进行尝试,特别是设计的大型或时序关键部分,实现在哪里很关键。

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

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

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

当您使用尽可能高的抽象并避免沉迷于低级位时,HDL 的效果最好。如果您利用该语言的更高级功能并摆脱到处描述原始逻辑,这就是 VHDL 真正闪耀的地方。让合成器完成工作。入门学习材料侧重于低级结构门描述和逻辑表达式,因为这对初学者来说最容易上手,但它不是使用 VHDL 进行复杂设计的最佳方式长 运行.

当然,在某些情况下,布尔值会更好,特别是在并行地跨向量执行按位运算时,这需要凌乱的循环来命令式地执行相同的操作。这完全取决于上下文。