Verilog-FPGA硬件电路设计之一——if语句优先级(always块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的)
出处: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块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的)的更多相关文章
- Verilog的非阻塞语句放到顺序块中,综合出来怎样的逻辑电路?
情境: FPGA里面计数器需要复位(计数值置零),与计数器状态有关的行为是状态机控制的,即状态机为CLEAR_TIMER状态时,计数器才完成清零动作. 清零有两个条件:(1)计数器值溢出(达到OVF门 ...
- 【Verilog HDL】赋值语句之阻塞赋值方式与非阻塞赋值方式
刚开始接触Verilog HDL语言时,这种硬件描述语言有一点与软件的程序设计语言直观上的最大区别大概就是这个赋值语句了(这里只是强调直观上的最大区别,事实上的最大区别并非如此). Verilog H ...
- 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: 阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...
- FPGA之阻塞赋值与非阻塞赋值
Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续 ...
- 干货分享,FPGA硬件系统的设计技巧
PGA的硬件设计不同于DSP和ARM系统,比较灵活和自由.只要设计好专用管脚的电路,通用I/O的连接可以自己定义.因此,FPGA的电路设计中会有一些特殊的技巧可以参考. 1. FPGA管脚兼容性设计 ...
- 基于STM32的平衡车机器人设计-硬件电路设计
今天分享一个STM32F103为主控的自平衡车机器人的硬件电路设计.(亲测完全可用,且没有任何问题) 电路原理图: 电源部分采用12V锂电池作为输入,分三路稳压,其中7805作为5V传感器的供电以及后 ...
- Verilog学习笔记基本语法篇(四)·········块语句
块语句是指将两条或者两条以上的语句组合在一起,使其在格式上更像一条语句.块语句分为两种: 1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块: 2)用fork_join语 ...
- CAN总线系列讲座第五讲——CAN总线硬件电路设计
CAN总线系列讲座第五讲--CAN总线硬件电路设计一 实战学习背景 CAN总线节点的硬件构成方案有两种,其中的方案:(1).MCU控制器+独立CAN控制器+CAN收发器.独立CAN控制器如SJA10 ...
- FPGA学习笔记(五)—— 组合逻辑电路功能的描述
设计方法: 分析真值表规律 两种描述方式: 方式1:用assign描述,用阻塞赋值= 方式2:用always@(*)描述,用非阻塞赋值<= 选择功能的三种描述方式: ...
随机推荐
- SimpleHttpServer的学习(1)
闲来没事,分析一下一个简单的HttpServer github地址: https://github.com/Filirom1/SimpleHTTPServer 实现的功能很简单就是一个FTP服务器 默 ...
- 【转】C数据存储(包括const存储在哪,C++不同部分我在文中用红字已指出)
非原创(文中红字为自己见解,如有不对,请大神指点) 程序由指令和数据组成,C语言程序亦是如此.开发者在编写程序的时候往往需要根据不同数据的特点以及程序需求来选择不同的数据存储方式,那么在C语言中数据的 ...
- 使用 EasyBCD 安装Ubuntu 14.04 Error 15: file not found错误的解决方法
今天安装Window7 和 Ubuntu 14.04 双系统时,出现如下异常,记录一下. 安装过程是参考 http://www.linuxidc.com/Linux/2014-04/100369.ht ...
- 【OpenGL】画立方体
编写一个程序,该程序运行时可以用鼠标的一个按键调整立方体的方向,用另一个按键平移立方体,用第三个按键缩放立方体. 这是题目,我的程序不一定完全按照这个来.初学OpenGL,对那一堆坐标系表示十分混乱, ...
- HW5.31
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- CentOS 6.5 安装配置VSFTP
1.下载安装VSFTP 首先查看当前系统是否已经安装VSFTP,若未安装则使用yum安装. chkconfig --list | grep vsftpd #查看是否安装 yum install vsf ...
- 局域网Internet的共享
局域网接入Internet,之后,在服务器安装共享代理软件,可以使客户机通过代理软件接入Internet. 局域网接入Internet 而目前几乎所有的浏览器.下载软件.信件收发软件都支持代理服务器. ...
- jQuery语法总结及注意事项
1.关于页面元素的引用通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom ...
- create tablespace 与 heap_insert 函数
先说 heap_insert 函数: /* * heap_insert - insert tuple into a heap * * The new tuple is stamped with cur ...
- xcode 4 制作静态库详解
合并.a文件,制作通用静态库 这二个库一个是用于真机运行的一个是用于模拟器运行的.其实我们可以利用lipo将这二个文件打包成一个通用的a文件.命令如下: 将/Users/user/Library/De ...