关于verilog中if与case语句不完整产生锁存器的问题
2017-11-22 13:33
351 查看
http://www.eefocus.com/guoke1993102/blog/14-04/302739_882d2.html
在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因。
一,什么是锁存器?锁存器与触发器的区别。
锁存器与触发器最大的区别在于,锁存器是电平触发,而触发器是边沿触发。锁存器在不锁存数据时,输出随输入变化;但一旦数据锁存时,输入对输出不产生任何影响。
二,为什么语句的不完整会导致锁存器的产生?
语句不完整即有某些情况的输入对输出无任何影响,根据锁存器的特征,反映到硬件电路即会产生锁存器。
举例说明:
图一 图二
这是一段简单的组合逻辑代码。图一是缺少default的case语句,图二是完整的case语句。
图一综合后的的RTL级电路为
即产生了锁存器,而且ISE也会给出警告:
而图二完整的case语句综合后的RTL级电路为:
产生的是普通的门电路,且警告消失。
三,为什么要避免产生锁存器?
关于这个问题,我在网上看到很多资料说是因为锁存器对毛刺敏感。但其实不是这个原因,因为在组合电路中,即便语句完整了,也会对毛刺敏感。而如果你加一个时钟变为时序电路的话,即便你的语句不完整,产生了锁存器(其实在时序电路中,即便语句不完整,也不会产生锁存器),那么也不会对毛刺敏感。
真正的原因在于FPGA中根本没有锁存器这种东西,也就是说,如果你产生了锁存器的话,将耗费更多的资源来构成它。
还有一个原因就是不利于时序路径的分析(关于这点我还不懂,待日后更深入的学习再解释)。
四,只要语句完整就不会有锁存器吗?
在很多情况下,我们希望某个值保值其原有值,既不一定是0,也不一定是1,只需要保持。比如下面代码:
always @ (a or data_in)
if(a) data_out=data_in;
else data_out=data_out;
这个时候if/else文件是完整,但是依然产生了锁存器,因为我们这个电路所描述的功能就是一个锁存器。其实语句不完整和else data_out=data_out;是一样的。在这里,我所希望的就是保持数值,但这种情况可以通过增加一个寄存器来保持,也不应该生成一个锁存器。
最后,锁存器只存在于组合电路中,在时序电路上是不存在的。
以上总结参考了网上很多人的文章,在此表示感谢,而且对这个问题我还有不明白之处,恳请大家批评指正。
http://www.eefocus.com/guoke1993102/blog/14-04/302739_882d2.html
在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因。
一,什么是锁存器?锁存器与触发器的区别。
锁存器与触发器最大的区别在于,锁存器是电平触发,而触发器是边沿触发。锁存器在不锁存数据时,输出随输入变化;但一旦数据锁存时,输入对输出不产生任何影响。
二,为什么语句的不完整会导致锁存器的产生?
语句不完整即有某些情况的输入对输出无任何影响,根据锁存器的特征,反映到硬件电路即会产生锁存器。
举例说明:
图一 图二
这是一段简单的组合逻辑代码。图一是缺少default的case语句,图二是完整的case语句。
图一综合后的的RTL级电路为
即产生了锁存器,而且ISE也会给出警告:
而图二完整的case语句综合后的RTL级电路为:
产生的是普通的门电路,且警告消失。
三,为什么要避免产生锁存器?
关于这个问题,我在网上看到很多资料说是因为锁存器对毛刺敏感。但其实不是这个原因,因为在组合电路中,即便语句完整了,也会对毛刺敏感。而如果你加一个时钟变为时序电路的话,即便你的语句不完整,产生了锁存器(其实在时序电路中,即便语句不完整,也不会产生锁存器),那么也不会对毛刺敏感。
真正的原因在于FPGA中根本没有锁存器这种东西,也就是说,如果你产生了锁存器的话,将耗费更多的资源来构成它。
还有一个原因就是不利于时序路径的分析(关于这点我还不懂,待日后更深入的学习再解释)。
四,只要语句完整就不会有锁存器吗?
在很多情况下,我们希望某个值保值其原有值,既不一定是0,也不一定是1,只需要保持。比如下面代码:
always @ (a or data_in)
if(a) data_out=data_in;
else data_out=data_out;
这个时候if/else文件是完整,但是依然产生了锁存器,因为我们这个电路所描述的功能就是一个锁存器。其实语句不完整和else data_out=data_out;是一样的。在这里,我所希望的就是保持数值,但这种情况可以通过增加一个寄存器来保持,也不应该生成一个锁存器。
最后,锁存器只存在于组合电路中,在时序电路上是不存在的。
以上总结参考了网上很多人的文章,在此表示感谢,而且对这个问题我还有不明白之处,恳请大家批评指正。
相关文章推荐
- 关于verilog中if与case语句不完整产生锁存器的问题 分类: FPGA 2014-11-08 17:39 260人阅读 评论(0) 收藏
- 关于verilog中if与case语句不完整产生锁存器的问题
- 关于verilog中if与case语句不完整产生锁存器的问题
- 使用case语句来改善verilog代码中if……else分支过多的问题
- Verilog中if..else和case语句分析
- 关于if语句引出的问题(C++ VS javascript)
- Stackoverflow上关于if-else语句的有趣问题
- 关于在case语句中添加局部变量的问题(error C2360)
- if语句和switch语句 关于时间的三个问题
- 关于case when语句的报错问题详解
- 关于if语句的问题
- 关于mybatis的动态if语句查询报错问题和解决方法
- Verilog-FPGA硬件电路设计之一——if语句优先级问题
- 关于hql执行带有case when 的语句问题,另:数据表的倒置
- 关于C/C++中switch语句case中变量不能初始化赋值的问题
- 关于python中的if __name__=='__main__'语句问题
- verilog中锁存器的问题
- 不使用乘除法,for,while,if,else,switch,case,条件判断语句(A?B:C) 实现:1+2+....+n
- 关于SQL语句前加自动编号的问题
- 这个if语句怎么运行?附加关于编码规范的思考