08-避免Latch的产生
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的产生的更多相关文章
- 案例:latch: cache buffers chains event tuning
前两天对oracle数据库(single instance)进行了迁移升级从10.2.0.4 升到11.2.0.3,有一个项目迁完后第二天,cpu负载升到了130更高(16cpus). 向用户询问后使 ...
- [20190416]process allocation latch.txt
[20190416]process allocation latch.txt --//看链接:http://andreynikolaev.wordpress.com/2010/12/16/hidden ...
- [20190415]关于shared latch(共享栓锁).txt
[20190415]关于shared latch(共享栓锁).txt http://andreynikolaev.wordpress.com/2010/11/17/shared-latch-behav ...
- [20190415]10g下那些latch是共享的.txt
[20190415]10g下那些latch是共享的.txt http://andreynikolaev.wordpress.com/2010/11/23/shared-latches-by-oracl ...
- [20190415]11g下那些latch是共享的.txt
[20190415]11g下那些latch是共享的.txt http://andreynikolaev.wordpress.com/2010/11/23/shared-latches-by-oracl ...
- 关于latch: cache buffers chains的sql优化
前段时间,优化了一些耗buffer比较多的sql,但是CPU使用率还是没下来 . 查看操作系统CPU使用率 查看awr,发现又有一条超级耗性能的sql冒出来了. 该SQL每次执行耗费3e多个buffe ...
- [转帖]Latch
Latch (转) http://blog.csdn.net/tianlesoftware/article/details/5263238 2013-05-24 15:33:09 huashanlun ...
- Buffer Latch Timeout的解析
[问题描述] 我们可能会在数据库的错误日志里,发现这么一条信息: A time-out occurred while waiting for buffer latch -- type 4, bp 00 ...
- [20200223]关于latch and mutext的优化.txt
[20200223]关于latch and mutext的优化.txt --//前一段时间一直在测试使用DBMS_SHARED_POOL.MARKHOT标识热对象以及sql语句的优化.--//有别人问 ...
- PMON failed to acquire latch, see PMON dump
前几天,一台Oracle数据库(Oracle Database 10g Release 10.2.0.4.0 - 64bit Production)监控出现"PMON failed to a ...
随机推荐
- 接手了个项目,被if..else搞懵逼了
背景 领导:"这个项目,今后就给你维护了啊,仔细点." 小猫:"好,没问题". 可当满怀信心的小猫打开项目工程包翻看一些代码之后,瞬间懵逼没了信心. 是这样的 ...
- 为什么许多数字孪生产品开始了GIS融合的尝试?
随着数字孪生技术的发展,越来越多的产品意识到要实现数字孪生的最大价值,需要考虑多个维度的数据,包括空间信息.地理位置.环境条件等.因此,许多数字孪生产品开始了与GIS系统的融合尝试,以进一步提升其功能 ...
- Shell的概念、shebang、bash的概念
什么是shell shell的作用是 解释执行用户输入的命令或程序等 用户输入一条命令,shell就解释一条 键盘输入命令,Linux给与响应的方式,称之为交互式 linux的计算机是如何跟用户进行交 ...
- Spring 事务的实现原理
在执行访问数据库相关的操作中,特别是针对数据的修改操作,由于对于数据的修改可能会出现异常,因此对于整个一组的数据修改实际上都不能算是生效的,在这种情况下,需要使用事务的 "回滚" ...
- MySQL 基础(三)事务与 MVCC
事务 事务是一组原子性的 SQL 操作,或者被称为一个独立的工作单元,如果数据库引擎能够成功地对数据库应用该组的全部 SQL 语句,那么就会全部执行,否则全部不执行. 事务的特性 在关系数据库管理系统 ...
- 【Python】人工智能-机器学习——不调库手撕深度网络分类问题
1. 作业内容描述 1.1 背景 数据集大小150 该数据有4个属性,分别如下 Sepal.Length:花萼长度(cm) Sepal.Width:花萼宽度单位(cm) Petal.Length:花瓣 ...
- 3种依赖管理工具实现requirements.txt文件生成
1.pip 实现方式 要使用 pip 生成 requirements.txt 文件,可以使用以下命令: pip freeze > requirements.txt 这个命令会将当前环境中 ...
- 容器中域名解析流程以及不同dnsPolicy对域名解析影响
本文分享自华为云社区<容器中域名解析流程以及不同dnsPolicy对域名解析影响>,作者:可以交个朋友 . 一.coreDNS背景 部署在kubernetes集群中的容器业务通过coreD ...
- GaussDB(DWS)条件表达式函数返回错误结果集排查
摘要:条件表达式函数中出现结果集不一致问题,我们首先要考虑是否入参数据类型不一致导致出参不一致. 本文分享自华为云社区<GaussDB(DWS)条件表达式函数返回错误结果集排查>,作者:y ...
- 毕昇 JDK:为啥是ARM 上超好用的 JDK
摘要:毕昇 JDK 是华为基于 OpenJDK 定制的开源版本,是一款高性能.可用于生产环境的 OpenJDK 发行版. 本文分享自华为云社区<[云驻共创]毕昇 JDK:"传奇再现&q ...