版权声明:转载请注明出处:http://blog.csdn.net/lg2lh

一、锁存器

首先设计锁存器的时候应该清楚什么是锁存器,锁存器其实是对电平信号敏感的,一定信号是电平敏感的,和时钟边沿clk无关。

所以用verilog描述的时候,应该是:

[cpp] view plaincopy
  1. always @(a,b,e)
  2. begin
  3. if(e)
  4. dout<=a;
  5. end

产生锁存器的原因是因为各条件分支对dout的赋值不全,在else分支内没有对dout操作,这样就会造成锁存器。

实际综合后的RTL视图,可以看到综合后出现了锁存器latch

而从Technology Map View可以看出该锁存器的结构:

实际从FPGA逻辑资源实现上采用了逻辑门实现的,可见FPGA内部一般是没有锁存器这样的单元的。

二、触发器

首先明白触发器敏感信号时时钟边沿, 在Verilog中表述是这样的

[cpp] view plaincopy
  1. always@(posedge clk or negedge rst_n)
  2. begin
  3. if(~rst_n)
  4. dout1<=1'b0;
  5. else if(e)
  6. dout1<=a;
  7. else
  8. dout1<=b;
  9. end

其RTL视图为一个触发器:

而从Technology Map View可以看出FPGA内部实际是有触发器资源的。

三、避免锁存器

在(一)中可以看到对于dout分支不全造成了锁存器。下面再分析一例程序

[cpp] view plaincopy
  1. reg  dout,dout1,dout2 ;
  2. always@(posedge clk or negedge rst_n)
  3. begin
  4. if(~rst_n)
  5. dout1<=1'b0;
  6. else if(e)
  7. dout1<=a;
  8. else
  9. dout1<=b;
  10. end
  11. always@(a,b,e)
  12. begin
  13. if(e)
  14. begin
  15. dout2<=a;
  16. end
  17. else
  18. begin
  19. dout<=b;
  20. end
  21. end
[cpp] view plaincopy
  1. </pre><pre>

RTL视图为:包含两个锁存器和一个触发器。

分析:虽然下面的alway里分支都有(if else都有)但是每个分支只对其中一个寄存器赋值,再另一分支中没有再对相应寄存器赋值。

所以对于dout2和dout都形成了锁存器。

再看Technology Map View视图:

分析:图中下面两个位锁存器的结构,可以看出,锁存器是有反馈回路的逻辑电路,如图中标红的线为反馈信号。

为了尽量避免锁存器,改为触发器,修改语句:

[cpp] view plaincopy
  1. always@(posedge clk or negedge rst_n)
  2. begin
  3. if(~rst_n)
  4. dout1<=1'b0;
  5. else if(e)
  6. dout1<=a;
  7. else
  8. dout1<=b;
  9. end
  10. always@(posedge clk )
  11. begin
  12. if(e)
  13. begin
  14. dout2<=a;
  15. end
  16. else
  17. begin
  18. dout<=b;
  19. end
  20. end

图示为修改后的RTL视图,把分支赋值全了,可以看到锁存器没有了,变成了触发器

再看Technology Map View视图:

分析:锁存器消失

缺点:时序分析较困难。

不要锁存器的原因有二:

1、锁存器容易产生毛刺,

2、锁存器在ASIC(专用集成电路)设计中应该说比ff(触发器)要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和ff

来组成锁存器,这样就浪费了资源。(用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一)

优点:面积小。锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常见,正是由于它的应用使得

CPU的速度比外部IO部件逻辑快许多。latch完成同一个功能所需要的门较触发器要少,所以在asic中用的较多。

FPGA基础之锁存器与触发器的设计相关推荐

  1. FPGA锁存器、触发器、寄存器和缓冲器的区别

    一.锁存器 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态 锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才 ...

  2. 【FPGA】锁存器、触发器和寄存器

    目录 一丶锁存器 1.什么是锁存器 2.锁存器工作原理 3.锁存器优缺点 二丶触发器 1.什么时触发器 2.触发器工作原理 3.代码实现 三丶寄存器 四丶锁存器与触发器的区别 一丶锁存器 1.什么是锁 ...

  3. 8位CPU设计(1) 门电路和锁存器、触发器

    转载请注明出处:https://blog.csdn.net/Leytton/article/details/90761305 一.导言 在这篇文章里,我将给大家介绍一些门电路基础知识,并利用门电路,搭 ...

  4. jk触发器改为四进制_锁存器、触发器、寄存器和缓冲器的区别

    一.锁存器 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态 锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才 ...

  5. 锁存器、触发器、寄存器和缓冲器的区别

    目录 一.锁存器 二.触发器 三.寄存器 四.移位寄存器 五.总线收发器/缓冲器 六.锁存器与触发器的区别 七.D触发器和D锁存器的区别 八.寄存器与锁存器的区别 一.锁存器 锁存器(latch)-- ...

  6. 【FPGA - 基础知识(二)】锁存器、触发器

    目录 一.双稳态器件 二.常见的锁存器 2.1 SR锁存器 2.1.1 输入R=0,S=0(保持) 2.1.2 输入S=1,R=0(置位,set) 2.1.3 S=0,R=1(复位,reset) 2. ...

  7. (87)FPGA锁存器与触发器-面试必问(十一)(第18天)

    (87)FPGA锁存器与触发器-面试必问(十一)(第18天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA锁存器与触发器-面试必问(十一)(第18天) ...

  8. (54)FPGA基础编码D触发器(三)

    (54)FPGA基础编码D触发器(三) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA基础编码D触发器(三) 5)技术交流 6)参考资料 2 FPGA入门与 ...

  9. (53)FPGA基础编码D触发器(二)

    (53)FPGA基础编码D触发器(二) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA基础编码D触发器(二) 5)技术交流 6)参考资料 2 FPGA入门与 ...

最新文章

  1. SGDRegressor
  2. AAAI 2021 | 关键词指导的神经对话模型
  3. 统计学经典书籍分享【PDF下载】
  4. Fiori应用里application dependency里奇怪的manifest url是从哪来的
  5. .NET Core3发布Json API
  6. _用WSL,MobaXterm,Cmder配置linux开发环境
  7. Java快速入门学习笔记1 | Eclipse使用
  8. Kerberos学习(一)
  9. DOTNET零碎要点---1.vb.net利用Oracle.DataAccess.dll链接Oracle数据库
  10. 老程序员提给后浪程序员的职涯建议
  11. AI议题首次进入世界移动大会,打响第一枪的是LG
  12. python设置tk退出_Tkinter退出按钮
  13. java liveness_Kubernetes Liveness and Readiness Probes
  14. 大白菜u盘制作工具教程
  15. python中等好用什么表示_Python十大装B语法!你会几种?
  16. 用 Python 画哆啦 A 梦
  17. 极限和连续+偏导+方向导数+可微+梯度+链式法则+hessian矩阵
  18. python实现批量提取指定文件夹下同类型文件
  19. y空间下载_阿里云网盘来啦!大咖手把手教你如何搭建免费quot;5G极速下载”私人网盘...
  20. 笨重POS机遇到便捷APP谁更有优势?

热门文章

  1. boost::log::sources::severity_channel_logger_mt用法的测试程序
  2. boost::hana::second用法的测试程序
  3. boost::geometry::segment_view用法的测试程序
  4. GDCM:gdcm::FileChangeTransferSyntax的测试程序
  5. GDCM:无效的DICOM文件的测试程序
  6. boost::container模块实现全部分配的测试程序
  7. VTK:PolyData之DijkstraGraphGeodesicPath
  8. c++扔鸡蛋问题egg dropping puzzle(附完整源码)
  9. C++shell排序(附完整源码)
  10. 程序设计方法的发展历程