0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog HDL描述的组合逻辑环在FPGA实现时到底有什么问题?

FPGA之家 ? 来源:FPGA之家 ? 作者:FPGA之家 ? 2022-12-12 10:01 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

课堂上给大家介绍代码规范的时候,反复强调不能出现组合逻辑环,具体就是组合逻辑所有的else语句要写全,case语句也要写全,但组合逻辑环到底有什么危害?下面就详细举例说明。

01

什么是组合逻辑环?

组合逻辑反馈环路是数字同步逻辑设计的大忌,它最容易因振荡、毛刺、时序违规等问题引起整个系统的不稳定和不可靠。组合逻辑反馈环路是二种高风险的设计方式,主要原因如下:

1.组合反馈环的逻辑功能完全依赖于其反馈环路上组合逻辑的门延时和布线延时等,如果这些传播延时有任何改变,则该组合反馈环单元的整体逻辑功能将彻底改变,而且改变后的逻辑功能很难确定。

2.组合反馈环的时序分析是无穷循环的时序计算,综合、实现等EDA 工具迫不得已一般必须主动割断其时序路径,以完成相关的时序计算。而不同的EDA工具对组合反馈环的处理方法各不相同,所以组合反馈环的最终实现结果有很多不确定因素。

3.通常的综合工具在处理组合逻辑反馈问题时,将产生Latch,这将对时序造成许多问题。

在用Verilog HDL进行可综合电路设计时,有很多情况都有可能产生组合逻辑环。

?在组合逻辑的组合进程中, 条件语句描述时应该指定所有条件下所有输出的状态,以避免锁存。比如if/case语句的所有分支必须定义全部的输出才可能避免出现锁存。

?在设计中,应该尽量避免使用锁存!因为锁存要占去大量的触发器资源,而且会对电路带来某种不稳定的隐患。

?所谓的latch,其实质是组合电路中有反馈!反馈的形成是利用到了前一个状态。

具体举例如下:

213094e0-79b7-11ed-8abf-dac502259ad0.jpg

2142d362-79b7-11ed-8abf-dac502259ad0.jpg

总结如下:

?组合电路描述中,条件判断语句必须指明所有条件分支情况下,被赋值信号的值。

?分支不完整,意味着电路需要在某种电平状态下,让被赋值的信号“保持原值”,这只能使用锁存电路实现。

02

一个实例

设计代码如下:

// **************************************************************

// COPYRIGHT(c)2015, Xidian University

// All rights reserved.

//

// IP LIB INDEX :

// IP Name :

// File name :

// Module name :

// Full name :

//

// Author : Liu-Huan

// Email : assasin9997@163.com

// Data :

// Version : V 1.0

//

// Abstract :

// Called by :

//

// Modification history

// -----------------------------------------------------------------

//

//

//

// *****************************************************************

// *******************

// TIMESCALE

// *******************

`timescale 1ns/1ps

// *******************

// INFORMATION

// *******************

//*******************

//DEFINE(s)

//*******************

//`define UDLY 1 //Unit delay, for non-blocking assignments in sequential logic

//*******************

//DEFINE MODULE PORT

//*******************

module TOP (

input clk ,

input rst

) ;

//*******************

//DEFINE LOCAL PARAMETER

//*******************

//parameter(s)

parameter IDLE = 5'b0_0001 ;

parameter S1 = 5'b0_0010 ;

parameter S2 = 5'b0_0100 ;

parameter S3 = 5'b0_1000 ;

parameter S4 = 5'b1_0000 ;

//*********************

//INNER SIGNAL DECLARATION

//*********************

//REGS

(* mark_debug = "true" *)reg [4:0] c_state ;

(* mark_debug = "true" *)reg [4:0] n_state ;

reg [3:0] cnt ;

(* mark_debug = "true" *) reg [3:0] led ;

//WIRES

//*********************

//INSTANTCE MODULE

//*********************

//*********************

//MAIN CORE

//*********************

always @(posedge clk or posedge rst) begin

if (rst == 1'b1) begin

cnt <= 4'b0 ;

end

else begin

cnt <= cnt+1'b1 ;?

end

end

// 三段式状态机 验证 第二段 if无else的异常跳转

// 第一段 状态转移

always @(posedge clk or posedge rst) begin

if (rst == 1'b1) begin

c_state <= IDLE ;?

end

else begin

c_state <= n_state ;

end

end

// 第二段 计算下一状态

always @ (*) begin

case ( c_state )

IDLE : begin

if ( cnt == 'b0 )

n_state = S1 ;

end

S1 : begin

if ( cnt == 'd2 )

n_state = S2 ;

end

S2 : begin

if ( cnt == 'd4 )

n_state = S3 ;

end

S3 : begin

if ( cnt == 'd8 )

n_state = S4 ;

end

S4 : begin

if ( cnt == 'd15 )

n_state = IDLE ;

end

default : begin

n_state = IDLE ;

end

endcase

end

// 第三段 输出

always @(posedge clk or posedge rst) begin

if (rst == 1'b1) begin

led <= 4'b0 ;

end

else begin

case ( n_state )

IDLE : led <= 4'b0 ;

S1 : led <= 4'd1 ;

S2 : led <= 4'd2 ;

S3 : led <= 4'd3 ;

S4 : led <= 4'd4 ;

default : begin

led <= 4'd0 ; ?

end

endcase

end

end

endmodule


仿真激励代码如下:

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

//

// Create Date: 2017/12/11 2030

// Design Name:

// Module Name: test

// Project Name:

// Target Devices:

// Tool Versions:

// Description:

//

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//

//////////////////////////////////////////////////////////////////////////////////

module test ;

reg clk ;

reg rst ;

initial begin

clk = 1'b0 ;

rst = 1'b1 ;

# 100

rst = 1'b0 ;

end

always # 5 clk = ~clk ;

TOP U_TOP (

.clk ( clk ) ,

.rst ( rst )

) ;

endmodule


上面组合逻辑环的代码已经用红色字体显示。

先看前仿真结果:

2157f9ea-79b7-11ed-8abf-dac502259ad0.jpg

看不太清?让我们再看一张图。

2163d15c-79b7-11ed-8abf-dac502259ad0.png

状态跳变正常,n_state[4:0]按照1、2、4、8、16、1......的顺序重复跳变,没有任何问题。

但在用FPGA工具(如vivado)进行综合时,会报警告:

216f4186-79b7-11ed-8abf-dac502259ad0.jpg

但是上板抓取信号,发现状态机异常跳转,如下图所示。

21809cc4-79b7-11ed-8abf-dac502259ad0.png

此时的n_state[4:0]信号跳变状态为:1、2、4、8、9、1......,出现了9这样的一个状态!

此时,水落石出!出现组合逻辑环会给电路带来严重问题!

而上面的例子是显而易见的,一眼就能看出来,还有一些组合逻辑环,是在写代码时不小心引入的,并且是由多个always模块组成的,这种组合逻辑环在综合的时候也会报warning,必须要修改掉之后才能继续后续工作。否则,等真正上板调试时,规模稍微大点的设计如果要定位到这个错误估计也得花掉好几天的时间,所以代码规范至关重要!

03

组合逻辑环的好处

在实际芯片设计中,也是不允许出现组合逻辑环的。但组合逻辑环能够减少电路逻辑资源,降低电路功耗,具有很多优点。但是其难以被静态时序分析工具分析和计算,且难以生成功能验证向量和自动测试图形向量.针对此问题,很多人都提出了多种组合逻辑环转化方法,以解决硬件描述语言以及高级语言逻辑综合阶段所面临的组合逻辑环拆分问题。


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1646

    文章

    22070

    浏览量

    619742
  • Verilog
    +关注

    关注

    29

    文章

    1367

    浏览量

    112417
  • eda
    eda
    +关注

    关注

    71

    文章

    2942

    浏览量

    178580

原文标题:Verilog HDL描述的组合逻辑环在FPGA实现时到底有什么问题?

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FPGA Verilog HDL语法之编译预处理

    Verilog HDL语言和C语言一样也提供了编译预处理的功能。“编译预处理”是Verilog HDL编译系统的一个组成部分。Verilog
    的头像 发表于 03-27 13:30 ?665次阅读
    <b class='flag-5'>FPGA</b> <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>语法之编译预处理

    一文详解Verilog HDL

    Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。现实生活中多用于专用集成电路
    的头像 发表于 03-17 15:17 ?2606次阅读
    一文详解<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>

    TLC2578芯片中FS与SDI到底有什么作用?

    ,还有就是一点不太懂的就是:TLC2578芯片中FS与SDI到底有什么作用。手册看了半天还是不懂!求解!谢谢!
    发表于 01-22 06:51

    差分输入和和单端输入本质上到底有什么区别?

    和和单端输入本质 上到底有什么区别? 因为,ADC采集的信号说到底是AINP - AINN,不管单端还是差分,采集的信号都是这两个pad的差值。 2:将单端信号接在ADC的差分输入接口上可以用
    发表于 12-23 07:31

    Verilog 与 ASIC 设计的关系 Verilog 代码优化技巧

    Verilog与ASIC设计的关系 Verilog作为一种硬件描述语言(HDL),ASIC设计中扮演着至关重要的角色。ASIC(Appli
    的头像 发表于 12-17 09:52 ?1102次阅读

    Verilog与VHDL的比较 Verilog HDL编程技巧

    :由于其类似于 C 语言的语法,Verilog 代码通常更易于阅读和维护,尤其是处理复杂逻辑时。 VHDL :VHDL 的正式性和丰富
    的头像 发表于 12-17 09:44 ?1821次阅读

    Verilog vhdl fpga

    相关专业,具有良好的专业基础知识。 感兴趣可滴滴 JYHXDX534 2.工作年限不限,工作经验或优秀应届毕业生亦可。 3.对FPGA芯片架构和资源深入的理解,精通Verilog
    发表于 11-12 16:40

    Verilog硬件描述语言参考手册

    一. 关于 IEEE 1364 标准二. Verilog简介三. 语法总结四. 编写Verilog HDL源代码的标准五. 设计流程
    发表于 11-04 10:12 ?4次下载

    RTOS与Linux到底有什么区别

    很多做嵌入式开发的小伙伴都存在这样的疑惑:RTOS与Linux到底有什么区别?
    的头像 发表于 10-29 09:53 ?1399次阅读

    FPGA编程语言的入门教程

    FPGA(现场可编程逻辑门阵列)的编程涉及特定的硬件描述语言(HDL),其中Verilog和VHDL是最常用的两种。以下是一个
    的头像 发表于 10-25 09:21 ?1326次阅读

    Verilog HDL的基础知识

    本文继续介绍Verilog HDL基础知识,重点介绍赋值语句、阻塞与非阻塞、循环语句、同步与异步、函数与任务语法知识。
    的头像 发表于 10-24 15:00 ?1256次阅读
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>的基础知识

    FPGA Verilog HDL代码如何debug?

    今天给大侠带来FPAG技术交流群里平时讨论的问题答疑合集(十一),以后还会多推出本系列,话不多说,上货。 FPGA技术交流群目前已有十多个群,QQ和微信均覆盖,需要的大侠可以进群,一起交流学习
    发表于 09-24 19:16

    FPGA算法工程师、逻辑工程师、原型验证工程师什么区别?

    电路的设计和实现。他们使用硬件描述语言(如 Verilog 或 VHDL)来编写代码,构建复杂的数字逻辑系统。工作包括模块的设计、功能的实现
    发表于 09-23 18:26

    FPGA芯片架构和资源深入的理解,精通Verilog HDL、VHDL

    、计算机相关专业,具有良好的专业基础知识。 2.工作年限不限,工作经验或优秀应届毕业生亦可。 3.对FPGA芯片架构和资源深入的理解,精通Verilog
    发表于 09-15 15:23

    FPGA Verilog HDL什么奇技巧?

    相加去乘? A:硬件乘法器具有重要意义,主要体现在以下几个方面: 速度优势:在数字电路中,直接使用移位相加的方法实现乘法速度上通常比通过软件或简单的逻辑运算(如在 Verilog
    发表于 09-12 19:10