避免latch verilog FPGA 基础练习2

这篇具有很好参考价值的文章主要介绍了避免latch verilog FPGA 基础练习2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

避免latch verilog FPGA 基础练习2

发现问题,用技术解决问题。兴趣是自己的源动力 !

前言

本文由如何避免latch的问题场景,来更详细的描述verilog中的组合逻辑电路和时序逻辑电路等等理论知识。由latch这个问题入手来阐述更多理论知识,有助于更好的理解和记忆。


一、latch是什么?

Latch其实就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息。锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用。因此,锁存器也被称为透明锁存器,指的是不锁存时输出对于输入是透明的。

简单理解latch的核心就是一句话:一旦锁存信号有效,则数据被锁存,输入信号不起作用。

二、latch出现的场景和危害

2.1 场景

Latch的问题是因为只有组合逻辑才会产生这种问题,产生Latch是我们在同步电路中尽量避免的,但并不表示Latch没有用的或者说是错误的,Latch在异步电路中是非常有用的,只是我们设计的是同步电路,要尽量避免。

上面这句话说只有组合逻辑才产生latch,又接着说latch在同步电路中要避免,如果不理解组合逻辑、时序逻辑、异步电路和同步电路,理解起来会有点绕。2.3、2.4节会对这句话解惑。

2.2 危害

在同步电路中Latch会产生不好的效果

  • 如对毛刺敏感;不能异步复位,上电后处于不定态;还会让静态时序分析变得十分复杂;

理解:从latch本身的特性出发:一旦锁存信号有效,则数据被锁存,输入信号不起作用。理解了这句话,就可以明白为什么latch会产生这么多不良效果了

  • 在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用使用寄存器来组成锁存器所以会占用更多逻辑资源;在ASIC设计中,锁存器也会带来额外的延时和DFT,并不利于提高系统的工作频 率

简单理解就是:锁存器可能会有多个寄存器组成,浪费资源。

2.3 组合逻辑和时序逻辑

这里先给出组合逻辑和时序逻辑的概念的简单理解:

  • 组合逻辑:数字电路满足任意时刻的输出仅仅取决于该时刻的输入,那么该数字电路为组合逻辑电路。简单理解就是输入进来立刻输出*

注意:这里的数字电路不是仅仅理解为一个电路与门,如下图。可能是一个复杂的组合逻辑。
避免latch verilog FPGA 基础练习2,FPGA verilog编码实战系列,fpga开发

两种组合逻辑代码如下:

always @(*)  
    temp <= A + B;  
assign  temp <= A + B;  
  • 时序逻辑:如果数字电路任意时刻的输出不仅取决于当前时刻的输入,而且还取决于数字电路原来的状态,那么该数字电路为时序逻辑电路。简单理解就是输出的值要依赖某个状态,这个状态就是时钟的上升沿或者下降沿*

下面是时序逻辑代码示例

    always @(posedge clk or posedge reset) begin  
        if (reset) begin  
            Q <= 4'b0000;  
        end else begin  
            Q <= Q + 1;  
        end  
    end  

2.4 同步(时序)逻辑电路 和 异步(时序)逻辑电路

  • 同步时序电路:狭隘的定义就是数字电路(简单或者复杂的与或门组合)被同一个时钟信号驱动。
    避免latch verilog FPGA 基础练习2,FPGA verilog编码实战系列,fpga开发

注意理解:时序逻辑电路中肯定有组合逻辑的成分存在,但组合逻辑电路中却不可能有时序逻辑的成分存在。
这里可以返回到2.1节去理解,latch只有在组合逻辑中存在。因为时序电路中存在组合逻辑(这里不要只从verilog代码层面去考虑,要从verilog代码映射的电路图来考虑,如上图),所以需要在同步电路中去避免latch的产生。

  • 异步时序电路:简单理解就是一个时序电路(异步也是时序电路),多个有差异的时钟来决定输入输出

这里总结一下第二节的内容:组合逻辑、时序逻辑、同步时序和异步时序,理解的关键就是抓住输入输出这两个关键词。即:输入和输出不依赖其他信号就是组合逻辑,依赖时钟就是时序逻辑。时序逻辑中又分同步和异步,输入输出只依赖一个时钟就是同步,依赖多个时钟就是异步。

理解以上概念了,再回头看latch发生的场景,就豁然开朗了。

三、如何避免latch

  • 情况一:组合逻辑中if语句没有else
module latch_one
(
input wire in1 , //输入信号in1
input wire in2 , //输入信号in2
input wire in3 , //输入信号in3

output reg [7:0] out //输出信号out
);

 //out:根据3个输入信号选择输出对应的8bit out信号
 always@(*)
 if({in1, in2, in3} == 3'b000)
 out = 8'b0000_0001;
 else if({in1, in2, in3} == 3'b001)
 out = 8'b0000_0010;
 else if({in1, in2, in3} == 3'b010)
 out = 8'b0000_0100;
 else if({in1, in2, in3} == 3'b011)
 out = 8'b0000_1000;
 else if({in1, in2, in3} == 3'b100)
 out = 8'b0001_0000;
 else if({in1, in2, in3} == 3'b101)
 out = 8'b0010_0000;
 else if({in1, in2, in3} == 3'b110)
 out = 8'b0100_0000;
 else if({in1, in2, in3} == 3'b111)
 out = 8'b1000_0000;
 // else 把最后一个if的else注释掉,就会产生latch
 // out = 8'b0000_0001;

 endmodule
  • 情况二:组合逻辑中case的条件不能够完全列举且不写default
module latch_two
(
input wire in1 , //输入信号in1
input wire in2 , //输入信号in2
input wire in3 , //输入信号in2

output reg [7:0] out //输出信号out
);

 //out:根据3个输入信号选择输出对应的8bit out信号
 always@(*)
 case({in1, in2, in3})
 3'b000 : out = 8'b0000_0001;
 3'b001 : out = 8'b0000_0010;
 3'b010 : out = 8'b0000_0100;
 3'b011 : out = 8'b0000_1000;
 3'b100 : out = 8'b0001_0000;
 3'b101 : out = 8'b0010_0000;
 3'b110 : out = 8'b0100_0000;
 //把最后一种情况和default都注释掉,使case的条件不能够完全列举
 //3'b111 : out = 8'b1000_0000;
 //default: out = 8'b0000_0001;
 endcase

 endmodule

 endmodule
  • 情况三:组合逻辑中输出变量赋值给自己
module latch_three
(
input wire in1 , //输入信号in1
input wire in2 , //输入信号in2
input wire in3 , //输入信号in3

output reg [7:0] out //输出信号out
);

 //out:根据3个输入信号选择输出对应的8bit out信号
 always@(*)
 if({in1, in2, in3} == 3'b000)
 out = 8'b0000_0001;
 else if({in1, in2, in3} == 3'b001)
 out = 8'b0000_0010;
 elseif({in1, in2, in3} == 3'b010)
 out = 8'b0000_0100;
 elseif({in1, in2, in3} == 3'b011)
 out = 8'b0000_1000;
 elseif({in1, in2, in3} == 3'b100)
 out = 8'b0001_0000;
 elseif({in1, in2, in3} == 3'b101)
 out = 8'b0010_0000;
 elseif({in1, in2, in3} == 3'b110)
 out = 8'b0100_0000;
 elseif({in1, in2, in3} == 3'b111)
 out = 8'b1000_0000;
 else
 out = out;//输出变量赋值给自己

总结

核心思想:在抛出latch这个问题的情况下,去理解一些基础的理论概念,大致理解就行。知道在编写代码的时候,如何去避免latch。

  • 欢迎一起交流学习,如有错误之处,还请各位指正。

参考资料

[1] FPGA之组合逻辑与时序逻辑、同步逻辑与异步逻辑的概念文章来源地址https://www.toymoban.com/news/detail-758269.html

到了这里,关于避免latch verilog FPGA 基础练习2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    就是用代码来描述硬件结构 语言有VHDL与Verilog HDL Verilog HDL 是从C语言来的,学的快 ###例子 也叫保留字,一般是小写 module 表示模块的开始 endmodule 模块的结束 模块名 一般与.v文件的名字一致 输入信号 input 输出信号 output 既做输入也做输出 inout 需要一些变量和参数对输

    2024年02月21日
    浏览(43)
  • 【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日
    浏览(44)
  • 好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)

             组合逻辑环路 (Combinational Loops):指组合逻辑的输出信号 不经过任何时序逻辑电路 (FF等),而直接 反馈到输入节点 ,从而构成的电路环路。         此外,如果 直接将寄存器的输出端通过组合逻辑反馈到该寄存器的异步端口 (异步复位或异步置位),

    2024年02月08日
    浏览(36)
  • 什么是好的FPGA编码风格?(1)--尽量避免组合逻辑环路(Combinational Loops)

             组合逻辑环路 (Combinational Loops):指组合逻辑的输出信号 不经过任何时序逻辑电路 (FF等),而直接 反馈到输入节点 ,从而构成的电路环路。         此外,如果 直接将寄存器的输出端通过组合逻辑反馈到该寄存器的异步端口 (异步复位或异步置位),

    2024年02月05日
    浏览(41)
  • 【FPGA】Verilog:编码器 | 实现 4 到 2 编码器

    0x00 编码器(Encoder) 编码器与解码器相反。当多台设备向计算机提供输入时,编码器会为每一个输入生成一个与设备相对应的信号,因此有多少比特就有多少输出,以数字形式表示输入的数量。 例如,如果有四个输入,就需要一个两位二进制数来表示 0 至 3,这样就有四个输

    2024年02月04日
    浏览(54)
  • Verilog基础:避免混合使用阻塞和非阻塞赋值

    相关阅读 Verilog基础 https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482         “避免在一个always块中混杂阻塞赋值和非阻塞赋值”,这条原则是著名的Verilog专家Cliff Cummings在论文SUNG2000中提出的,这个观点在公众讨论时受到了广泛的质疑。有人认为可以在时钟

    2024年02月05日
    浏览(41)
  • Verilog编程:8线-3线优先编码器FPGA

    Verilog编程:8线-3线优先编码器FPGA 基于FPGA的数字电路设计是当前领域中的关键技术之一,因为这种设计具有高速、可编程、可重构等优点。在数字电路设计中,编码器是常见的模块,尤其是8线-3线优先编码器,可以实现将八个输入信号中最先出现的一个编码输出到三位二进制

    2024年02月08日
    浏览(41)
  • 【FPGA】Verilog 实践:优先级编码器 | Priority encoder

    0x00 优先级编码器(Priority encoder) \\\"能将多个二进制输入压缩成更少数目输出的电路或算法的编码器\\\" 优先级编码器是一种编码器,它考虑了两个或更多输入位同时变为 1 但没有收到输入的情况。当输入进来时,优先级编码器会按照优先级顺序进行处理。 通常,它按升序或降

    2024年01月18日
    浏览(58)
  • 【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证

    写在前面: 本章主要内容为了解和确认 NAND/NOR/XOR 门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用 FPGA 来验证 Verilog 实现的电路的行为。 本章目录: Ⅰ. 前置知识 0x00 与非门(NAND) 0x01 或非门(NOR) 0x02 异或门(XOR) Ⅱ. 练习(Assignmen

    2024年02月03日
    浏览(52)
  • Verilog编程基础练习

    目录 一、3-8译码器的实验与仿真 1.3-8译码器的logsim电路仿真实现 2.3-8译码器的逻辑真值表 3.3-8译码器的Verilog实现 (1)代码实现 (2)RTL的电路生成 (3)QUartus的波形图实现 (4)ModelSim的波形图实现 4.问题分析 二、全加器电路的实验与仿真 1.1-bit全加器电路的仿真实现 (1)

    2024年02月04日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包