FPGAExpress-我如何避免闩锁推论?-Xilinx-AMD社区-FPGA CPLD-ChipDebug

FPGAExpress-我如何避免闩锁推论?

描述

一般描述:

FPGA Express将把HDL代码综合到各种逻辑元件中,包括触发器、组合门、三态缓冲器和锁存器。对于Xilinx器件,内部锁存器不是资源的有效使用,因为它们将使用组合逻辑来构建(如果特定的目标家庭没有内部锁存器);因此,尽可能避免闩锁推断是您的最佳利益。

闩锁是当进程在某些条件下未定义时创建的;这使得FPGAExpress别无选择,只能推断闩锁以“保持”进程的当前值,以防出现未指定的条件。这可能发生在case语句中。

解决方案

在case语句中包含所有可能的情况。

Verilog:

总是@(SEL或DIN或DIN)

开始

案例(SEL)

2’B00:Dout<=DI1+DIN;

2’B01:DUT&Lt= DIN 1-DIN;

2’B10:DUT&Lt= DIN1;

端部病例

结束

VHDL:

进程(SEL,DIN,DIN 2)

开始

案例SEL

当“00”=DUT1+DIN;

当“01”=dU& lt=DIN1-DIN;

当“10”=dU& lt=DIN1时;

结束情况;

结束过程;

这两个示例将创建锁存器,因为当SEL=“11”时没有提供任何情况。为了消除锁存器,添加另一个条目来解决这种可能性。

Verilog:

2’B11: DUT & lt;= DIN 2;

VHDL:

当“11”=dU& lt=DIN 2时;

使用默认子句(Verilog)或当其他(VHDL)总是工作时,但这可能产生无关逻辑。这总是最安全的方法,但它可能会产生更大和更慢的设计,因为任何未知的状态都有逻辑把它带到一个已知的状态。

在每种情况下分配给所有相同的输出。

Verilog:

总是@(SEL或DIN或DIN)

开始

案例(SEL)

2’B00:Dout<=DI1+DIN;

2’B01:DUT&Lt= DIN 1-DIN;

2’B10:DUT&Lt= DIN1;

2’B11:

开始

DON2;

温度=DIN1;

结束

端部病例

结束

VHDL:

进程(SEL,DIN,DIN 2)

开始

案例SEL

当“00”=DUT1+DIN;

当“01”=dU& lt=DIN1-DIN;

当“10”=dU& lt=DIN1时;

当“11”=gt;

DON2;

温度=DIN1;

结束情况;

结束过程;

这些示例将推断锁存器,因为“11”的情况分配两个输出,而其他的仅分配一个输出。从TEMP的角度来看,只有四个可能的案例中有一个是指定的,所以它是不完整的。

通过将值分配给每一种情况的完全相同的输出列表来避免这种情况。

请登录后发表评论

    没有回复内容