大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解?

  1. 什么是锁存器?
    锁存器就是用来存储状态信息,就是将这个状态一直保持。锁存器对脉冲的电平敏感,也就是电平触发,在有效的电平下,锁存器处于使能状态,输出随着输入发生变化,此时它不锁存信号,就像一个缓冲器一样;在锁存器没有使能时,则数据被锁住,输入信号不起作用,此时输出一直为锁存的状态信息。我们常见的锁存器有SR锁存器、D锁存器、JK锁存器等。
  2. 为什么锁存器不好?
    从上面的图中可以看出,锁存器对毛刺不敏感,很容易在信号上产生毛刺;而且也没有时钟信号,不容易进行静态时序分析。正是因为这两个原因,我们在FPGA设计时,尽量不用锁存器。当然,目前网上还有一种说法是FPGA中只有LUT和FF的资源,没有现成的Latch,所以如果要用Latch,需要更多的资源来搭出来。但这一观点,是错误的,我们后面会有专门的讲解。
    什么样的代码会产生锁存器?
    在组合逻辑中,如果条件描述不全就会容易产生Latch: • if语句中缺少了else语句 • case语句中没有给出全部的情况。也就是下面的情况:
    always @ *begin
    if(en==1)
    q <= d;
    end
    input [1:0]d;
    always @ (d)
    begin
    case(d)
    0: q0 <= 1’b1;
    1: q2 <= 1’b1;
    2: q2 <= 1’b1;
    3: q3 <= 1’b1;
    default: q4 <= 1’b1;
    end
    这个前提是组合电路中,在时序电路的if语句中,及时没有else,也不会综合出Latch的。上面这两种写法容易出现在什么地方呢?最常见的就是状态机,我见过不少的FPGA工程师在写状态机时,case语句中没有给出变量的全部情况。
    我们以下面的代码来说明Flip-Flop和Latch在Ultrascale的FPGA中Implementation后的结果。
    Flip-Flop代码:
    module FF_top(input clk,
    input [3:0] data_i,
    input data_ie, //enable
    output reg [3:0] o_latch );
    always @ ( posedge clk )
    begin
    if(data_ie)
    o_latch <= data_i;
    end
    endmodule
    Latch代码:
    module latch_top(
    input [7:0] data_i,
    input data_ie, //enable
    output reg [7:0] o_latch );
    always @ *
    begin
    if(data_ie)
    o_latch[3:0] <= data_i[3:0];
    end
    最后一个问题,既然Latch有这么多的问题,那为什么FPGA中还要保留?
    ① 首先就是因为FPGA电路的灵活性,保留Latch并不影响FPGA的资源,因为storage element可以直接被配置为Flip-Flop。② 其次就是有些功能是必须要使用Latch的,比如很多处理器的接口就需要一个Latch来缓存数据或地址。最后要说明的一点是:锁存器虽然在FPGA中不怎么被使用,但在CPU中却很常见,因为锁存器比Flip-Flop快很多。

另外,在数字电路设计中,DC综合插入 gating cell ,锁存器的使用也是很普遍的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值