• 时序电路—之锁存器


    verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因。

    一,什么是锁存器?锁存器与触发器的区别。http://www.eefocus.com/liuyuxue/blog/13-11/300280_d7008.html

      锁存器与触发器最大的区别在于,锁存器是电平触发,而触发器是边沿触发。锁存器在不锁存数据时,输出随输入变化;但一旦数据锁存时,输入对输出不产生任何影响。

    锁存器和触发器区别

    http://wenku.baidu.com/link?url=co1YvI0Ktb7sItCPzqNXiy7SXyWigv7uAnWaL3EtOT_7T7XsYOXIcfCTlYvlqPgPhy3bBpbeiQAcM2hVAUbK9qiJxRI3F0JctHaLCsWrYiS(写的挺好的)

    二,为什么语句的不完整会导致锁存器的产生?

    解:

    老阮 (2014-10-21 19:30:10)
    1、时序电路,生成触发器,触发器是有使能端的,使能端无效时数据不变,这是触发器的特性。
    2、组合逻辑,由于数据要保持不变,只能通过锁存器来保存。
    楼主位的第二个代码就是在enable为低时,数据不变,因此要生成锁存器。 第一个代码,由于是时序逻辑,生成的触发器在enable无效时就可以保存数据。跟锁存器无关。
     
    个人理解: 所谓生成latch其实是针对使用always语句描述一个组合逻辑而言,因为如果描述时序逻辑总是使用时钟或者时钟+复位作为敏感列表条件,所生成的电路总是组合逻辑+DFF;如果是描述组合逻辑,敏感列表中必然没有时钟复位,而是组合逻辑的输入信号。在FPGA设计,避免使用latch,不利于时序分析和仿真。 楼上有提到latch比DFF省资源, 这个在FPGA设计中其实还好, 因为在FPGA中DFF就是一个专用的硬件资源,并且数量也比较多。

    使用always描述组合逻辑时,好的习惯是使用always @(*)作为敏感列表, 并且需要检查每个分支都有明确的赋值,从而避免生成latch.
     
    我是这么理解的,在一份资料看的,
    时序电路=组合逻辑电路+储存电路;
    储存电路有两个:锁存器(latch)和触发器;
    边沿触发产生触发器,
    电平触发产生锁存器,
    多个触发器组成寄存器,

    当描述的是时序电路,寄存器变量对应的寄存器,
    描述的是完整的组合逻辑电路,对应为硬件连线,
    当描述的是不完整组合逻辑,则寄存器对应的是锁存
     
     
     
    总结:
    1,存储单元按照触发的方式分为电平触发和边沿触发,电平触发的为锁存器,边沿触发的触发器。                                                                                                     2,对于if,case的完整性,@老阮已经说的很清楚了,在FPGA建议使用触发器。                                                                                                                                                                                                                                                
     
  • 相关阅读:
    核心思想:台积电目前的硬体核心技术/制造人力估计不到1,000人
    忽然懂了:云就是互联网
    Qt https 用户认证authenticationRequired()
    TDD和BDD
    MEF实现设计上的“松耦合”
    跨域调用webapi
    复杂度
    react
    Angularjs里面跨作用域
    Spring.NET程序
  • 原文地址:https://www.cnblogs.com/rrttp/p/5945082.html
Copyright © 2020-2023  润新知