1.Latch简介

Latch就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息

锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,数据就会被锁存,输入信号不起作用,因此,锁存器也被称为透明锁存器,指的是不锁存时输出对于输入是透明的

2. 异步电路与同步电路

异步电路:异步电路主要是组合逻辑,用于产生FIFO或者RAM的读写控制信号脉冲,但是它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才发生变化

同步电路:同步电路是由时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路,其所有操作都是在严格的时钟控制下完成的,这些时序电路共享一个时钟CLK,而所有的状态变化都是在时钟上升沿(或者下降沿)完成的

异步电路中广泛使用的是Latch,在异步电路中可以使用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
  • 代码每次修改之后都要进行重新编译

08-避免Latch的产生的更多相关文章

  1. 案例:latch: cache buffers chains event tuning

    前两天对oracle数据库(single instance)进行了迁移升级从10.2.0.4 升到11.2.0.3,有一个项目迁完后第二天,cpu负载升到了130更高(16cpus). 向用户询问后使 ...

  2. [20190416]process allocation latch.txt

    [20190416]process allocation latch.txt --//看链接:http://andreynikolaev.wordpress.com/2010/12/16/hidden ...

  3. [20190415]关于shared latch(共享栓锁).txt

    [20190415]关于shared latch(共享栓锁).txt http://andreynikolaev.wordpress.com/2010/11/17/shared-latch-behav ...

  4. [20190415]10g下那些latch是共享的.txt

    [20190415]10g下那些latch是共享的.txt http://andreynikolaev.wordpress.com/2010/11/23/shared-latches-by-oracl ...

  5. [20190415]11g下那些latch是共享的.txt

    [20190415]11g下那些latch是共享的.txt http://andreynikolaev.wordpress.com/2010/11/23/shared-latches-by-oracl ...

  6. 关于latch: cache buffers chains的sql优化

    前段时间,优化了一些耗buffer比较多的sql,但是CPU使用率还是没下来 . 查看操作系统CPU使用率 查看awr,发现又有一条超级耗性能的sql冒出来了. 该SQL每次执行耗费3e多个buffe ...

  7. [转帖]Latch

    Latch (转) http://blog.csdn.net/tianlesoftware/article/details/5263238 2013-05-24 15:33:09 huashanlun ...

  8. Buffer Latch Timeout的解析

    [问题描述] 我们可能会在数据库的错误日志里,发现这么一条信息: A time-out occurred while waiting for buffer latch -- type 4, bp 00 ...

  9. [20200223]关于latch and mutext的优化.txt

    [20200223]关于latch and mutext的优化.txt --//前一段时间一直在测试使用DBMS_SHARED_POOL.MARKHOT标识热对象以及sql语句的优化.--//有别人问 ...

  10. PMON failed to acquire latch, see PMON dump

    前几天,一台Oracle数据库(Oracle Database 10g Release 10.2.0.4.0 - 64bit Production)监控出现"PMON failed to a ...

随机推荐

  1. 【笔记整理】忽略https证书校验

    import requests url = "https://sam.huat.edu.cn:8443/selfservice/" # 默认不忽略ssl证书,如果有证书问题的网站会 ...

  2. Socket.D 替代 Http 协议像 Ajax 一样开发前端接口

    我们在"前端接口"开发时,使用 socket.d 协议有什么好处: 功能上可以替代 http 和原生 ws 更安全!现有的工具想抓包数据,难!难!难!(socket.d 是个新的二 ...

  3. bash命令的使用

    bash的工作特性之命令执行状态返回值和命令展开所涉及的内容及其示例演出 !脚本执行与调试 1.绝对路径执行,要求文件有执行权限 2.以sh命令执行,不要求文件有执行权限 3..加空格或source命 ...

  4. java中final关键字的使用

              1 :在java中final可以修饰类,方法,变量(包括成员变量和局部变量) 第一点:修饰类 特点:修饰的类不能被继承而且成员变量也是可以根据自己需要设置fianl 但final类 ...

  5. kubernetes之部署springboot项目jar项目(三)

    kubernetes之部署war项目(三) k8s系列 源自我工作上的实际场景,记录于此. k8s部署springboot项目 假设我的jar项目是:myjar.jar 用到的环境 centos 7. ...

  6. Java NIO 简介

    NIO 简介 ​ 自 JDK 1.4 以来,引入了一个被称为 NIO(New IO) 的 IO 操作,是标准 IO 一个替代品.Java 的 NIO 提供了一种与传统意义上的 IO 不同的编程模型.有 ...

  7. Java异常中处理return

    Java中的return语句 在Java中,return语句用于从一个方法中返回结果,并终止当前方法的执行.在方法中使用return语句后,后续的语句将不会执行. public int add(int ...

  8. 一文带你了解华为云GaussDB的五大黑科技

    摘要:在华为开发者大会2021(HDC·Cloud)中,华为云数据库多位技术专家分享了GaussDB系列数据库全新5大黑科技. 4月24-26日,华为开发者大会2021(HDC·Cloud)在深圳隆重 ...

  9. vue2升级vue3:vue3 hooks库选用

    之前a-hooks:https://ahooks.js.org/,比react-use 精简好用.但是没有vue版本的. 网上有个人实现的:https://github.com/dewfall123/ ...

  10. VS 2019 目标框架中看不到 Net Core 3.X

    VS 2019 目标框架中没有 .NET Core 3.X..Net 5.0 https://dotnet.microsoft.com/download/dotnet-core/3.0 Visual ...