打印

请教锁存器过多危害

[复制链接]
2786|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andiwxz|  楼主 | 2012-10-10 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位:     我刚刚接触fpga,写程序时别人建议,每一个时钟节拍都要对变量赋值,否则就会自动生成锁存器,锁存上一节拍的值。请问我要是不是每个节拍都赋值,生成的锁存器多了会有什么不好的后果

相关帖子

沙发
GoldSunMonkey| | 2012-10-10 13:48 | 只看该作者
其实并不是说锁存器会有什么坏处,只是产生锁存器一般都是不想得到的(锁存器是由
电平触发的存储器)。用verilog写的话,进程有两种,一种是电平触发的,一种是边缘
触发的。边沿触发的是触发器,电平触发的一般是组合逻辑,但也有锁存器,有时会需
要锁存器。但锁存器的产生一般并不是我们所希望得到的。
看下边的例子:(如果你用的VHDL,也是类似)
reg [2:0]
case(a)
  0:q=d0;
  1:q=d1;
  2:q=d2;
  3:q=d3;
  4:q=d4;
endcase
可能是根本不需要a等于其它值的情形,或者是电路根本不会产生a的其它值(实际上不
可能不产生其它值的)。但综合器不这样认为,他会产生一个锁存器来保存状态,所以
综合后的结果就不完全是个数据选择器,而是选择器加一个锁存器,这个锁存器当然是
不需要的。所以case语句如果不完全一定要加一个default项。
在上面的语句中加入default:q='bx;
这样就可以避免产生锁存器,生成一个单纯的选择器(组合逻辑)。不光是case语句,
就是if语句在电平触发的的进程中如果有一个else分支没有对某个变量进行赋值的话也
会产生锁存器。还有事件敏感表中变量不完全也是同理。边沿触发的不会有这种担心,
因为边沿触发的本身就是存储器,可以保持状态的。

使用特权

评论回复
板凳
ji7411| | 2012-10-10 14:03 | 只看该作者
猴哥V5

使用特权

评论回复
地板
GoldSunMonkey| | 2012-10-10 14:08 | 只看该作者
猴哥V5
ji7411 发表于 2012-10-10 14:03
;P

使用特权

评论回复
5
星星之火红| | 2012-10-10 17:36 | 只看该作者
:)
Backkom80 发表于 2012-10-10 17:30
回来了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

166

主题

258

帖子

3

粉丝