赞
踩
系列文章目录:FPGA原理与结构(0)——目录与传送门
目录
触发器(Flip-Flop),从英语单词来看就是“翻转器”的意思。首先,数字器件只有01两种状态,因此数字电路工作的过程也就是01之间翻转的过程。为什么叫触发器呢?因为这个元件进行翻转,需要一个外部触发。按照触发的条件不同,可以将触发器分成不同的类型。
不过比起触发方式,更加通用的分类方法是按照逻辑功能。这样可以分为RS、JK、D、T触发器。不过记得数电课的时候,老师说如今的FPGA中主要都是D触发器,其他的触发器也就是做个简单的了解。
锁存器就是用来存储状态信息,就是将这个状态一直保持。锁存器对脉冲的电平敏感,也就是电平触发,在有效的电平下,锁存器处于使能状态,输出随着输入发生变化,此时它不锁存信号,就像一个缓冲器一样;在锁存器没有使能时,则数据被锁住,输入信号不起作用,此时输出一直为锁存的状态信息。我们常见的锁存器有SR锁存器、D锁存器、JK锁存器等。锁存器对毛刺不敏感,很容易在信号上产生毛刺;而且也没有时钟信号,不容易进行静态时序分析。正是因为这两个原因,我们在FPGA设计时,尽量不用锁存器。
触发器(Flip-Flop,简写为 FF),也叫双稳态门,又称双稳态触发器。在中国台湾及中国香港译作“正反器”,是一种具有两种稳态的用于储存的组件,可记录二进制数字信号“1”和“0”。触发器对脉冲边沿敏感,其状态只在时钟脉冲的上升沿或下降沿的瞬间改变。
用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果,它被广泛的用于各类数字系统和计算机中。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。工程中的寄存器一般按计算机中字节的位数设计,所以一般有8位寄存器、16位寄存器等。
在FPGA中,CLB是实现逻辑功能的基本单元,一个CLB由2个slice构成,其中每个slice就有8个存储单元。这8个存储单元还有所不同,其中的4个可以被配置成触发器(Flip-Flop,简写为 FF)或锁存器(Latch),其他4个则只能被配置成触发器(FF)。当配置为latch时,CLK为Low时latch是“透明”的,也就是我们之前提到的处于使能状态,相当于是缓冲器。值得注意的是,当那4个可以被配置成latch的存储单元被配置成latch时,剩下的4个(只能被配置成FF的)存储单元将不能被使用。
这两种不同的存储单元有很多的相同点:
(1)他们都具有数据输入端(D),时钟使能端(CE),时钟输入端(CK),以及复位/置位端(SR),以上的信号被成为DFF的控制信号,在同一个slice中,这些控制信号时公用的。
(2)它们都能通过配置INIT1 INIT0来将上电或全局复位后的初始电平配置为高或者低(这里用的是FPGA中的全局复位管脚,非用户自定义那个,属异步复位)。
(3)它们都能通过配置SRHIGH SRLOW 来控制用户复位后的的电平,与输入SR的关系如下图所示,从中我们还可以看到SR都是高电平有效的,这也是为啥XILINX 7系推荐高电平复位,低电平复位的话再前面还要插个LUT做反相器而造成浪费资源。(这里的用户复位通常指的是普通IO复位,如自定义用户按键复位) 。
(4)在同一SLICE中,同一类型的存储单元的用户复位均可配置为异步或者同步复位。
在这里,为了帮助大家更好地理解INIT1,INIT0,SRHIGH,SRLOW之间地区别,给出如下代码
- module dff_test(
- input clk,
- input rst,
- input in1,
- input in2,
-
- output data1,
- output data2);
-
- reg data1_ff = 1'b1; //INIT1
- reg data2_ff = 1'b0; //INTT0
-
- assign data1 = data1_ff;
- assign data2 = data2_ff;
-
- always@(posedge clk)begin
- if(rst)
- data1_ff <= 1'b1; //SRHIGH
- else
- data1_ff <= in1;
- end
- always@(posedge clk)begin
- if(rst)
- data2_ff <= 1'b0; //SRLOW
- else
- data2_ff <= in2;
- end
-
- endmodule
从上面的硬件结构中我们知道,latch在7系类的FPGA中依然存在,并且当存储元件被配置成latch后还会造成资源的浪费,但是我们又知道,在进行系统设计的时候,我们要尽量避免latch的产生,那为什么不直接在FPGA中去掉latch这个元素,直接全部采用FF呢?
(1) 首先就是因为FPGA电路的灵活性,保留Latch并不影响FPGA的资源,因为storage element可以直接被配置为Flip-Flop。
(2)其次就是有些功能是必须要使用Latch的,比如很多处理器的接口就需要一个Latch来缓存数据或地址。
最后要说明的一点是:锁存器虽然在FPGA中不怎么被使用,但在CPU中却很常见,因为锁存器比Flip-Flop快很多。
在FPGA中,根据复位的方式和复位后输出电平的不同把触发器和锁存器分成的不同的类型,具体分类如下:
触发器:
异步复位 | FDCE | 复位后Q输出0 |
FDPE | 复位后Q输出1 | |
同步复位 | FDRE | 复位后Q输出0 |
FDSE | 复位后Q输出1 |
锁存器:
异步复位 | LDCE | 复位后Q输出0 |
LDPE | 复位后Q输出1 |
需要注意的是,并不是说在FPGA中就存在上述的6中触发器/锁存器,实际在FPGA中的只有2种类型的存储单元,这两种存储单元可以配置成这样的6种元件。
最后给出触发器不同配置情况的verliog描述,仅供了解
- module test(
- input clk,
- input rst,
- input in1,
- input in2,
- input in3,
- input in4,
-
- output reg out1,
- output reg out2,
- output reg out3,
- output reg out4
- );
-
- // FDCE
- always @ (posedge clk or posedge rst)begin
- if(rst)
- out1 <= 1'b0;
- else
- out1 <= in1;
- end
-
- // FDPE
- always @ (posedge clk or posedge rst)begin
- if(rst)
- out2 <= 1'b1;
- else
- out2 <= in2;
- end
-
- // FDRE
- always @ (posedge clk)begin
- if(rst)
- out3 <= 1'b0;
- else
- out3 <= in3;
- end
-
- // FDSE
- always @ (posedge clk)begin
- if(rst)
- out4 <= 1'b1;
- else
- out4 <= in4;
- end
-
- endmodule
大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。