FPGA设计中锁存器产生、避免与消除

这篇具有很好参考价值的文章主要介绍了FPGA设计中锁存器产生、避免与消除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、锁存器的产生

  锁存器的产生主要有以下两种情况:(1)组合逻辑中使用保持状态;(2)组合逻辑中的if-else语句或case语句未列出所有可能性;

1.1 组合逻辑中使用保持状态

assign data_out = valid ? data_in : data_out; //变量保持当前值
always @(*) begin
    if(valid)
        data_out = data_in;
    else
        data_out = data_out; //变量保持当前值
end

1.2 组合逻辑中的if-else语句或case语句未列出所有可能性

  对于组合逻辑中,如果使用if-else语句,未补全else语句,则默认在其他条件下,数据均保持为原来的状态,那么也会产生锁存器。

//if-else语句缺少else
always @(*) begin
    if(valid)
        data_out = data_in;
end

  而如果在组合逻辑中使用case语句,未列出case中条件所有的可能性,则相当于对于未列出的那些情况,数据均保持为原来的状态,也会产生锁存器。

//case语句未列出所有可能性
always @(*) begin
    case(sel)
        2'b00: data_out = 2'b00;
        2'b01: data_out = data_in;
    endcase
end

1.3 小结

  那么,总而言之,言而总之。对于锁存器,其产生的原因可以总结为一点:想要通过组合逻辑保持数据不变。对于组合逻辑的实现,我们可以认为它是用很多门电路搭建而成的,那么,门电路与寄存器不同,其不具有保持当前状态的功能。也就是说,构成当前组合逻辑的电路中任何一个信号发生改变,都会导致输出结果发生改变。如果要通过组合逻辑实现保持数据的不变,那就只能产生锁存器了(可以参考《数字电子技术基础》第五版的SR触发器)。

二、锁存器的避免

  我们知道了锁存器的产生原因,就可以对症下药,在编写Verilog代码时注意编码风格,即可避免锁存器的产生。

(1)在组合逻辑中使用if-else语句时补全else语句

always @(*) begin
    if(sel)
        data_out = data_in;
    else
        data_out = 2'b00;
end

(2)在组合逻辑中使用case语句时,设置默认状态default,并默认状态下的数据进行赋值

always @(*) begin
    case(sel)
        xxx: data_out <= 2'b01;
        xxx: data_out <= data_in;
        default: data_out = 2'b00;
    endcase
end

(3)在组合逻辑中,不可一个变量赋值给变量自身

//错误示例
always @(*) begin
    if(sel)
        data_out = data_in;
    else
        data_out = data_out; //变量赋值给变量自身
end

//正确示例
always @(*) begin
    if(sel)
        data_out = data_in;
    else
        data_out = 2'b00; //需要赋值一个准确的数值或者其他变量
end

三、锁存器的消除

  在FPGA设计过程中,有可能出现一些情况,必须使用组合逻辑,保证其实时性,且需要保持数据不变,保证其他运算的正确性。那么又该如何处理?

3.1 情况一

  假如我们要实现如下面时序图所示功能,输出data_out在有效信号valid的上升沿处锁存输入data_in的值,那么要如何实现?

FPGA设计中锁存器产生、避免与消除

  最开始考虑的是采用时序逻辑进行实现,代码如下。

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        data_out <= 'd0;
    else if(valid)
        data_out <= data_in;
    else
        data_out <= data_out;
end

  那么,采用时序逻辑实现,会导致延迟一怕,无法在有效信号valid的上升沿锁存数据,如下图所示。
FPGA设计中锁存器产生、避免与消除

  于是考虑使用组合逻辑进行实现,代码如下。

assign data_out = valid ? data_in : data_out;

  但是组合逻辑要实现保持状态,必然会产生锁存器。综合后会再Messages界面会警告出现锁存器,同时在Schematic中也可以看到出现了锁存器,如下图所示。而在我们的设计中,我们是不希望出现锁存器的,因为其不利于时序分析。

FPGA设计中锁存器产生、避免与消除
FPGA设计中锁存器产生、避免与消除

  那么,也可以采用组合逻辑+时序逻辑的方式实现,通过多使用一部分寄存器资源,来实现在valid上升沿处进行数据采样,且不产生锁存器,代码如下。重新综合后,可见锁存器消失,同时可以对齐进行仿真,时序符合前面的要求。

reg     [3:0]    r_data_in;

always @(posedge sys_clk or negedge sys_rst_n)
    if(!sys_rst_n)
        r_data_in <= 'd0;
    else
        r_data_in <= data_in;

assign data_out = valid ? data_in ? r_data_in;

FPGA设计中锁存器产生、避免与消除文章来源地址https://www.toymoban.com/news/detail-436597.html

到了这里,关于FPGA设计中锁存器产生、避免与消除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「FPGA」基本时序电路元件——锁存器和触发器

    FPGA是一种数字电路实现的方式,它是基于小型查找表(16X1)设计的,它的兄弟CPLD是基于高密度复杂组合逻辑设计的。FPGA的一个优点是触发器资源丰富,适合实现复杂的时序设计。本文将从 门级电路 的角度来介绍时序电路的基本结构,锁存器(Latch)和触发器(flip-flop)。

    2024年02月11日
    浏览(52)
  • FPGA结构:LATCH(锁存器)和 FF(触发器)介绍

    如果你想学习有关FPGA的专业术语,可以参考这一篇:FPGA专业术语介绍 一句话概括,能够存储一个状态的数字电路叫做锁存器。 以下是最为基本的一个RS锁存器的具体结构: 以下是它的真值表,其中X表示不确定/无效: R {R} R (清零) S {S} S (置位) Q ( t ) {Q(t)} Q ( t ) (上一时刻的

    2024年01月25日
    浏览(56)
  • FPGA中锁存器(latch)、触发器(flip-flop)以及寄存器(register)详解

    1 定义 1.1 锁存器(latch)     锁存器是一种由电平触发的存储单元,为异步电路,数据存储的动作取决于输入信号的电平值,只要输入发生变化,输出即随之发生变化。 1.2 触发器(flip-flop)     触发器是边沿敏感的存储单元,数据存储的动作由某一信号的上升或者下降

    2024年02月12日
    浏览(42)
  • 什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch

    在FPGA设计中,几乎没人会主动使用 锁存器Latch ,但有时候不知不觉中你的设计莫名其妙地就生成了一堆Latch,而这些Latch可能会给你带来巨大的麻烦。 Latch,锁存器,一种可以存储电路状态信息的组合逻辑元件,和同样可以保存电路状态的时序逻辑元件–触发器(Flip-Flop,

    2024年02月05日
    浏览(36)
  • 【IC设计】时序逻辑的基础—锁存器、触发器

    波形图中,表达时序逻辑时如果时钟和数据是对齐的,则默认当前时钟沿采集到的数据位在该时钟上升沿前一时刻的值。表达组合逻辑时如果时钟和数据是对齐的,则默认当前时钟沿采集到的数据为该始终上升沿同一时刻的值。 组合逻辑和时序逻辑的区别 : 主要是看 数据工

    2024年02月03日
    浏览(39)
  • educoder数字逻辑实训:锁存器和触发器设计(Logisim)

    第1关:基本SR锁存器的设计 任务描述 本关任务:在Logisim中,构建由两个或非门构成的基本SR锁存器。 第2关:门控SR锁存器的设计  任务描述 本关任务:在Logisim中,在基本锁存器的基础上构建门控SR锁存器。 第3关:与非门构成的门控SR锁存器的设计  任务描述 本关任务:在

    2024年02月04日
    浏览(44)
  • 【FPGA】Verilog:锁存器 Latch | RS Flip-Flop 与 D Flip-Flop 的实现

    💭 写在前面: 本章将理解 RS/D 锁存器的概念,了解 RS/D/JK 触发器的概念,使用 Verilog 实现各种锁存器 (Latch) 和翻转器 (Flip-Flop),并通过 FPGA 验证用 Verilog 的实现。 📜 本章目录: Ⅰ. 前置知识回顾 0x00 锁存器(Latch)

    2024年02月05日
    浏览(46)
  • 锁存器、D触发器、寄存器理解

    1、锁存器        锁存器对脉冲的电平敏感,也就是电平触发,在有效的电平下,锁存器处于使能状态,输出随着输入发生变化,此时它不锁存信号,就像一个缓冲器一样;在锁存器没有使能时,则数据被锁住,输入信号不起作用,此时输出一直为锁存的状态信息(锁存最后

    2024年02月09日
    浏览(44)
  • 锁存器&触发器

    目录 一、锁存器(Latch):电平敏感1/0,是数字电路中的一种具有记忆功能的逻辑元件 二、触发器(Flip-Flop,FF):在时钟信号触发时才能动作的储存单元。 2.1 SR触发器:Q*=S+R\\\'Q, SR=0(约束条件)  2.2 JK触发器:Q*=JQ\\\'+K\\\'Q 2.3 T触发器:Q*=TQ\\\'+T\\\'Q 2.4 D触发器:Q*=D  三、触发器与锁

    2024年01月19日
    浏览(47)
  • 数字电路基础---锁存器

    目录 锁存器 1、简介 2、实验任务 3、程序设计 3.1、缺少 else 分支的锁存器代码 3.2、补齐 else 分支 3.3、缺少 default 的 case 语句的锁存器代码 3.3、补齐 default 的 case 语句 4、本章总结        锁存器(俗称 Latch) 是数字电路中的一种具有记忆功能的逻辑元件。锁存器对脉冲电

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包