Verilog十大基本功8 (flipflop和latch以及register的区别)

首先必须放上关于latch的定义和解释。ALTERA 的recommended HDL coding中提到:

A latch is a small combinational loop that holds the value of a signal until a new value is assigned.

从上可以看出,latch是一个记忆元件或者说是存储单元,他能保持信号的值

同时在网上找了找关于latch的中文定义。

锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。

从一般情况来看,锁存器多数是有电平锁存的。当电平无效时,输出信号随输入信号变化,就像通过了缓冲器;当电平有效时,输出信号被锁存。

 看了很多关于verilog的语法资料,大多其中并没有谈到latch,latch和verilog发生联系是在用verilog进行FPGA或者ASIC设计时。而在此由于本人正式学习用verilog进行FPGA设计,

而涉及到的书中均提到要采用同步设计,避免采用latch。从网上找了找为什么不使用latch的原因:

不要锁存器的原因有二:1、锁存器容易产生毛刺,2、锁存器在ASIC设计中应该说比ff要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和ff来组成锁存器,这样就浪费了资源。3、锁存器的出现使得静态时序分析变得更加复杂

所以又可以得出一条指导性的原则:

在能使用DFF或者寄存器的时候,坚决不使用latch

说了latch的定义和latch的危害,现在要来说说latch的产生和避免

查阅资料,结合自己的理解,总结出无意生成latch的三大原因:

1、不完整的if或者case结构

2、不完整的敏感信号列表

latch的出现总是与不完整有关,组合电路本应该是完整的,最理想的写法可能是一个输入对应一个输出,当一个输入没有相应的输出或者引起输出的信号没有作为输入的时候,Latch产生了!

先解释第一点不完整的if结构,例如:

if(a)

begin

 out = 1'b1;

end

当a为1时输出为1,当a为0时由于没有相应的译码语句,所以输出将保持,此时将生成latch而不是原来想要的组合电路。

 

而对于不完整的case语句,例如:

    always@( * )

        case(a)

            3'b000: b = 8'd1;

            3'b001: b = 8'd5;

            3'b010: b = 8'd8;

            3'b011: b = 8'd17;

        endcase

  此时语句中没有default,当a为4、5、6、7时没有响应的译码语句,输出将保持,此时将生成latch。

 

对于第二点不完整的敏感信号表,夏雨闻老师的书中有提到:

如是说道:在赋值表达式右边参与赋值的信号都必须在always@(敏感电平列表)中列出。

如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,那么在综合时,将会为该没有列出的信号隐含地产生一个透明锁存器。

所以得出指导性的原则:

务必写好if和case所有的分支,务必写全敏感信号列表!

昨晚乐鑫笔试题:门电路搭建锁存器

锁存器(latch):是电平触发的存储单元,数据存储的动作(状态转换)取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时,输出才会随着数据输入发生变化。

   分为普通锁存器门控锁存器,普通锁存器无控制信号,输出状态始终直接由输入决定。在实际的数字系统中,为了协调各部分的工作,往往需要有一个特定的控制信号去控制锁存器状态转换的时间,在控制信号无效时,输出保持不变,不随输入变换;当控制信号有效时,输出由输入决定,跟随输入变化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值