出处:http://bbs.ednchina.com/BLOG_ARTICLE_3013262.HTM

综合软件:Quartus II

一、有优先级的if语句

if..else if.. else if … …else..语句中是有优先级的,第一个if具有最高优先级,最后一个else优先级最低。Quartus综合出的RTL图认为,最高优先级的电路靠近电路的输出,输入到输出的延时较短;最低优先级的电路远离输出端,输入到输出的延时较长。

module single_if_late(A, C, CTRL_is_late, Z);

input [6:1] A;

input [5:1] C;

input CTRL_is_late;

output Z;  reg Z;

always @(C or A or CTRL_is_late)

// late arriving signal in if condition

if (C[4] == 1'b1 && CTRL_is_late == 1'b0)      Z = A[4];

else if (C[1] == 1'b1)     Z = A[1];

else if (C[2] == 1'b0)     Z = A[2];

else if (C[3] == 1'b1)     Z = A[3];

else if (C[5] == 1'b0)     Z = A[5];

else                   Z = A[6];

endmodule

RTL图:

二、无优先级if语句

几个无优先级的if语句在组合逻辑电路中,采用阻塞赋值和非阻塞赋值效果一样。但是无优先级if语句设计组合逻辑电路,并非就是没有优先级,而是优先级按照阻塞赋值的先后顺序(因为硬件电路对同一个信号做不同的处理总会有先后顺序),一个always块中的最后一个if语句具有最高优先级。(所有if语句中必须操作同个一个reg信号)

always @(C or A or CTRL_is_late)

// late arriving signal in if condition

begin

Z = A[6];

if (C[4] == 1'b1 && CTRL_is_late == 1'b0)   Z = A[4];

if (C[1] == 1'b1)              Z = A[1];

if (C[2] == 1'b0)         Z = A[2];

if (C[3] == 1'b1)        Z = A[3];

if (C[5] == 1'b0)           Z = A[5];

end

注: always块中 赋值的信号,必须定义为 reg型,但是并不等同于硬件电路产生一个寄存器。纯组合逻辑电路中,的reg信号,等同于wire连线。

三、无优先级的if语句,如何让条件全部覆盖呢?

1、可以像上述程序,直接在所有的if语句之前加上一个最低优先级的值,也可以是复位值。

2、可以放在第一个if后面的else里面。

3、要注意被阻塞的情况。

下面就是个阻塞的例子:

always @(C or A or CTRL_is_late)

// late arriving signal in if condition

begin

//Z = A[6];        //可以放在此位置

if (C[4] == 1'b1 && CTRL_is_late == 1'b0)    Z = A[4];

//else    Z = A[6];   //可以放在此位置

if (C[1] == 1'b1)    Z = A[1];

if (C[2] == 1'b0)    Z = A[2];

if (C[3] == 1'b1)      Z = A[3];

else                Z = A[6];  //放在此处,上面的if被阻塞

if (C[5] == 1'b0)     Z = A[5];

end

生成的RTL图如下:

Z = A[6];可以放在第一个if的else中(因为之前无赋值语句,所以不会被阻塞),但不能放在其他的if后面。那么放在何处会产生阻塞的情况?

1、假如放在第4个if后面的else 里面,那么前面3个if就被阻塞了,因为第4个的else中已经包含了前三个if语句的条件,要时刻记住always块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的。 既然是按照顺序,那第4个if的else里面已经包含了前面的if条件,那么前面条件就没有意义,而综合软件在进行综合时,就将前面3个if语句优化掉,即不会生成对应的电路。同样道理,放在第一个if后面的else中是可以的。

2、不加else判断,直接放在某两个if语句之间,同样会阻塞此语句之前的所有if语句。

3、如果无此语句,那么条件覆盖不完全,产生锁存,如下图生成的RTL电路。

Verilog-FPGA硬件电路设计之一——if语句优先级(always块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的)的更多相关文章

  1. Verilog的非阻塞语句放到顺序块中,综合出来怎样的逻辑电路?

    情境: FPGA里面计数器需要复位(计数值置零),与计数器状态有关的行为是状态机控制的,即状态机为CLEAR_TIMER状态时,计数器才完成清零动作. 清零有两个条件:(1)计数器值溢出(达到OVF门 ...

  2. 【Verilog HDL】赋值语句之阻塞赋值方式与非阻塞赋值方式

    刚开始接触Verilog HDL语言时,这种硬件描述语言有一点与软件的程序设计语言直观上的最大区别大概就是这个赋值语句了(这里只是强调直观上的最大区别,事实上的最大区别并非如此). Verilog H ...

  3. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理:     阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...

  4. FPGA之阻塞赋值与非阻塞赋值

    Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续 ...

  5. 干货分享,FPGA硬件系统的设计技巧

    PGA的硬件设计不同于DSP和ARM系统,比较灵活和自由.只要设计好专用管脚的电路,通用I/O的连接可以自己定义.因此,FPGA的电路设计中会有一些特殊的技巧可以参考. 1. FPGA管脚兼容性设计 ...

  6. 基于STM32的平衡车机器人设计-硬件电路设计

    今天分享一个STM32F103为主控的自平衡车机器人的硬件电路设计.(亲测完全可用,且没有任何问题) 电路原理图: 电源部分采用12V锂电池作为输入,分三路稳压,其中7805作为5V传感器的供电以及后 ...

  7. Verilog学习笔记基本语法篇(四)·········块语句

    块语句是指将两条或者两条以上的语句组合在一起,使其在格式上更像一条语句.块语句分为两种: 1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块: 2)用fork_join语 ...

  8. CAN总线系列讲座第五讲——CAN总线硬件电路设计

    CAN总线系列讲座第五讲--CAN总线硬件电路设计一  实战学习背景 CAN总线节点的硬件构成方案有两种,其中的方案:(1).MCU控制器+独立CAN控制器+CAN收发器.独立CAN控制器如SJA10 ...

  9. FPGA学习笔记(五)—— 组合逻辑电路功能的描述

    设计方法:    分析真值表规律        两种描述方式: 方式1:用assign描述,用阻塞赋值= 方式2:用always@(*)描述,用非阻塞赋值<=      选择功能的三种描述方式: ...

随机推荐

  1. TCP 滑动窗口的简介

    TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可 ...

  2. 大规模Hadoop集群实践:腾讯分布式数据仓库(TDW)

    TDW 是腾讯最大的离线数据处理平台.本文主要从需求.挑战.方案和未来计划等方面,介绍了TDW在建设单个大规模集群中采取的 JobTracker 分散化和 NameNode 高可用两个优化方案. TD ...

  3. 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》

    3.暂停游戏 暂停游戏概述: 在游戏进行时,玩家有可能会遇到多种突发事件.在跑酷游戏中突发状况的发生对游戏的影响更甚,游戏进行时玩家死亡,游戏只能从头开始,那么如果因为外界因素而影响游戏的进行,显然是 ...

  4. JAVA——装箱和拆箱

    Java 将某些基本数据类型自动转换为包装类型的过程称为装箱,相反自动将包装类型转换为基本数据类型的过程称为拆箱. Integer integer_1=1; //装箱 int i=integer_1; ...

  5. localtime()方法的疑惑

    在做一个时间管理的APP中遇到一些问题 windows linux mac下time.h中都有关于localtime()的定义. 它不是一个保险可靠的方法,使用的时候需要小心. 参考 http://b ...

  6. berserkJS(大名:狂暴JS / 昵称:疯子JS)

    极分享:高质分享+专业互助=没有难做的软件+没有不得已的加班 http://www.finalshares.com/read-6763?f=g-20

  7. nyoj 289 苹果

    苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. ...

  8. windows 一个进程可以允许最大的线程数

    默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也 ...

  9. CSS构造模型

    div 边距 边框 定位 浮动 21.1 div 部分(division)---<div>元素,经常以div形式引用---是XHTML元素,用于定义XHTML文件中的区域. 1.添加div ...

  10. CSS文本与文字

    -255之间 14.2 CSS中的文字属性 属性名称                    属性值                       说明 font-style          norma ...