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

这篇具有很好参考价值的文章主要介绍了什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

什么是锁存器Latch?

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

下图是一个典型的Latch的门电路结构。当使能信号E无效时,两个与门的输出均为0,对后面的SR锁存器即或非门无影响,所以无论输入D的值为1或0,输出Q的值都不会改变,就像被“锁住”了。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
当使能信号E有效且输入D为1时,两个与门的输出分别为0和1、此时的输出Q值为1,与输入D一致。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
当使能信号E有效且输入D为0时,两个与门的输出分别为1和0、此时的输出Q值为0,同样与输入D一致。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器

Latch有什么危害?

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

而同步逻辑所使用的触发器FF,它的典型结构是这样的,由2个Latch+1个反相器组成。
当时钟信号Clock为高电平时,第1个Latch的使能有效,输入数据直接通过;由于反向器的存在,第2个Latch的使能端无效,所以其输出保持不变。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
当时钟信号Clock为低电平时,第1个Latch使能无效,其输出保持不变,而这个输出也就是在时钟信号处于下降沿时的输入信号;由于反向器的存在,第2个Latch的使能端有效,输入直接传递到输出,此时最终输出的是在时钟下降沿时采集的输入信号。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
可以看到,在同步电路中,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。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
生成Latch的时候,Vivado也会报警告,所以设计的时候请务必多多关注这些信息!
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
有些时候,尽管你的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:
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器

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:
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
类似的,有些时候尽管你的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:
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器

时序逻辑电路会生成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)。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
因为在时序逻辑中,即使不补全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就不能用了,这样确实是会造成资源的浪费。
什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
Xilinx的7系列FPGA中的FF可以被配置成两种类型的Latch: LDCE和LDPE。

  • 异步复位的LDCE:比我们熟知的Latch多了一个异步复位端口。
    什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器
  • 异步置位的LDPE:比我们熟知的Latch多了一个异步置位端口。

什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch,FPGA设计与调试,fpga开发,Verilog入门,Verilog,Xilinx,IC,锁存器

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

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

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

总之,Latch的用武之地确实有,但不多。 不是特殊需求,请尽量避免使用Latch!文章来源地址https://www.toymoban.com/news/detail-751941.html


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

到了这里,关于什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 《More Effective C++》《基础议题——2、尽量使用C++类型的风格转换》

    类型转换是一般程序员所不能忍受的,但是在紧要关头,类型转换是必须的。C风格的类型转换太过简单,粗暴,不能进行精确的类型转换;为了弥补C转换上功能的不足,C++提供了四种常用的类型转换来应付复杂的转换需求。 static_cast用于在编译时执行类型转换,主要用于相

    2024年01月18日
    浏览(8)
  • kafka为什么尽量使用手动提交

    在 Kafka 中,消费者可以使用手动提交和自动提交两种方式来管理消费偏移量(offset)。它们之间的区别如下: 1. 手动提交 offset:    - 消费者通过调用 `commitSync()` 或 `commitAsync()` 方法手动提交消费偏移量。    - 手动提交 offset 需要显式地指定要提交的分区和偏移量。    

    2024年02月15日
    浏览(8)
  • 好的代码风格,如同书法,让你的代码更加漂亮

    好的代码风格,如同书法,让你的代码更加漂亮

    很多初学者的代码其实都不够“漂亮”,那是因为没有养成好的编码习惯。本篇博客以C语言为例,总结一些好习惯。其实,很多习惯都是肌肉记忆,举个例子:请你写一个程序,输入2个整数并输出它们的和。有些朋友可能写出来是这个样子。 我写这段代码,是在模仿有些朋

    2024年02月01日
    浏览(10)
  • 什么是好代码/坏代码?给普通人的图解示例

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@todbotts.triangles/what-is-good-bad-code-an-illustrated-example-for-non-programmers-1222b600a0f0 我曾经在某个地方读到过一句话,基本上有以下内容: 在现代世界中,许多人的生活依赖于软件,例如控制大型商用客机飞行系统的软件,但软件

    2024年02月04日
    浏览(13)
  • SQL中为什么不要使用1=1?

    最近看几个老项目的SQL条件中使用了1=1,想想自己也曾经这样写过,略有感触,特别拿出来说道说道。 编写SQL语句就像炒菜,每一种调料的使用都会影响菜品的最终味道,每一个SQL条件的加入也会影响查询的执行效率。那么 1=1 存在什么样的问题呢?为什么又会使用呢? 在动

    2024年02月21日
    浏览(16)
  • 编码风格之(5)GNU软件编码风格(3)

    GNU软件编码标准风格(3) Author:Onceday    Date: 2024年1月21日 漫漫长路,才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentation GNU Coding Standards - GNU Project - Free Software Foundation 7. 整体软件配置框架 发布不仅

    2024年01月25日
    浏览(27)
  • 编码风格之(4)GNU软件标准风格(2)

    GNU软件编码标准风格(2) Author:Onceday Date: 2023年2024年1月8日 漫漫长路,才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentation GNU Coding Standards - GNU Project - Free Software Foundation 5. 充分利用C 5.1 格式化源代码

    2024年01月22日
    浏览(31)
  • JavaScript编码风格指南

    内容出处: Nicholas C. Zakas 《编写可维护的JavaScript》 Google JavaScript Style Guide crockford JSLint ESLint 好狗电影导航 文件名必须全部小写,并且可以包含下划线( _ )或短划线( - ),但不包含其他标点符号。 在逻辑相关的代码块之间添加空行可以提高代码的可读性。 两行空行仅限

    2024年02月05日
    浏览(7)
  • Python学习之路-编码风格

    Python的设计哲学是“优雅”、“明确”、“简单”。它的重要准则被称为“Python之禅”。 Python之禅 又名PEP 20,在Python解释器内运行 import this 可以获得完整的列表,下面是我的翻译与解读: Python开发的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python程序

    2024年01月20日
    浏览(14)
  • 什么是路由器后门?如何尽量规避路由器后门带来的风险

    多家路由器厂商的产品存在后门,可能导致个人信息泄漏。挺纳闷的,路由器怎么还能泄漏我的信息?它究竟是怎么工作的? 上周末,根据国家互联网应急中心(CNCERT)发布的数据显示,D-LINK、Cisco(思科)、Linksys、Netgear、Tenda等多家厂商的路由器产品存在后门,黑客可由此直接

    2024年02月06日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包