赞
踩
FPGA中最重要两种结构,LUT和FF(触发器),前面我们讲LUT,现在我们从底层讲触发器。
废话不多说,先列出看完这篇文章,能收获什么?
1. 理解触发器是什么?锁存器是什么?寄存器是什么?
2. 理解触发器和锁存器根本区别?
3. FPGA中有哪几种触发器?
4. 设计中避免锁存器的原因和方法
首先讲触发器和锁存器的基本概念,简单来说:
触发器:触发器是FPGA内部边沿敏感存储单元,数据存储由时钟上升或下降沿进行同步。
D触发器(D为数据输入,Q为数据输出)
尽管输入带毛刺,由于D触发器上升沿起作用,具有过滤毛刺作用
寄存器:一个触发器可以组成1bit寄存器,多个触发器级联可以组成一个多位寄存器,其作用就是一个小型存储器,用来暂存参与运算的数据和运算结构,一般有8bit寄存器,16bit寄存器,32bit寄存器。
锁存器:锁存器是FPGA内部电平触发存储单元,注意它没有时钟信号,数据存储取决于使能信号,当锁存器EN有效时,输出才会随着数据输入发生变化,也就是锁存的过程。
在Verilog代码中,我们经常会定义一个reg类型信号,然后写一些if else代码,例如:
定义一个reg类型信号
该信号映射到FPGA上的FF
可以看出,该信号被综合成一个触发器。同时在FPGA内部,根据复位方式(同步复位or异步复位)、复位电平(0 or 1),将触发器分为以下4种类型。举例如下:
FPGA中4类触发器
出现2个同步触发器和2个异步触发器
在FPGA设计中我们基本多使用触发器,因为触发器只有在时钟边沿才起作用,尽管输入信号中带有毛刺,也能过滤掉。然而锁存器因为它没有时钟信号,不容易进行静态时序分析,对信号传输中很容易产生毛刺,因此在设计FPGA时,尽量不用锁存器。
什么样代码会产生锁存器?条件描述不全就会容易产生Latch:
1.if语句中缺少了else语句。
2.case语句中没有给出全部的情况。
代码缺少完整条件的描述,编译工具认为在此情况下该值保持不变,就推断出了锁存器。所以,为了防止锁存器的产生,在组合逻辑一定要将 if-else语句、case 语句描述完整。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。