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. 接手了个项目,被if..else搞懵逼了

    背景 领导:"这个项目,今后就给你维护了啊,仔细点." 小猫:"好,没问题". 可当满怀信心的小猫打开项目工程包翻看一些代码之后,瞬间懵逼没了信心. 是这样的 ...

  2. 为什么许多数字孪生产品开始了GIS融合的尝试?

    随着数字孪生技术的发展,越来越多的产品意识到要实现数字孪生的最大价值,需要考虑多个维度的数据,包括空间信息.地理位置.环境条件等.因此,许多数字孪生产品开始了与GIS系统的融合尝试,以进一步提升其功能 ...

  3. Shell的概念、shebang、bash的概念

    什么是shell shell的作用是 解释执行用户输入的命令或程序等 用户输入一条命令,shell就解释一条 键盘输入命令,Linux给与响应的方式,称之为交互式 linux的计算机是如何跟用户进行交 ...

  4. Spring 事务的实现原理

    在执行访问数据库相关的操作中,特别是针对数据的修改操作,由于对于数据的修改可能会出现异常,因此对于整个一组的数据修改实际上都不能算是生效的,在这种情况下,需要使用事务的 "回滚" ...

  5. MySQL 基础(三)事务与 MVCC

    事务 事务是一组原子性的 SQL 操作,或者被称为一个独立的工作单元,如果数据库引擎能够成功地对数据库应用该组的全部 SQL 语句,那么就会全部执行,否则全部不执行. 事务的特性 在关系数据库管理系统 ...

  6. 【Python】人工智能-机器学习——不调库手撕深度网络分类问题

    1. 作业内容描述 1.1 背景 数据集大小150 该数据有4个属性,分别如下 Sepal.Length:花萼长度(cm) Sepal.Width:花萼宽度单位(cm) Petal.Length:花瓣 ...

  7. 3种依赖管理工具实现requirements.txt文件生成

    1.pip 实现方式   要使用 pip 生成 requirements.txt 文件,可以使用以下命令: pip freeze > requirements.txt   这个命令会将当前环境中 ...

  8. 容器中域名解析流程以及不同dnsPolicy对域名解析影响

    本文分享自华为云社区<容器中域名解析流程以及不同dnsPolicy对域名解析影响>,作者:可以交个朋友 . 一.coreDNS背景 部署在kubernetes集群中的容器业务通过coreD ...

  9. GaussDB(DWS)条件表达式函数返回错误结果集排查

    摘要:条件表达式函数中出现结果集不一致问题,我们首先要考虑是否入参数据类型不一致导致出参不一致. 本文分享自华为云社区<GaussDB(DWS)条件表达式函数返回错误结果集排查>,作者:y ...

  10. 毕昇 JDK:为啥是ARM 上超好用的 JDK

    摘要:毕昇 JDK 是华为基于 OpenJDK 定制的开源版本,是一款高性能.可用于生产环境的 OpenJDK 发行版. 本文分享自华为云社区<[云驻共创]毕昇 JDK:"传奇再现&q ...