前言

在FPGA的设计中,避免使用锁存器是几乎所有FPGA工程师的共识,Xilinx和Altera也在手册中提示大家要慎用锁存器,除非你明确知道你确实需要一个latch来解决问题。而且目前网上大多数文章都对锁存器有个误解,我们后面会详细说明。

这篇文章,我们包含如下内容:

锁存器、触发器和寄存器的原理和区别,为什么锁存器不好?

什么样的代码会产生锁存器?

为什么锁存器依然存在于FPGA中?

锁存器、触发器和寄存器的原理和区别,为什么锁存器不好?

锁存器、触发器和寄存器它们的英文分别为:Latch、Flip-Flop、Register。我们对这三个单词的翻译真的是非常直观,从名字就能大概猜出它们的含义。

锁存器

什么是锁存器?

锁存器就是用来存储状态信息,就是将这个状态一直保持。锁存器对脉冲的电平敏感,也就是电平触发,在有效的电平下,锁存器处于使能状态,输出随着输入发生变化,此时它不锁存信号,就像一个缓冲器一样;在锁存器没有使能时,则数据被锁住,输入信号不起作用,此时输出一直为锁存的状态信息。我们常见的锁存器有SR锁存器、D锁存器、JK锁存器等。

锁存器的工作过程

我们以最简单的D锁存器为例来说明锁存器的工作过程,D锁存器有3个接口,也可以认为是4个,因为输出的两个Q和\overline{Q}Q只是单纯的反向关系。

image

其中D为输入信号,当E为高时,输出Q即为输入的D;当E为低时,Q保持E为高时的最后一次状态,也就是锁存过程。

image

为什么锁存器不好?

从上面的图中可以看出,锁存器对毛刺不敏感,很容易在信号上产生毛刺;而且也没有时钟信号,不容易进行静态时序分析。正是因为这两个原因,我们在FPGA设计时,尽量不用锁存器。

当然,目前网上还有一种说法是FPGA中只有LUT和FF的资源,没有现成的Latch,所以如果要用Latch,需要更多的资源来搭出来。但这一观点,是错误的,我们后面会有专门的讲解。

触发器

什么是触发器

触发器(Flip-Flop,简写为 FF),也叫双稳态门,又称双稳态触发器。在中国台湾及中国香港译作“正反器”,是一种具有两种稳态的用于储存的组件,可记录二进制数字信号“1”和“0”。

FPGA工程师,对触发器再熟悉不过了,D触发器应该是我们平时写程序中用到最多的element。除了D触发器,常见的触发器还有T触发器、SR触发器、JK触发器等。触发器对脉冲边沿敏感,其状态只在时钟脉冲的上升沿或下降沿的瞬间改变。

触发器的工作过程

我们以D触发器为例来说明触发器的工作过程,D触发器接口如下:

image

触发器只在时钟边沿时起作用,所以哪怕输入的信号中有毛刺,输出还是比较干净的。

image

还有一点需要了解的是,FPGA中最小的单元是门电路,门电路又组成了锁存器,锁存器组成了寄存器。

寄存器

用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果,它被广泛的用于各类数字系统和计算机中。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。工程中的寄存器一般按计算机中字节的位数设计,所以一般有8位寄存器、16位寄存器等。

什么样的代码会产生锁存器?

在组合逻辑中,如果条件描述不全就会容易产生Latch:

if语句中缺少了else语句

case语句中没有给出全部的情况。

也就是下面的情况:

always @ *

begin

if(en==1)

q <= d;

end

input [1:0]d;

always @ (d)

begin

case(d)

0:       q0 <= 1'b1;

1:       q2 <= 1'b1;

2:       q2 <= 1'b1;

3:       q3 <= 1'b1;

default: q4 <= 1'b1;

end

这个前提是组合电路中,在时序电路的if语句中,及时没有else,也不会综合出Latch的。

上面这两种写法容易出现在什么地方呢?最常见的就是状态机,我见过不少的FPGA工程师在写状态机时,case语句中没有给出变量的全部情况。

为什么锁存器依然存在于FPGA中?

我们在前面说过网上有一种说法是:FPGA中只有LUT和FF的资源,没有现成的Latch,所以如果要用Latch,需要更多的资源来搭出来。这种说法是错误的,因为在Xilinx的FPGA中,6 系列之前的器件中都有Latch;6系列和7系列的FPGA中,一个Slice中有50%的storage element可以被配置为Latch或者Flip-Flop,另外一半只能被配置为Flip-Flop。比如7系列FPGA中,一个Slice中有8个Flip-Flop,如果被配置成了Latch,该Slice的另外4个Flip-Flop就不能用了。这样确实造成了资源的浪费。

image

在UltraScale的FPGA中,所有的storage element都可以被配置成Flip-Flop和Latch。

image

我们以下面的代码来说明Flip-Flop和Latch在Ultrascale的FPGA中Implementation后的结果。

Flip-Flop代码:

module FF_top(

input              clk,

input [3:0]        data_i,

input              data_ie,  //enable

output reg [3:0]   o_latch

);

always @ ( posedge clk )

begin

if(data_ie)

o_latch <= data_i;

end

endmodule

Latch代码:

module latch_top(

input [7:0]        data_i,

input              data_ie,  //enable

output reg [7:0]   o_latch

);

always @ *

begin

if(data_ie)

o_latch[3:0] <= data_i[3:0];

end

endmodule

Flip-Flop实现后的Schematic和Device如下:

image

Latch实现后的Schematic和Device如下:

image

可以看出,在使用Flip-Flop时,storage element被综合成了FDRE,也就是触发器;当使用Latch电路时,storage element被综合成了LDCE。

所以,FPGA中没有Latch的说法在Xilinx的FPGA中是不对的。

最后一个问题,既然Latch有这么多的问题,那为什么FPGA中还要保留?

首先就是因为FPGA电路的灵活性,保留Latch并不影响FPGA的资源,因为storage element可以直接被配置为Flip-Flop。

其次就是有些功能是必须要使用Latch的,比如很多处理器的接口就需要一个Latch来缓存数据或地址。

最后要说明的一点是:锁存器虽然在FPGA中不怎么被使用,但在CPU中却很常见,因为锁存器比Flip-Flop快很多。

matlab中sr锁存器,大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解?...相关推荐

  1. linux eclipse某些项目,某些项目无法导入,因为它们已存在于Eclipse中的工作空间错误中...

    某些项目无法导入,因为它们已存在于Eclipse中的工作空间错误中 我正在尝试导入我和我的同事一直在处理的项目..并在选择 - "导入"然后"导入现有项目"然后 ...

  2. python 从excel中抓取数据_使用Python抓取美团数据存于Excel中

    0.程序是针对美团中的美食部分数据按好评排序采集. 要抓取保存的数据为: 商家名类型  地理位置 评论人数  均价  最低价格 1.首先编写网页数据采集函数,使用request采集网页源码,具体实现如 ...

  3. mysql 字段值1_2_3 如何查询3是否存在?_MySQL根据col1中的值是否存在于col2中以及col3是否=值来更新col4...

    我有一个表(命名单位),结构如下:id type type_id name parent hide ================================================== ...

  4. FPGA中触发器和锁存器总结

    目录 一,实例 二,不同模型RTL代码或源语 FDCE:异步复位触发器 FDPE:异步置位触发器 FDRE:同步复位触发器 FDSE:同步置位触发器 LDCE:异步清零锁存器 LDPE:异步置位锁存器 ...

  5. FPGA 中的latch 锁存器

    一直都知道fpga中有latch这么一回事,但是一直都不太清楚到底什么是锁存器,它是怎么产生的,它到底和寄存器有多少区别,它怎么消除.为什么说他不好? 一,是什么 锁存器是一种在异步时序电路系统中,对 ...

  6. Matlab代码:ADMM算法在考虑碳排放交易的电力系统最优潮流中的应用

    Matlab代码:ADMM算法在考虑碳排放交易的电力系统最优潮流中的应用 关键词:交替方向乘子法, ADMM , 最优潮流 ,碳排放, 分布式优化 仿真软件:Matlab软件调用cplex求解器进行求 ...

  7. 利用matlab实现DMD动态模态分解(在一维信号或二维流场矢量中的应用)

    利用matlab实现DMD动态模态分解(在一维信号或二维流场矢量中的应用) 0 前言 0.1 特征根的计算与含义 1 DMD的基本思路 2 一维DMD算法 3 二维DMD算法 4 总结 (2020年9 ...

  8. FPGA中值滤波实现并Modelsim仿真,与MATLAB中值滤波进行对比

    文章目录 一.中值滤波算法 二.FPGA实现中值滤波 2.1 3*3窗口的生成 2.2 排序模块 2.3中值滤波模块 2.4 整体RTL图 三.modeslim仿真 四.matlab中值滤波 五.效果 ...

  9. matlab verilog 接口,使用SystemVerilog简化FPGA中的接口

    FPGA工程师们应该都会吐槽Verilog的语法,相当的不友好,尤其是对于有很多接口的模块,像AXI4/AXI-Lite这种常用的总线接口,动不动就好几十根线,写起来是相当费劲. 当然现在Xilinx ...

  10. matlab中tgn,TGN/EE介导的囊泡运输与GDI1协同调控根毛中ROP2 GTPase的动态定位的机理研究...

    TGN/EE介导的囊泡运输与GDI1协同调控根毛中ROP2 GTPase的动态定位的机理研究 [摘要]:根毛是根表皮细胞凸起形成的管状结构,是植物吸收水分和无机盐的主要部位,其形态的维持对植物的生长发 ...

最新文章

  1. [转]卓越科技回应所谓的最牛,最受歧视的招聘
  2. java执行mongodb语句_java下执行mongodb
  3. mysql5.6使用profile工具分析sql
  4. Ubuntu16.04更新软件源
  5. python3连接数据库失败_python3使用pymysql连接mysql数据库报Keyerror
  6. Fiddler工具使用介绍三
  7. [转载]MTK入门教程
  8. VS2010 SP1 安装慢的原因
  9. Python--图片转字符画
  10. d6u android,天敏D6U_Android4.4.2_SONY BRAVIA_精简优化双启动版
  11. 华硕n54u mysql_改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件(私人云储存 ari
  12. CORS Filter
  13. 面向削峰填谷的电动汽车多目标优化调度策略
  14. D3D9学习笔记之精灵变换篇
  15. echart旭日图_Echarts的旭日图如何显示tooltip
  16. 【金猿产品展】亚信科技“数据探索分析平台”——深挖数据价值,助客户高效管理和经营生产...
  17. jCO--http://www.cnblogs.com/zfswff/p/5671148.html
  18. 常用的归一化(Normalization) 方法:BN、LN、IN、GN
  19. PHP 接口调用报错 502 Bad Gateway
  20. linux把没有执行权限的文件变为可执行

热门文章

  1. GifUtil给gif图片添加文字、图片水印
  2. QTreeView的使用(四)
  3. 高手的思维与打法:灰度思维,黑白决策
  4. 【每日新闻】Gartner:区块链热度高但实际部署较少且面临挑战 | 阿里巴巴宣布研制出全球最强量子电路模拟器“太章”...
  5. java的图标及由来
  6. Oracle 临时表详解(temporary table)
  7. 开源车牌数据集CCPD介绍
  8. python是什么语言简称为_python为何称为胶水语言
  9. 多商户Saas模式云进销存系统,源码分享
  10. linux开机禁用vga设备,用vga_switcheroo在Linux下(开启KMS)彻底关闭某一可切换显卡的简单教程...