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 ...
随机推荐
- 珍藏网站-关于路由器、WIFI协议等
路由器详解:为什么不要买AX3000路由器 https://zhuanlan.zhihu.com/p/403855533 包含以下专业名词和相关话题: RX/TX和MU-MIMO 20MHz/40MH ...
- 手写spring的ioc的流程截图(笔记-1)
spring ioc是什么? IoC 容器是 Spring 的核心,也可以称为 Spring 容器.Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期. S ...
- Boost程序库完全开发指南:1.2-C++基础知识点梳理
主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的. 1.const_cast <n ...
- “互联网+”大赛之智慧校园 赛题攻略:你的智慧校园,WeLink帮你来建
摘要:本赛题的核心就是借助华为云WeLink的中台服务能力/开发工具等,结合学校的具体的高价值场景,开发出WeLink小程序,方便师生的学习与生活. 本文分享自华为云社区<"互联网+& ...
- 手绘流程图讲解spark是如何实现集群的高可用
摘要:本文讲述spark是怎么针对master.worker.executor的异常情况做处理的. 本文分享自华为云社区<图解spark是如何实现集群的高可用>,作者:breakDawn. ...
- JavaScript继承的实现方式:原型语言对象继承对象原理剖析
面向对象编程:继承.封装.多态. 对象的继承:A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 在经典的面向对象语言中,您可能倾向于定义类对象,然后您 ...
- Error: Could not find or load main class org.elasticsearch.tools.java_version_checker.JavaVersionChecker
把elasticsearch目录换到不属于root目录的其他目录就行了
- HanLP — 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
维特比算法:从众多路径中,挑出最优的那条,他和隐马尔可夫没有强关联 中文分词任务 语料库 => 训练集 初始.转移.发射矩阵 => 训练过程 维特比算法,得到真正结果 训练的时候,是用不到 ...
- Axure App 垂直滚动
拖两个动态面版 最外层[动态面板]用来定义显示区域,高度:692 (根据实际来) 里面的[动态面板],用来放内容,高度根据实际情况来,示例中是:1920 如下图所示 里面的[动态面板]添加垂直滚动 外 ...
- 别再问我 2050 可以干什么,Make a Movie in a Day!
2050 的每个年青人都是新物种.越是不可能见面的人见了面,就越会有奇迹发生,2050 努力让年青人见上另一位年青人,激发新的创造力.一起来 2050 看看? 2050 是什么? 2050 大会是由阿 ...