关于FPGA中锁存器的生成:if语句和case语句的完整性影响-FPGA常见问题社区-FPGA CPLD-ChipDebug

关于FPGA中锁存器的生成:if语句和case语句的完整性影响

锁存器(Latch)是数字逻辑电路中很重要的一种基本电路,常见的锁存器包括三个端口:数据输入口、数据输出口、使能端。当使能端为高电平时,输入口的数据直接送到输出口,此时输入输出口可以看成是直接连通的;当使能端为低电平时,输出口的数据保持之前的数据不变,无论输入口的数据怎么变化,输出都保持不变,就是把原来的状态锁存下来了(所以才叫锁存器)。锁存器与触发器的区别在于:**锁存器是电平触发,而触发器是边沿触发。**锁存器在不锁存数据时,输出随输入变化;但一旦数据锁存时,输入对输出不产生任何影响。
数字电路设计中,不规范的描述语言,往往会产生意想不到的锁存器,导致综合出的数字电路出现逻辑错误。
在数字电路中,产生意外的锁存器的情况一般有以下两种:
1、if…else…语句结构中没有else
是不是在所有情况下,只要if后边没有else就会产生锁存器呢?
(1)缺少else时,先看时序电路代码和RTL图:
图片[1]-关于FPGA中锁存器的生成:if语句和case语句的完整性影响-FPGA常见问题社区-FPGA CPLD-ChipDebug
图片[2]-关于FPGA中锁存器的生成:if语句和case语句的完整性影响-FPGA常见问题社区-FPGA CPLD-ChipDebug
没有else时,再看组合逻辑电路代码和RTL图:

图片[3]-关于FPGA中锁存器的生成:if语句和case语句的完整性影响-FPGA常见问题社区-FPGA CPLD-ChipDebug

小结:
(1)缺少else时,时序电路的RTL图生成的是一个FDRE,即D型触发器,没有生成锁存器。
(2)缺少else时,组合逻辑电路的RTL图中生成了一个LDCE,即带异步复位的锁存器 。
(2) if…else…完整时,先看时序电路代码和RTL图:

图片[4]-关于FPGA中锁存器的生成:if语句和case语句的完整性影响-FPGA常见问题社区-FPGA CPLD-ChipDebug

再看组合逻辑电路代码和RTL图:

图片[5]-关于FPGA中锁存器的生成:if语句和case语句的完整性影响-FPGA常见问题社区-FPGA CPLD-ChipDebug

小结:
(1)if…else,结构完整时,时序电路的RTL图生成的还是一个FDRE,即D型触发器,与没有else时结果一样。
(2)if…else,结构完整时,组合逻辑电路的RTL图中生成了一个LUT2,即查找表,不再生成锁存器了 。
结论:
在时序电路中,if…else…结构完整与否对是否生成锁存器没有关系
在组合逻辑电路中,if…else…结构完整与否,直接影响组合逻辑电路是否生成锁存器。
在组合逻辑电路中,if…else…结构不完整时会导致电路生成不必要的锁存器,可能会导致综合出的组合逻辑电路的逻辑是错误的。
2、case结构中的分支没有包含所有情况且没有default语句、
此种情况经测试,与if…else…结构是否完整的结果是一样的。此处就省略去一万个字了。
因此,在设计组合逻辑电路时,要注意将 if…else… 结构中的else写完整,case结构中一定要加上default语句,这样可以减少综合出锁存器的可能性。

请登录后发表评论

    没有回复内容