什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch

news2024/11/27 5:34:59

前言

在FPGA设计中,几乎没人会主动使用锁存器Latch,但有时候不知不觉中你的设计莫名其妙地就生成了一堆Latch,而这些Latch可能会给你带来巨大的麻烦。

什么是锁存器Latch?

Latch,锁存器,一种可以存储电路状态信息的组合逻辑元件,和同样可以保存电路状态的时序逻辑元件–触发器(Flip-Flop,FF)不同,锁存器只在其使能端口有效时,将输入传递给输出;而在其使能端口无效时,输出则保持不变,就像被“锁住储存”起来了一样。

下图是一个典型的Latch的门电路结构。当使能信号E无效时,两个与门的输出均为0,对后面的SR锁存器即或非门无影响,所以无论输入D的值为1或0,输出Q的值都不会改变,就像被“锁住”了。
在这里插入图片描述
当使能信号E有效且输入D为1时,两个与门的输出分别为0和1、此时的输出Q值为1,与输入D一致。
在这里插入图片描述
当使能信号E有效且输入D为0时,两个与门的输出分别为1和0、此时的输出Q值为0,同样与输入D一致。
在这里插入图片描述

Latch有什么危害?

当Latch的使能信号有效时,直接让输入信号通过,使得输出完全等于输入。这一特性无疑会很容易地引入毛刺,使得设计不稳定;其次,Latch没有时钟信号,是一个异步电路元件,这就使得综合工具对Latch的静态时序分析十分困难。

而同步逻辑所使用的触发器FF,它的典型结构是这样的,由2个Latch+1个反相器组成。
当时钟信号Clock为高电平时,第1个Latch的使能有效,输入数据直接通过;由于反向器的存在,第2个Latch的使能端无效,所以其输出保持不变。
在这里插入图片描述
当时钟信号Clock为低电平时,第1个Latch使能无效,其输出保持不变,而这个输出也就是在时钟信号处于下降沿时的输入信号;由于反向器的存在,第2个Latch的使能端有效,输入直接传递到输出,此时最终输出的是在时钟下降沿时采集的输入信号。
在这里插入图片描述
可以看到,在同步电路中,FF的输出只在时钟边沿(这里是下降沿)变化,而在其他时间是保持不变的,这样一来,即使某些时刻在输入上出现了毛刺,但只要这个毛刺不发生在时钟边沿,那它就不会传递到输出进而影响后面的电路。

显然,同一个时钟周期比起来,时钟边沿持续的时间实在是微不足道,所以这大大降低了毛刺影响电路的概率。这也是同步电路相对于异步电路的一个大优点。

什么样的代码会生成Latch

下面的一些代码风格是会生成Latch的:

if-else语句不完整的组合逻辑

在组合逻辑中,如果if-else语句没有写完整的话,是会生成Latch的(不管你是有意还是无意的),因为缺失掉的条件会被综合工具理解成不变,即锁存。

module test(
	input 		data,
	input 		en,
	output reg	q
);

always@(*)begin
	if(en)
		q = data;
end

endmodule

Vivado中生成的RTL电路如下–一个Latch。
在这里插入图片描述
生成Latch的时候,Vivado也会报警告,所以设计的时候请务必多多关注这些信息!
在这里插入图片描述
有些时候,尽管你的if-else语句已经很完整了,也还是会生成Latch,就像这样:

module test(
	input 		data,
	input 		en,
	output reg	q
);

always@(*)begin
	if(en)
		q = data;
	else	
		q = q;		//输出反馈给了输入,相当于没变
end

endmodule

这是因为输出直接反馈给了输入,使得输出等于输入,相当于没变化,依然是被锁存住了。

消除Latch的方法有两种:

  • 1、补全if-else语句。注意不能将输出反馈给输入,而是应该给输入赋一个其他值,例如0、1或其他变量。
module test(
	input 		data,
	input 		en,
	output reg	q
);

always@(*)begin
	if(en)
		q = data;
	else	
		q = 1'b0;		//q = 1'b1也可以
end

endmodule
  • 2、赋初值。在条件语句之前给输出一个初始值。
module test(
	input 		data,
	input 		en,
	output reg	q
);

always@(*)begin
		q = 1'b0;		//q = 1'b1也可以
	if(en)
		q = data;
end

endmodule

两种方法中推荐第一种方法,因为比较规范,代码风格容易统一。这样的代码不会生成Latch,而是生成一个组合逻辑用的2选1MUX:
在这里插入图片描述

case语句不完整的组合逻辑

与if-else句类似,如果case语句的分支没有列举完全,也是会生成Latch的,比如这样:

module test(
	input 		data0,data1,
	input		sel,
	output reg	q
);

always@(*)begin
	case(sel)
		1'b0: q = data0;
	endcase
end

endmodule

Vivado中生成的RTL电路会有Latch:
在这里插入图片描述
类似的,有些时候尽管你的case语句已经很完整了,但因为出现了反馈语句(即输出反馈给输入)也还是会生成Latch,就像这样:

module test(
	input 		data0,data1,
	input		sel,
	output reg	q
);

always@(*)begin
	case(sel)
		1'b0: q = data0;
		1'b1: q = q;		//反馈语句
	endcase
end

endmodule

消除锁存器的方法有三种:

  • 1、补全case语句。注意不能将输出反馈给输入,而是应该赋一个其他值,例如0、1或其他变量。
module test(
	input 		data0,data1,
	input		sel,
	output reg	q
);

always@(*)begin
	case(sel)
		1'b0: q = data0;
		1'b1: q = data1;		
	endcase
end

endmodule
  • 2、赋初值。在case语句之前给输出一个初始值。
module test(
	input 		data0,data1,
	input		sel,
	output reg	q
);

always@(*)begin
	q = data1;	
	case(sel)
		1'b0: q = data0;		
	endcase
end

endmodule
  • 3、使用default语句作为默认语句。default语句用来补充其他所有没有列举出来的结果。
module test(
	input 		data0,data1,
	input		sel,
	output reg	q
);

always@(*)begin
		
	case(sel)
		1'b0: 		q = data0;
		default:	q = data1;
	endcase
end

endmodule

在实践中,最推荐第三种写法。风格比较规范和统一。有时候编码的时候可能会把case语句的所有分支都列举出来,这种情况下依然建议保留default语句

这样的代码就不会生成Latch了,而是生成一个组合逻辑用的2选1MUX:
在这里插入图片描述

时序逻辑电路会生成Latch吗?

如果以上出现Latch的写法转换成时序逻辑,是否也会生成Latch?比如这样:

module test(
	input 		data,
	input 		en,
	input		clk,
	output reg	q
);

always@(posedge clk)begin
	if(en)
		q <= data;
end

endmodule

答案是不会。只会生成一个寄存器reg(实际上就是一个FF)。
在这里插入图片描述
因为在时序逻辑中,即使不补全if-else语句,由于FF/REG的特性,它本身就可以在非时钟边沿存储数据,所以像这样的语句:

else q <= q; //保存值

写或不写在功能上都是一样的。但是在实践中,还是建议补全,目的是养成风格统一、良好的编码习惯。

Latch在FPGA中是什么情况?

网上有种说法:在FPGA设计中不使用Latch的一个很大原因是FPGA中没有现成的Latch资源,如果要用,则需要消耗非常多的资源来构建Latch。

**这种说法是错的。**以Xilinx的7系列FPGA为例,Latch实际上是其内部存在的固定资源。一个Slice中有一半的逻辑资源可以被配置为Latch或FF,另一半只能被配置成FF。但是需要注意的是,如果Silice中的FF被配置成了Latch,那么剩余的4个FF就不能用了,这样确实是会造成资源的浪费。
在这里插入图片描述
Xilinx的7系列FPGA中的FF可以被配置成两种类型的Latch: LDCE和LDPE。

  • 异步复位的LDCE:比我们熟知的Latch多了一个异步复位端口。
    在这里插入图片描述
  • 异步置位的LDPE:比我们熟知的Latch多了一个异步置位端口。

在这里插入图片描述

所以听起来似乎毫无用处的Latch,为什么还存在于FPGA中?

  • 首先Latch是被做成了和部分FF二选一的一个器件,而不是独立器件,这确实也说明在FPGA设计中确实需求不高,不然肯定就做成了FF这种固定的底层器件了。但这样一来,也增加了FPGA底层资源的灵活性,保留了更多的设计可能。

  • 其次,Latch在某些特定应用还是需要的,比如IC设计中的time borrowing来提高时序性能、门控时钟、某些总线接口用来锁存数据等。

总之,Latch的用武之地确实有,但不多。 不是特殊需求,请尽量避免使用Latch!


  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1257378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法&#xff0c;可以用于检测图像中的人行道-斑马线。在目标检测领域&#xff0c;YOLOv5通过结合多种技术手段&#xff0c;包括使用Mosaic数据增强操作、自适应锚框计算与…

Blender学习笔记:做一个小车

文章目录 轮廓车窗轮胎和车灯 教程地址&#xff1a;八个案例教程带你从0到1入门blender【已完结】 轮廓 1 创建立方体&#xff0c;将其拉伸成长方体。Tab进入编辑模式&#xff1b;CtrlR添加一个纵向的循环边&#xff1b;3进入面模式&#xff1b;E选中后上方的面向上拉伸&…

直播自动互动发言机器人,成功分享与技术实现思路

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 在当今的互联网时代&#xff0c;直播间已经成为了一个重要的营销和交流平台。为了提高直播间的关注度和人气&#xff0c;我们需要在直播过程中注重提高停留和增加人气。本…

Portraiture全新4.1.2版本升级更新

关于PS修图插件&#xff0c;相信大家都有安装过使用过&#xff0c;而且还不止安装了一款&#xff0c;比如最为经典的DR5.0人像精修插件&#xff0c;Retouch4me11合1插件&#xff0c;Portraiture磨皮插件&#xff0c;这些都是人像精修插件中的领跑者。其中 Portraiture 刚刚升级…

【第三节:微信小程序 3、app.js配置】微信小程序入门,以思维导图的方式展开3

目录 提供了2个函数&#xff1a; app.js配置 【第三节&#xff1a;微信小程序 3、app.js配置】微信小程序入门&#xff0c;以思维导图的方式展开3 提供了2个函数&#xff1a; app() getApp() --------------------------- app.js配置 App() 功能 Ap…

(附源码)springboot电影售票系统小程序 计算机毕设36991

目 录 摘要 1 绪论 1.1课题目的与意义 1.2研究背景 1.3论文结构与章节安排 1.4小程序框架以及目录结构介绍 2 springboot电影售票系统小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据…

OpenCV项目开发实战--基本图像分割图生成器

欢迎回到我们有关 OpenCV 的系列文章以及我们如何利用其强大的图像预处理功能。在我们之前的文章的基础上,今天我们向您展示如何创建基本的图像分割图生成器。 具体来说,我们的图像掩模应该帮助识别每个像素是否: 背景的一部分(指定值为0)在感兴趣的对象的边缘(指定值 …

Zookeeper分布式锁实现Curator十一问

前面我们通过Redis分布式锁实现Redisson 15问文章剖析了Redisson的源码&#xff0c;理清了Redisson是如何实现的分布式锁和一些其它的特性。这篇文章就来接着剖析Zookeeper分布式锁的实现框架Curator的源码&#xff0c;看看Curator是如何实现Zookeeper分布式锁的&#xff0c;以…

Ceph----CephFS文件系统的使用:详细实践过程实战版

CephFS 介绍 是一个基于 ceph 集群 且兼容 POSIX 标准的文件系统。 创建 cephfs 文件系统时 需要在 ceph 集群中添加 mds 服务&#xff0c;该服务 负责处理 POSIX 文件系统中的 metadata 部分&#xff0c; 实际的数据部分交由 ceph 集群中的 OSD 处理。 cephfs 支持以内核模块…

计算机服务器中了mallox勒索病毒如何处理,mallox勒索病毒解密文件恢复

科技技术的发展推动了企业的生产运营&#xff0c;网络技术的不断应用&#xff0c;极大地方便了企业日常生产生活&#xff0c;但网络毕竟是一把双刃剑&#xff0c;网络安全威胁一直存在&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机…

2023年【起重机司机(限桥式起重机)】试题及解析及起重机司机(限桥式起重机)复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机司机(限桥式起重机)试题及解析根据新起重机司机(限桥式起重机)考试大纲要求&#xff0c;安全生产模拟考试一点通将起重机司机(限桥式起重机)模拟考试试题进行汇编&#xff0c;组成一套起重机司机(限桥式起重机)…

【Ambari】HDP单机自动化安装(基础环境和MySQL脚本一键安装)

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

基于Java SSM框架+Vue实现大学生兼职信息网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现大学生兼职信息网站演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

基于PLC的果园灌溉系统设计(论文+源码)

1.系统设计 系统示意图如图2-1所示。某一果园 共有3个灌溉区域&#xff0c;分别为灌溉1#区&#xff0c;灌溉2#区&#xff0c;灌溉3#区&#xff0c;分别使用不同湿度传感器检测湿度&#xff0c;用于各区域控制湿度&#xff0c;进行灌溉&#xff0c;使用相应的灌溉阀进行灌溉。这…

Deep Learning(wu--46)

文章目录 ContentsBeginBasic逻辑回归SGD导数计算图&#xff08;反向传播&#xff09;向量化广播numpy Neural Network向量化激活函数梯度下降深层表示反向传播 Contents Begin Basic 逻辑回归 SGD 导数 计算图&#xff08;反向传播&#xff09; 向量化 广播 numpy Neural Netw…

Matplotlib不规则子图_Python数据分析与可视化

除了网格子图&#xff0c;matplotlib还支持不规则的多行多列子图网格。 plt.GridSpec()对象本事不能直接创建一个图形&#xff0c;他只是 plt.subplot()命令可以识别的简易接口。 这里创建了一个带行列间距的23网格&#xff1a; grid plt.GridSpec(2, 3, wspace0.4, hspace0…

unity学习笔记06

一、预制体 1.定义&#xff1a; 预制体是一种存储了一个或多个游戏对象及其组件的资产。可以将预制体视为游戏对象的模板&#xff0c;它包含了对象的所有属性、组件和初始状态。 2.创建预制体&#xff1a; 在Unity中&#xff0c;可以通过将一个或多个游戏对象拖动到项目窗口…

阳阳抖客斗音直播间私信引流脚本,支持发送图片精准引流获客,快手私信引流软件+小红书私信引流工具

功能介绍&#xff1a; 1.直播精准引流客源 2.首页推荐精准引流客源 3.新增引流方式 4.支持多个文本图片随机发送 5.评论引流支持图文一体 6.自定义时间/个数 7.自动引流减少人工成本 8.私信效果最佳 9.杜绝封号 时间把控好 10.功能不断完善更新 直播间引流 手动打开…

答题活动小程序竞品分析

答题小程序竞品分析 答题活动小程序竞品分析 知识竞赛小程序竞品分析 ~ 从2020年开始&#xff0c;机缘巧合&#xff0c;我开始涉及答题小程序的开发&#xff0c;从最初的刷题场景到答题活动场景&#xff0c;已经走过了三个年头&#xff0c;这期间我开发的答题小程序产品也逐…

基于python协同过滤推荐算法的音乐推荐与管理系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python的协同过滤推荐算法的音乐推荐与管理系统是一个集成了音乐推荐和管理的系统&#xff0c;它使用协同过滤算…