这主要是出于好奇.
我最近一直在研究的一些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);
当在FPGA中实际实现时,逻辑利用率或效率方面的"比"更好吗?是否最好使用一个而不是另一个,或者编译器是否足够智能以自己选择"最佳"?
(好奇的是,表达式的目的是定义LED的状态 - 如果ch_ena
为假,它应该始终关闭,因为通道被禁用,否则它应该是固定的或根据闪烁pwm_d
,根据pwm_ena
(PWM启用).我认为第一种形式比第二种形式更明显地描述了这一点,尽管实现第二种形式并不太难.)
对于一个简单的逻辑表达式,如所示,合成工具可以轻松创建一个完整的真值表,表达式很可能被转换为内部真值表,然后直接映射到可用的FPGA LUT资源.由于真值表对于两个等价表达式是相同的,因此硬件也将是相同的.
但是,对于无法生成完整真值表的复杂表达式,例如在使用算术运算时和/或专用资源可用时,综合工具可以选择保持与原始VHDL更密切相关的内部表示代码,在这种情况下,即使对于等效表达式,VHDL编码样式也会对结果逻辑产生很大影响.
最后,实现是特定于工具的,因此找出生成逻辑的最佳方法是使用特定工具进行尝试,特别是对于设计的大型或时序关键部分,实现至关重要.