什么时候会引入锁存器?

什么时候会引入锁存器?如何修改?

  最近在写verilog代码,距离上次写大的verilog 代码已经是一年之前了。再次写,生疏了很多。遇到一些问题,看了一些资料,在这里记录一下。
  这里仅做学习总结用,如有侵权,联系立删。
1.if…else语句或者case语句中所列条件不完整,综合时,会产生锁存器。

example:
always @ ( en ) begin
if ( en ) dout = 1'b1;
end
  当en=0的时候,默认dout的数值保持不变,这个时候就会产生锁存器。

修改1(坏笑):
always @ ( en ) begin
if ( en ) dout = 1'b1;
else dout = dout;
end
  这准确说不能作为修改,因为还是保持原有数值不变,所以还是会有锁存器。

修改2:
always @ ( en ) begin
if ( en ) dout = 1'b1;
else dout = 1'b0;
end

修改3:
always @ ( posedge clk ) begin
if ( en ) dout = 1'b1;
else dout = 1'b0;
end

修改4:
always @ ( posedge clk ) begin
if ( en ) dout = 1'b1;
else dout = dout;
end

修改5:
always @ ( posedge clk ) begin
if ( en ) dout = 1'b1;
end

  上面是缺少else或者default导致分支不完整的情况,还有一种分支不完整容易被忽略,那就是:当使用if-else语句和case语句时,有多个输出,但在每个分支中只对其中的一个或者几个进行赋值,而不是对所有的输出都有明确的指定。

2.组合逻辑进程中不能直接或者间接出现自己赋值给自己的情况。

example:
always @ ( * ) begin
if ( !rst ) cnt = 8'b0;
else ( !rst ) cnt = cnt + 8'b1;
end
  在时序逻辑中这是常用的计数器,就没有引入锁存器的现象。

3.组合逻辑的敏感列表不能少
  对于always块中的输入,在其敏感列表中一定要引入。

不要锁存器的原因有二:

1、锁存器容易产生毛刺

2、锁存器在ASIC(专用集成电路)设计中应该说比ff(触发器)要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和ff来组成锁存器,这样就浪费了资源。(用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一)

3.静态时序分析比较复杂

优点:面积小。锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常见,正是由于它的应用使得CPU的速度比外部IO部件逻辑快许多。latch完成同一个功能所需要的门较触发器要少,所以在asic中用的较多。

一般的设计规则是:在绝大多数设计中避免产生latch。它会让设计的时序十分困难,并且它的隐蔽性很强,非老手不能查出。latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用latch。

有些地方没有时钟,也只能用latch了。比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF,那么setup时间就是在时钟的上升沿需要的时间。这就说明如果数据晚于控制信号的情况下,只能用latch,这种情况就是,前面所提到的latch timing borrow。基本上相当于借了一个高电平时间。也就是说,latch借的时间也是有限的。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值