转载:从底层结构开始学习FPGA(3)— 存储单元之触发器、寄存器与锁存器

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本文转载自CSDN博主「孤独的单刀」的原创文章,原文链接:https://blog.csdn.net/wuzhikaidetb/article/details/124830516

一、基本概念

📌 触发器:触发器是 边沿敏感的存储单元,数据存储的动作由某一信号的上升或者下降沿进行同步的。触发器是计算机记忆装置的基本单元,一个触发器能储存一位二进制代码。
📌 锁存器:锁存器是 电平触发的存储单元,数据存储的动作取决于使能信号的电平值,当锁存器处于使能状态时,输出才会随着数据输入发生变化。(简单地说,它有两个输入,分别是一个有效信号EN,一个输入数据信号DATA_IN,它有一个输出Q,它的功能就是在EN有效的时候把DATA_IN的值传给Q,也就是锁存的过程)。
📌 寄存器:一个触发器可以组成一个一位的寄存器,多个触发器可以组成一个多位的寄存器。存储器是由大量寄存器组成的,其中每一个寄存器就称为一个存储单元。它可以存放一个有独立意义的二进制代码。

  在数字电路中存储单元有两种,一种是触发器,一种是锁存器。它们两者最大的区别是:前者通过时钟沿到来改变存储的输出状态,后者是通过电平变换来改变存储的输出状态。在 FPGA 中我们基本多使用触发器,锁存器在很多情况下都是要避免使用的,因为其不需要时钟,所以不是时序元件,对毛刺无过滤功能,非常敏感,容易出问题。

  而我们平时所说的寄存器,基本上理解为一个或者一组触发器(Flip Flop, FF)。


二、FPGA内部的存储单元

  在7系列 FPGA 的底层 — 可编程逻辑块(CLB)中有两个 SLICE,其中每个 SLICE 都含有8个存储单元。虽然说是存储单元,但实际上是4个触发器 FF+ 4个触发器FF或锁存器LATCH(可配置为其中一种)。其结构如下图:

  左边的4个存储单元只能作为触发器使用,而右边的4个存储单元则不光能作为触发器使用,还能作为锁存器使用。但是需要注意的是:一旦 SLICE 中(也就是8个FF)中的4个FF被作为LATCH使用,那么剩下的4个FF就无法使用了,会造成资源浪费


三、触发器

  在 FPGA 内部的触发器都常会被配置成D触发器,根据其复位方式、复位电平和上电电平值的不同,可将其分为不同的种类。

  在 Verilog 语言中,我们定义一个 reg 会在 FPGA 映射成一个或者一组FF。举例如下:

module test(
    input             clk,
    input             rst_n,
    input             in1,
    output reg        A
);
 
always@(posedge clk)begin    
    if(~rst_n)
        A <= 1'b0;
    else
        A <= in1;
end
endmodule

  显然,在 FPGA 的实现就是1bit的 FF:

  而下面的语句在 FPGA 的实现则会类推到4个 FF:

module test(
    input             clk,
    input             rst_n,
    input      [3:0]  in1,
    output reg [3:0]  A
);
 
always@(posedge clk)begin    
    if(~rst_n)
        A <= 4'd0;
    else
        A <= in1;
end
endmodule

  在 FPGA 中的映射如下:

  如果你还记得数电的话,就应该能看出来,上面配置的触发器实际上就是D触发器(DFF)。通过对复位方式、复位电平参数的配置,可以将D触发器约定为下述4种基本组成情况:

  • 异步复位(FDCE)

  • 异步置位(FDPE)

  • 同步复位(FDRE)

  • 同步置位(FDSE)

  这4种类型的D触发器如何用 Verilog 实现?接下来我们就建个工程看看究竟,Verilog代码:

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

  vivado推断的门级电路如下:

  推断出了2个同步寄存器和2个异步寄存器,其他信息暂时还看不到,但也和我们预料的基本一致。vivado 综合的原理图:

  到这一步,基本就是综合出了上面例举的4种不同类型的DFF了。再来看看到FPGA的映射:

   ❓ 这里有个很有意思的地方就是:4个DFF会映射到2个不同的SLICE里边,而它们所在的SLICE其实都还是有空间的,那这是为什么?
  时钟使能信号CE、时钟信号CLOCK和置位/复位信号SR是DFF的控制信号,它们的一组值构成DFF的一个控制集。 在同一个SLICE中,必须保证所有DFF的控制集是相同的。
  在上述Verilog代码中,4个DFF根据控制集的不同,可以分为2类:异步类与同步类(SR区分),所以在FPGA实现时,会把这两类DFF分别映射到2个SLICE里去。

  在上面的部分我们还了解了DFF的一些参数如下:

INIT1:表示 FF 在 上电或者全局复位时初始化值为1
INIT0:表示 FF 在上电或者全局复位时初始化值为0
SRHIGH:表示 FF 在 SR置位时(即用户复位),FF的值为1
SRLOW :表示 FF 在SR置位时(即用户复位),FF的值为0

  接下来我举例来说明这几个参数究竟对应着什么:

module test(
    input     clk,
    input     rst,
    input     in1,
    input     in2,
    output    out1,
    output    out2
);
 
reg    out1_r = 1'b1;            // INIT1
reg    out2_r = 1'b0;            // INTT0
 
assign out1 = out1_r;
assign out2 = out2_r;
 
always@(posedge clk)begin    
    if(rst)
        out1_r <= 1'b1;          // SRHIGH
    else
        out1_r <= in1;
end

always@(posedge clk)begin    
    if(rst)
        out2_r <= 1'b0;          // SRLOW
    else
        out2_r <= in2;
end
 
endmodule

  这次我们不看图了,我们使用TCL(Tool Command Language)指令:write_verilog -force test.v 来看看实现的网表。如下(截取部分有用信息):

  第1个always块的DFF被综合成立FDSE(同步置位set,即1)且上电初始值为1, 这与Verilog代码一致;第2个always块的DFF则被综合成立FDRE(同步复位reset,即0)且上电初始值为0, 同样与Verilog代码一致。

  最后要说明的是:SR默认高电平有效,所以在Xilinx器件的代码中,一般建议使用高电平复位,如果使用低电平复位则需要在前面加个LUT6作为反相器有点浪费资源,而Altera的底层逻辑则是低电平复位有效。当然了,我一般是不建议你使用复位的,除非是一些没办法的控制逻辑。这可以参考:FPGA的复位设计要醒目点啦


四、锁存器

  从寄存数据的角度来讲,触发器和锁存器的功能是相同的。它们的区别在于触发器是同步时钟控制,而锁存器是电位信号控制。触发器是指由时钟边沿触发的存储单元。锁存器指由信号而不是时钟控制的电平敏感的设备。

  锁存器的工作原理:锁存器不同于触发器,锁存器在不锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓存器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。因此锁存器也称为透明锁存器,指的是不锁存时输出对输入是透明的。

  锁存器具备下列缺点:

  • 对毛刺敏感,不能异步复位,因此在上电后处于不确定的状态。

  • 锁存器会使静态时序分析变得非常复杂,不具备可重用性。(首先, 锁存器没有时钟参与信号传递,无法做 STA;其次,综合工具会将 latch 优化掉,造成前后仿真结果不一致)

  根据锁存器的特点可以看出,在电路设计中,要对锁存器特别谨慎,如果设计经过综合后产生出和设计意图不一致的锁存器,则将导致设计错误,包括仿真和综合。因此,在设计中需要避免产生意想不到的锁存器。

  下列场景会产生锁存器(时序逻辑不会产生锁存器):

  • 不完整的组合逻辑语句always块中if-else语句不完整

  • 不完整的组合逻辑语句always块中case语句不完整

  🚩 举例1:if 语句中缺少 else

module test
(
    input        in,
    input        en,
    output  reg  out
);
 
always@(*)begin    
    if(en)    out = in;        
    //else    out1_r = in1;    // 缺少else
end
 
endmodule

  在 vivado 中 analysis 的原理图如下:

  🚩 举例2:组合逻辑的 case 语句不完整:

module test(
    input            a,
    input            b,
    input    [1:0]   en,
    output    reg    out
);
 
always@(*)begin    
    case(en)
        2'b00:out = a;
        2'b01:out = b;
        // case 语句不完整
    endcase
end
 
endmodule

  在 vivado 中 analysis 的原理图如下:

  上述两种情况都是,代码缺少完整条件的描述,编译工具认为在此情况下该值保持不变,就推断出了锁存器。

  所以,为了防止锁存器的产生,在组合逻辑一定要将 if-else语句、case 语句描述完整,而时序逻辑则没有这个问题。

寄存器触发器锁存器的区别联系 寄存器是一个数据存储元件,通常由。 阅读详情

相关推荐

底层结构开始学习FPGA(2)----LUT查找表

LUT到底是啥?

孤独的单刀 3万+

数电基础:触发器寄存器

1、锁存器(latch) 是电平触发单元,数据存储的动作取决于输入时钟(或使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据的输入发生变化。 简单说:两输入信号为使能信号EN,数据输入信号DATA_IN,以及一个输出信号Q,它的功能就是在EN有效的时候把输入数据DATA_IN的值传给Q,EN无效的时候就保持原有输出状态,直到EN再次有效,这就是锁存过程。也称透明...

风中少年的博客 1万+

FPGA触发器寄存器区别

寄存器可以容纳多个比特位的数据,并通过使用不同的时序逻辑进行读写操作,以更新存储的状态。由于寄存器不需要时钟信号的控制,它们适用于需要快速响应的控制逻辑场景,比如启动/停止指令的解码执行。触发器的输入端口可以接收时钟信号,当时钟信号发生上升沿或下降沿时,触发器会将输入数据存储到输出端口,完成数据的传输存储操作。由于触发器的特性,它们适用于需要保持存储数据以备下一次计算使用的场景,比如数字滤波器、状态机等。在FPGA中,触发器寄存器是常用的存储元件,但它们有着不同的特性应用场景。

学习使你进步。 653

芯片验证---硬件基础

一、锁存器(Latch) SR锁存器(基本锁存器): 由两个或非门或者两个非门组成,电路结构、图形符号特性表如下所示。 此时,输出状态(次态)输入状态、锁存器初态都有关。 电平触发SR触发器(门控SR锁存器): 当CLK=0时(无效),输出状态(次态)保持不变;只有当CLK=1时(有效),输出状态才随输入、初态的不同而改变,且SR锁存器的特性一样。 当门控锁存器的控制...

nothing_to_know的博客 1413

锁存器触发器寄存器的关联区别及其相应的verilog描述

1:锁存器触发器寄存器的关联区别 首先应该明确锁存器触发器是由非门之类的东西构成。尤其是锁存器,虽说数字电路定义含有锁存器触发器的电路叫时序电路,但锁存器有很多组合逻辑电路的特性。 锁存器(latch) 电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,当锁存器处于使能状态时,输出才会随着数据输入发生变化。(简单地说,它有两个输入,分别是一个有效信号EN,一个输入数据信号DATA_IN,它有一个输出Q,它的功能就是在EN有效的时候把DATA_IN的值传给Q,也

gsp12356的博客 7142

FPGA从入门到精通(5) - 存储单元&CLB总结

本文深入探讨了XILINX FPGA存储单元的结构特性,区分了触发器锁存器,并重点讲解了触发器的应用。通过图示例子阐释了存储单元的数据输入、时钟使能、复位端等功能,并讨论了存储单元1存储单元2的异同点。同时结合前文内容,回顾了CLB的整体结构,梳理了LUT、进位链、存储单元以及MUX在FPGA设计中的作用相互关系。最后通过实例展示了SLICE在CLB中的排列互联方式,为读者提供了FPGA设计的实用知识。

详解FPGA及硬件电路开发 596

转载锁存器寄存器触发器区别

一、锁存器 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态 锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。 锁存器不同于触发器,它不在锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓冲器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。锁存器也称为透明锁

天山懒人 1507

锁存器触发器寄存器区分

锁存器 在实际的数字系统中,通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器.由于触发器内有记忆功能,因此利用触发器可以方便地构成寄存器。由于一个触发器能够存储一位二进制码,所以把n个触发器的时钟端口连接起来就能构成一个存储n位二进制码的寄存器锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时,输出...

weixin_34015336的博客 175

彻底理解Intel FPGA时序约束—基础概念(一)

转载大佬文章:https://www.fpga-china.com/11529.html 彻底理解Intel FPGA时序约束—基础概念(一) 一、引言 时隔一年多,因某些原因,本人对文章内容进行再次审核并更改。FPGA的时序约束其实IC中的时序约束是有异曲同工之妙,何为约束,以我目前认知水平来看,就是IC设计或者FPGA设计中, 你需要告诉EDA工具,需要建模成一个怎样的模型。好比FPGA来说,如同乐高积木,你需要去指定你最终要综合成为一个怎样的电路模型,你的每一块乐高积木(cell单元)应.

u011393762的博客 1031

转载FPGA 中的latch 锁存器

   以下这篇文章讲述了锁存器的一些概念注意事项。原文标题及链接: FPGA 中的latch 锁存器 - 快乐至永远上的博客 - 非博客 - 网http://www.eefocus.com/liuyuxue/blog/13-11/300280_d7008.html   一直都知道fpga中有latch这么一回事,但是一直都不太清楚到底什么是锁存器,它是怎么产生的,它到底寄存器有多少区...

weixin_33836874的博客 257

FPGA的基础架构,什么是CLB?

还可通过F8MUX进行级联形成一个8输入的LUT,逻辑资源换算关系:6输入查找表是4输入查找表的1.6倍查找表LUT本质是RAM,相当于一个多路选择器LUT可参进位逻辑,进行算数运算单元进行异或运算等,也可直接输出。CLB的实际数量特性会依器件的不同而不同,但是每个CLB都可配置,在Xilinx公司的FPGA器件中,CLB由2个相同的SliceL或则一个SliceL一个SliceM构成。SLICEM在不使用触发器的情况下可以设置成32bit的移位寄存器,4个LUT可级联成128bit的移位寄存器

MYMINIEYE的博客 1354

每天10道数字前端笔试题(2)

转载自https://blog.csdn.net/qq_41394155/article/details/89349935?ops_request_misc=%7B%22request%5Fid%22%3A%22159169877919724846445826%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=159169877919724846445826&biz_id=0&utm_medium=distribute

coin的博客 1537

XILINX 7系列FPGA_Slice_存储器_XADC篇

XILINX 7系列FPGA的Slice、存储器、XADC结构简介

qq_35712169的博客 3579

latchDFF

最近看RISC CPU设计,发现里面的设计有Latch,以前记得总是说最好不要用Latch,所以就有点怀疑,于是查了一些资料,发现虽然Latch有一定的缺点,但是既然它存在,就肯定就有优点,原来它占用面积更小,运行速度更快,所以有时会用在CPU设计,但是在普通设计中,还是不提倡的,既然提到了Latch,那就不能不说说它相关的几个其它概念:触发器寄存器锁存器(latch):我听过...

weixin_30823833的博客 447

FPGA的基本结构

一、FPGA的基本结构 FPGA由6部分组成,分别为可编程输入/输出单元、基本可编程逻辑单元、嵌入式摸块RAM、丰富的布线资源、底层嵌入式功能单元内嵌专用硬核等。 每个单元简介如下: 1.可编程输入/输出单元(I/O单元) 目前大多数FPG...

chenzhiji6200的博客 263

转载:VerilogHDL可综合设计+Comments

  可综合的语法已经记录得差不多了,剩下一些遗留的问题,在这里记录一下吧。 一、逻辑设计 (1)组合逻辑设计 下面是一些用Verilog进行组合逻辑设计时的一些注意事项:   ①组合逻辑可以得到两种常用的RTL 级描述方式。第一种是always 模块的触发事件为电平敏感信号列表;第二种就是用assign 关键字描述的数据流赋值语句。   ②always 模块的敏感表为电平敏感信号的电路可几乎可以完成对所有组合逻辑电路的建模。always模块的敏感列表为所有判断条件信号输入信号,但一定要注意敏感列表的完整.

ChipArtist's Blogs 455

触发器或存储过程实现级联操作_XILINX 7系列FPGA_Slice_存储器_XADC篇

目录一览0.转载说明1.Slice结构简介2.存储器结构简介3.XADC结构简介0.转载说明FPGA开发,不知道所使用组件的特性,怎能开发出优秀的设计呢!!!这部分内容原作者总结的有点简短,看看就好。原文链接: xilinx 7系列FPGA之slice篇简介 xilinx 7系列FPGA之存储器篇简介 xilinx 7系列FPGA之XADC简介 原文图片均参考自 7 Series FPGAs Co...

weixin_39869432的博客 585
上一篇: 转载:从底层结构开始学习FPGA(1)— 可配置逻辑块CLB(Configurable Logic Block)
下一篇: 转载:从底层结构开始学习FPGA(4)— MUX多路选择器(Multiplexer)
ZBigluck
博客等级 码龄4年 37粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值