这主要是出于好奇。
我最近一直在研究的一些VHDL代码中的一个片段类似于以下内容:
led_q <= (pwm_d and ch_ena) when pwm_ena = '1' else ch_ena;
当然,这是一种多面式表达。但它也等同于以下基本逻辑表达式(至少在忽略非二进制状态时):
led_q <= ch_ena and (pwm_d or not pwm_ena);
是一个更好的&#34;在FPGA中实际实现时,逻辑利用率或效率方面的其他因素是什么?是否最好使用一个而不是另一个,或者编译器足够聪明以选择最好的&#34;独自一人?
(好奇的是,表达式的目的是定义LED的状态 - 如果ch_ena
为假,它应该始终关闭,因为通道被禁用,否则它应该是稳定的或者根据{{1}}闪烁pwm_d
(PWM启用)。我认为第一种形式比第二种形式更明显地描述了这一点,尽管它并不太难以实现第二种行为。 )
答案 0 :(得分:6)
对于一个简单的逻辑表达式,如图所示,合成工具可以轻松创建完整的真值表,表达式很可能被转换为内部真值表,然后直接映射到可用的FPGA LUT资源。由于真值表对于两个等价表达式是相同的,因此硬件也是相同的。
但是,对于无法生成完整真值表的复杂表达式,例如当使用算术运算和/或专用资源可用时,综合工具可以选择保持与原始VHDL代码更紧密相关的内部表示,在这种情况下,VHDL编码风格可以对结果逻辑,即使对于等效表达式。
最后,实现是特定于工具的,因此找出生成逻辑的最佳方法是使用特定工具进行尝试,特别是对于设计的大型或时序关键部分,其中实现是关键的