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 ...
随机推荐
- 华企盾DSC编辑文件不加密常见问题
1.先查看客户端日志主进程是否是加密进程.日志中是不是勾选智能半透明.加密类型是否有添加 2.用procmon监控保存的文件找出writefile的进程是否有添加,进程树是否有父进程,加密类型是否正确 ...
- 华企盾DSC使用outlook发送加密文件提示解密插件未加载
1.如果是非exchange邮箱,不能勾选"启用邮件白名单outlook插件(exchange邮箱建议勾选)" 2.如果是exchange邮箱则需要勾选"启用邮件白名单 ...
- 数字孪生系统如何整合CesiumJS?整合后会产生怎样的化学反应?
数字孪生有关的项目中,智慧城市一直是一个比较重要的类型,但是这类智慧城市项目往往包含了大量的GIS相关数据,例如倾斜摄影.DEM.DOM.地形数据等.这时,将GIS系统融合进数字孪生系统的需求就出现了 ...
- apache+mysql+php环境安装及配置
一.安装mysql 1.yum安装mysql # yum -y install mysql mysql-server 2.安装mariadb,用mariadb来启动数据库,systemctl star ...
- 珍藏网站-关于路由器、WIFI协议等
路由器详解:为什么不要买AX3000路由器 https://zhuanlan.zhihu.com/p/403855533 包含以下专业名词和相关话题: RX/TX和MU-MIMO 20MHz/40MH ...
- wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】
引言 最近小伙伴告诉我一种新的方法,可以使用wasm来使浏览器网页能够运行Python代码.这一下子激起了我的兴趣,因为这意味着用户无需安装Python环境就能直接运行我的demo,这真是太方便了.所 ...
- Spring源码学习笔记5——注册BeanPostProcessor,初始化事件多播器,注册事件监听器
一丶前言 上篇Spring容器回调完所有的BeanFactoryPostPocessor,之后可以做到替换所有占位符,解析所有配置类等工作,这篇还会迎来一个Spring留给我们扩展的一个接口,涉及到A ...
- 13、Flutter AspectRatio 调整子元素child的宽高比
AspectRatio的作用是根据设置调整子元素child的宽高比. childAspectRatio 是 GridView 和 AspectRatio 控件中的一个参数 AspectRati ...
- 华为云云原生数据库:A Philosophy about “less”
摘要:斯坦福教授.Tcl语言发明者John Ousterhout的著作<A Philosophy of Software Design>提出了一个经久不衰的观点--软件设计的核心在于降低复 ...
- 基于Redis + Lua脚本的设计红包雨
摘要:红包雨是一个典型的高并发场景,短时间内有海量请求访问服务端,为了让系统运行顺畅,抢红包采用了基于 Redis + Lua 脚本的设计方案. 本文分享自华为云社区<红包雨中:Redis 和 ...