首页 > 其他分享 >08-避免Latch的产生

08-避免Latch的产生

时间:2023-05-23 20:56:01浏览次数:31  
标签:wire b0000 08 电路 避免 input Latch out

1.Latch简介

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

2. 异步电路与同步电路

异步电路:异步电路主要是组合逻辑,用于产生FIFO或者RAM的读写控制信号脉冲,但是它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才发生变化
同步电路:同步电路是由时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路,其所有操作都是在严格的时钟控制下完成的,这些时序电路共享一个时钟CLK,而所有的状态变化都是在时钟上升沿(或者下降沿)完成的
异步电路中广泛使用的是Latch,在异步电路中可以使用Latch替代寄存器,但是在同步电路中,Latch对于电路会出现不好的结果

  • 对于毛刺敏感
  • 不能异步复位,上电之后处于不定态
  • 占用更多的逻辑资源
  • 额外延迟
  • 复杂的静态时序分析

3.几种产生Latch的情况及避免

  • 组合逻辑中if-else语句,缺少else语句
  • 组合逻辑中case条件分支语句条件未完全列举,且缺少default语句(在使用case语句的时候要么完全列举所有情况,要么加default)
  • 组合逻辑中输出变量赋值给了自己

4.验证Latch

使用之前写过的3-8译码器进行验证Latch
.qpf结尾的文件就是之前创建的quartus项目文件,双击可以打开quartus项目

4.1 正确的代码

module decoder(
  input wire in_1,
  input wire in_2,
  input wire in_3,
  
  output reg [7:0] out
);

  always@(*) begin
    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 
      out <= 8'b0000_0001;
  end

endmodule

4.2 if-else 产生latch

module decoder(
  input wire in_1,
  input wire in_2,
  input wire in_3,
  
  output reg [7:0] out
);

  always@(*) begin
    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 
    //  out <= 8'b0000_0001;
  end

endmodule

4.3 case语句产生latch情况

```plaintext
module decoder
(
  input wire in_1,
  input wire in_2,
  input wire in_3,
  output reg [8:0] out
);
 
  // 使用case语句
  // 使用if-else语句
  always@(*)
  begin
    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;  
      // 3'b111 : out = 8'b1000_0000;
      // default : out = 8'b0000_0001;
    endcase
  end
endmodule

正常代码综合

错误代码综合

4.4 将变量赋值给自己

module decoder
(
  input wire in_1,
  input wire in_2,
  input wire in_3,
  output reg [8:0] out
);
 
  // 使用case语句
  // 使用if-else语句
  always@(*)
  begin
    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;  
      3'b111 : out = 8'b1000_0000;
      default : out = out;    // 将输出变量赋值给自己,也会产生latch
    endcase
  end
endmodule
  • 代码每次修改之后都要进行重新编译

标签:wire,b0000,08,电路,避免,input,Latch,out
From: https://www.cnblogs.com/Icer-newer/p/17421915.html

相关文章

  • 1080. 根到叶路径上的不足节点
    给你二叉树的根节点root和一个整数limit,请你同时删除树中所有不足节点,并返回最终二叉树的根节点。假如通过节点node的每种可能的“根-叶”路径上值的总和全都小于给定的limit,则该节点被称之为不足节点,需要被删除。叶子节点,就是没有子节点的节点。来源:力扣(LeetCode......
  • 超低功耗SUB 1G无线收发+32位 Soc芯片UM2080F32 无线集抄/测温/养老院人员定位
    UM2080F32是一款超低功耗32位IoTP:ARM®Cortex®-M0+,64KBFlash,16KBSRAM,Sub-1GHz射频收发器。工作于200MHz~960MHz范围内。UM2080F32内部还集成了CAN、12位SARADC、UART、SPI、QSPI、I2C等通用外围通讯接口,ADC、OPA、比较器等传感获取接口,以及LPTIMER、WDT等超低功耗......
  • poj-1308
    //392K0MSG++#include<cstdio>#include<cstring>usingnamespacestd;constintMAX=10000;intUF_set[MAX];voidUF_get_setId(intcurId){intparentId=UF_set[curId];if(parentId==0){return;}while(UF......
  • C# Winform按钮避免重复点击
    btn_01.Enabled=false;//执行任务的函数和代码//执行任务的函数和代码Application.DoEvents();btn_01.Enabled=true;就是让应用程序的消息队列自动走完(在按钮正常前清空消息队列即可)......
  • 08-输入输出系统
    08-输入输出系统一、概述1.输入输出系统的发展概况1)早期分散连接CPU和I/O设备串行工作程序查询方式2)接口模块和DMA阶段总线连接CPU和I/O设备并行工作中断方式DMA方式3)具有通道结构的阶段4)具有I/O处理机的阶段2.输入输出系统的组成1)I/O软件I/O指令CPU指令号......
  • python day08 字典、元组、集合内置方法
    字典的内置方法定义方式d={'usernamne':"kevin"}定义空字典:d={}1.key取值dic={'name':'kevin','age':18,'hobbies':['playgame','basketball']}print(dic['name'])#kevinp......
  • python基础08
    字典的内置方法1#dic={'username':"kevin",'age':18}2#定义空字典3#d={}4#info=dict(username='kevin',age=18)5#print(info)67##1.支持key取值8#new_dic=dic['username']9#print(new_dic)10#ite......
  • 如何避免windows update自动更新关闭后,仍然是开启的状态。彻底解决办法
    为了禁止系统自动更新,很多用户都会禁用WindowsUpdate服务,但是后来发现它还会自动开启,这该怎么办?针对这个问题,下面小编就来告诉大家。一、关闭更新服务后还要禁止它恢复启动1、按WIn+R调出运行,输入【services.msc】或此电脑右键--管理--服务和应用程序--服务。2、在右......
  • 力扣---1080. 根到叶路径上的不足节点
    给你二叉树的根节点root和一个整数limit,请你同时删除树中所有不足节点,并返回最终二叉树的根节点。假如通过节点node的每种可能的“根-叶”路径上值的总和全都小于给定的limit,则该节点被称之为不足节点,需要被删除。叶子节点,就是没有子节点的节点。 示例1:输入:r......
  • 天梯赛L1-085 试试手气
    一、问题描述我们知道一个骰子有6个面,分别刻了1到6个点。下面给你6个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;2、在......