转载:https://blog.csdn.net/lg2lh/article/details/39081061

一、锁存器

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

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

always @(a,b,e)
begin
if(e)
dout<=a;
end

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

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

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

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

二、触发器

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

always@(posedge clk or negedge rst_n)
begin
if(~rst_n)
dout1<=1'b0;
else if(e)
dout1<=a;
else
dout1<=b;
end

其RTL视图为一个触发器:

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

三、避免锁存器

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

reg  dout,dout1,dout2 ;
always@(posedge clk or negedge rst_n)
begin
if(~rst_n)
dout1<=1'b0;
else if(e)
dout1<=a;
else
dout1<=b;
end
always@(a,b,e)
begin
if(e)
begin
dout2<=a;
end
else
begin
dout<=b; end
end

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

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

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

再看Technology Map View视图:

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

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

always@(posedge clk or negedge rst_n)
begin
if(~rst_n)
dout1<=1'b0;
else if(e)
dout1<=a;
else
dout1<=b;
end
always@(posedge clk )
begin
if(e)
begin
dout2<=a;
end
else
begin
dout<=b; end
end

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

再看Technology Map View视图:

分析:锁存器消失

缺点:时序分析较困难。

不要锁存器的原因有二:

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

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

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

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

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

FPGA基础之锁存器与触发器的设计的更多相关文章

  1. FPGA基础设计(四):IIC协议

    很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kb ...

  2. FPGA基础知识了解

    FPGA学习的一些误区 FPGA入门必看资源 FPGA百度百科 FPGA基础知识及其工作原理 高端设计工具为少有甚是没有硬件设计技术的工程师和科学家提供现场可编程门阵列(FPGA).无论你使用图形化设 ...

  3. 优化基于FPGA的深度卷积神经网络的加速器设计

    英文论文链接:http://cadlab.cs.ucla.edu/~cong/slides/fpga2015_chen.pdf 翻译:卜居 转载请注明出处:http://blog.csdn.net/k ...

  4. FPGA基础入门篇(四) 边沿检测电路

    FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...

  5. FPGA基础知识关键点摘要

    FPGA基础知识关键点摘要 一.组合逻辑和时序逻辑的区别:组合逻辑与输入直接实时相关,时序逻辑还必须在时钟上升沿出发后输出新值,有没有时钟输入是他们最大的区别!组合时序容易出现竞争冒险现象出现亚稳态, ...

  6. 我的 FPGA 学习历程(01)—— FPGA 基础知识和 Quartus 的安装

    高级的嵌入式市场主要分为以下三类:ARM.DSP 和 FPGA. 其中 ARM 是行业内的佼佼者,目前几乎所有的安卓智能手机都使用 ARM 授权的 CPU架构:而 DSP(数字信号处理器) 早年就被大 ...

  7. 使用verilog编写锁存器与触发器

    需要注意的地方有四点: 1.关于锁存器与触发器在原理上的不同点,以及代码的不同点 2.关于高电平有效与低电平有效之前的区别 3.理解实现复位与实现D触发器之间的区别 4.理解同步与异步之间的区别 锁存 ...

  8. 在可插拔settings的基础上加入类似中间件的设计

    在可插拔settings的基础上加入类似中间件的设计 settings可插拔设计可以看之前的文章 https://www.cnblogs.com/zx125/p/11735505.html 设计思路 ...

  9. MySQL基础(7) | 触发器

    MySQL基础(7) | 触发器 基本语法 创建 CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EA ...

随机推荐

  1. CodeForce-792C Divide by Three(数学)

    Divide by Three CodeForces - 792C 有一个正整数 n 写在黑板上.它有不超过 105 位. 你需要通过删除一些位使得他变成一个美丽的数,并且需要删除尽量少的位数.删除的 ...

  2. Java面向对象系列(1)- 什么是面向对象

    面向过程 & 面向对象 面向过程思想 步骤清晰清楚,第一步做什么,第二步做什么-- 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分 ...

  3. Linux系列(31) - rpm命令管理之升级与卸载命令(3)

    升级命令 rpm -Uvh 包全名(要升级到的软件版本),如果没有安装这个软件的任何版本,这个命令可以代替rpm -ivh. rpm -Uvh 包全名 选项: - -U(upgrade):升级 卸载命 ...

  4. Oracle基本入门

    一.数据的存储 1.java 程序中的对象:数组.集合保存.当运行的程序结束的时候,里面的数据就消亡. 2.文件存储系统: 存在的缺陷: 2.1)没有明确的数据类型划分. 2.2)没有用户身份验证机制 ...

  5. django 各项配置基本设置

    setting中一些设置例子 mysql数据库连接设置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ...

  6. aws中centos登陆连接设置

    第一步:使用aws密钥文件(.pem)登陆(*在shell中需使用新建的会话,不能直接,使用原来的会话进行修改,否则无法进入) 点击浏览器,点添加,再点击导入,选择.pem 文件 第二步: 登陆后,使 ...

  7. Centos7下thinkphp5.0环境配置

    首先把yum源修改为阿里的yum源,如果没有安装wget,先安装一个.(如果有请蹦过) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors ...

  8. css新增属性之边框

    css3新增属性 边框属性 背景属性 文字属性 颜色属性 边框属性 属性 说明 border-radius 设置边框圆角 border-image 设置图像边框 border-shadow 设置边框阴 ...

  9. CentOS7安装Python3和VIM8

    参考:http://blog.sina.com.cn/s/blog_45249ad30102yulz.html

  10. 分布式锁Redission

    Redisson 作为分布式锁 官方文档:https://github.com/redisson/redisson/wiki 引入依赖 <dependency> <groupId&g ...