描述
一般描述:
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的角度来看,只有四个可能的案例中有一个是指定的,所以它是不完整的。
通过将值分配给每一种情况的完全相同的输出列表来避免这种情况。
没有回复内容