欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > FPGA Verilog/VHDl 中的锁存latch

FPGA Verilog/VHDl 中的锁存latch

2025/3/31 23:41:54 来源:https://blog.csdn.net/u014035968/article/details/146591586  浏览:    关键词:FPGA Verilog/VHDl 中的锁存latch

目录

  • 一、前言
  • 二、锁存器定义
  • 三、verilog中锁存的产生
  • 四、verilog中锁存的影响和消除
  • 五、FPGA中的锁存器资源

一、前言

     在做FPGA设计时,我们要求在组合逻辑设计时,case或者if-else条件要完整,否则会产生锁存。本文主要介绍锁存产生的原因和影响,以及如何规避锁存的产生。

二、锁存器定义

我们回顾一下最基础的数字电路,什么是锁存器:

锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器是利用电平控制数据的输入,它包括不带使能控制的锁存器和带使能控制的锁存器。

注:很多书本或者介绍中将触发器和锁存器混淆,其实笔者觉得即可以叫锁存器也可以叫寄存器,但由于有了时钟延触发寄存器的产生,我们一般称时钟边沿触发的为触发器,电平触发的为锁存器。

常见的锁存器有多种:
(1)基本的RS锁存器

  基本RS锁存器可由与非门实现或者用或非门实现,下图为采用或非门实现原理图,其中”S“是置位输入端,”R“是复位输入端,”Q“为状态输出端,”Q’“为反相状态输出端。
在这里插入图片描述
(2)门控RS锁存器

  在基本RS锁存器加一级门控,CP=0时一级控制门被封锁,基本锁存器保持原来的状态不变,只有当CP=1时控制门被打开后,输入信号才会被接收,此时其工作情况与基本RS锁存器没什么区别。
在这里插入图片描述
在这里插入图片描述
(3)D锁存器

  将门控SR锁存器进行优化改动,就得到D锁存器。当E=0时锁存数据,E=1时输出跟随输入D变化
在这里插入图片描述

  将两个D锁存器级联,即可产生时钟边沿触发的D触发器,也就是时序电路设计中常用的DFF。

在这里插入图片描述
  从以上描述可知道,D触发器有锁存器演进进化而来,不管是锁存器和触发器,其主要是个存储模块,为了锁存数据,只是锁存数据的方式有些不同,所以很多书上将锁存器称为触发器也没问题。

三、verilog中锁存的产生

在verilog中编辑以下代码,else或case条件赋值不完全:

always @(*) beginif(asel) o_a  = in_a;
end
always @(*) begincase(bsel)2'd0:o_b = 2'd3;2'd1:o_b = 2'd2;2'd2:o_b = 2'd1;endcase
end

或者以下代码,为了完整的if-else,组合逻辑采用信号自己等于自己如 o_a = o_a ;

always @(*) beginif(asel) o_a  = in_a;else o_a  = o_a  ;
end
always @(*) begincase(bsel)2'd0:o_b = 2'd3;2'd1:o_b = 2'd2;2'd2:o_b = 2'd1;default:o_b = o_b;endcase
end

以上两种写法综合后如下图所示,从图中可知o_b 和o_a 均产生了latch LDCE。
对于if else模块,latch的锁存信号为asel,当asel为0时o_a保持不变(锁存),当asel为1时,o_a跟随 in_a变化。case模块同理。
在这里插入图片描述
从以上分析可以得出结论:
当if-else或者case中,各条件未完全正常赋值可导致latch产生
通过修改代码如下:

always @(*) beginif(asel) o_a  = in_a;else o_a  = 1'b0;
end
always @(*) begincase(bsel)2'd0:o_b = 2'd3;2'd1:o_b = 2'd2;2'd2:o_b = 2'd1;2'd3:o_b = 2'd0;endcase
end

以上写法综合后如下图所示,从图中可知if-else产生了正常的选择器。case模块逻辑也正常,因case的写法等同为取反逻辑,所以软件直接优化为LUT取反了,没有产生LDCE。
在这里插入图片描述

四、verilog中锁存的影响和消除

上面描述了锁存的产生,那么锁存一定是错误的吗?也不一定,只是FPGA一般是时序逻辑电路,受时钟驱动,一般存储采用同步的DFF实现。但锁存也是一种有效逻辑,如在时延要求很高时序逻辑无法实现的情况下,锁存也是一种正常的电路逻辑,如第三章中的if-else中,如果确实需要再in_a为0时o_a保持,那么第三章中的if-else逻辑均为正确的逻辑,其实现的就是一个门控锁存器功能(第二章中有描述)。但在FPGA中采用锁存有一些问题:
(1)产生竞争冒险,不利于后续电路,使电路稳定性降低;
(2)给时序分析带来一定挑战,不利于时序分析


至于如何消除latch,前面已经从latch的产生中说明:
有完整的if-else赋值、有完整的case条件赋值,并且不能出现输出信号自己等于自己。

五、FPGA中的锁存器资源

在Xilinx V7芯片对以上代码进行布局布线,发现Latch使用的是存储单元(storage elements)资源,说明FPGA中FF可以被配置为锁存器,这在数据手册中可以看到。同时对照第二章,我们知道锁存器和触发的电路相似,所示Xilinx在做设计时兼容了这两种设计。
在这里插入图片描述
如下图所示,Xilinx每个SILCE有8个存储单元。其中:

  • 有四个存储单元既可以配置为边沿触发的D触发器或者电平敏感的锁存器,D输入可以直接由LUT输出通过AFFMUX、BFFMUX、CFFMUX或DFFMUX驱动,也可以由旁路片输入通过AX、BX、CX或DX输入绕过函数生成器驱动;
  • 另外四个存储单元只能配置为边沿触发的D触发器,D输入可以由LUT的O5输出或通过AX、BX、CX或DX输入的BYPASS切片输入驱动。另外,当上述的4个存储单元被配置为锁存器时,这四个存储单元不能够被使用;

在这里插入图片描述

参考资料:

1、7 Series FPGAs Configurable Logic BlockUser Guide
2、数字电路基础

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词