避免latch的产生

Latch是锁存器,常用于异步电路中存储信息。在同步时序逻辑电路中应避免使用,因为它可能导致不确定状态和设计复杂性增加。文章通过示例解释了在Verilog代码中如何因条件不完整或无else语句而无意创建Latch,并强调了确保组合逻辑电路输出始终有定义状态的重要性,以防止Latch的产生。
摘要由CSDN通过智能技术生成

什么是latch

Latch 其实就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来 存储信息。锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓 冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用。因此,锁存器也被称为透 明锁存器,指的是不锁存时输出对于输入是透明的。

为什么要避免latch

在同步时序逻辑电路中latch会给电路结构带来不必要的麻烦,但是在异步时序逻辑电路中锁存却是必要的。

常见的latch产生的情况

  • 组合逻辑电路中if语句没有else;

  • 组合逻辑中case的条件不能够完全列举时且不加default,

  • 组合逻辑电路中输出变量赋值给自己

情况一:组合逻辑电路中if语句没有else产生latch

module    decorder
(
        input     wire     in_1,
        input     wire     in_2,
        input   wire     in_3,
        
        output  reg  [7:0]     out
);
always@(*)
        if({in_1, in_2, in_3} == 3'b000)
            out = 8'b0000_0001;
        else    if({in_1, in_2, in_3} == 3'b001)
            out = 8'b0000_0010;
        else    if({in_1, in_2, in_3} == 3'b010)
            out = 8'b0000_0100;
        else    if({in_1, in_2, in_3} == 3'b011)
            out = 8'b0000_1000;
        else     if ({in_1, in_2, in_3} == 3'b100)
            out = 8'b0001_0000;
        else     if ({in_1, in_2, in_3} == 3'b101)
            out = 8'b0010_0000;
        else     if ({in_1, in_2, in_3} == 3'b110)
            out = 8'b0100_0000;
        else     if ({in_1, in_2, in_3} == 3'b111)
            out = 8'b1000_0000;
        else//此处如果去掉else,就会产生latch锁存
            out = 8'b0000_0001;
            
endmodule

上述硬件语言仿真的结果为:

 情况二:组合逻辑中case的条件不能完全列举或不写default

module    latch_1
(
        input     wire     in_1,
        input     wire     in_2,
        input   wire     in_3,
        
        output  reg  [7:0]     out
);
always@(*)
    case({in_1,in_2,in_3})
        3'b000 : out = 8'b0000_0001;
        3'b001 : out = 8'b0000_0010;
        3'b010 : out = 8'b0000_0100;
        3'b011 : out = 8'b0000_1000;
        3'b100 : out = 8'b0001_0000;
        3'b101 : out = 8'b0010_0000;
        3'b110 : out = 8'b0100_0000;
        //注释掉最后一种情况,此时case的情况不能完全列举完会产生latch.
        //3'b111 : out = 8'b1000_0000;
        //default : out = 8'b0000_0001;
        endcase
endmodulea

仿真后的硬件电路

情况三:组合逻辑电路中输出变量赋值给自己

module    decorder
(
        input     wire     in_1,
        input     wire     in_2,
        input   wire     in_3,
        
        output  reg  [7:0]     out
);
always@(*)
        if({in_1, in_2, in_3} == 3'b000)
            out = 8'b0000_0001;
        else    if({in_1, in_2, in_3} == 3'b001)
            out = 8'b0000_0010;
        else    if({in_1, in_2, in_3} == 3'b010)
            out = 8'b0000_0100;
        else    if({in_1, in_2, in_3} == 3'b011)
            out = 8'b0000_1000;
        else     if ({in_1, in_2, in_3} == 3'b100)
            out = 8'b0001_0000;
        else     if ({in_1, in_2, in_3} == 3'b101)
            out = 8'b0010_0000;
        else     if ({in_1, in_2, in_3} == 3'b110)
            out = 8'b0100_0000;
        else     if ({in_1, in_2, in_3} == 3'b111)
            out = out;
            
endmodule

 

、仿真后的硬件电路为

总结

在组合逻辑中一定要避免输出信号处于不定的状态,一定要 让输出无论在任何条件下都有一个已知的状态,就可以避免 Latch 的产生。Latch 作为一种 基本电路单元,会影响到电路的时序性能,应尽量避免使用。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值