Verilog基础语法——条件语句if-else与case

Verilog基础语法——条件语句case、if-else

  • 写在前面
  • 一、if-else语句
  • 二、case语句
    • 2.1 case语句
    • 2.2 casez语句
    • 2.3 casex语句
  • 写在后面

写在前面

  在Verilog语法中,常用的条件语句有if-else语句case语句,用于判断条件是否为真,并执行判断条件后面的表达式。

一、if-else语句

  if-else语句的基本语法如下:

if(条件1)// 表达式1...
else if(条件2)// 表达式2...
else // 其他条件// 表达式3...

  if-else语句也可以嵌套使用,其语法如下:

if(条件1)if(条件2)// 表达式1...else// 表达式2...
else // 其他条件// 表达式3...

  在使用if-else语句时,若不补全else语句以及后面的表达式,则默认在除了所列出条件以外的其他条件下,保持变量原先的值。而对于组合逻辑而言,变量保持原先的值,电路综合时会综合出锁存器Latch。比如:

// 会产生锁存器Latch(组合逻辑中)
always @(*) beginif(条件1)// 表达式1
end    

  而在时序逻辑中,变量保持原先的值,不会产生锁存器Latch,所以对于else语句下变量保持原先的值的情况,可以不补全else语句(建议补全else条件后执行的表达式)。

// 不会产生锁存器Latch(时序逻辑中)
always @(posedge clk) beginif(条件1)// 表达式1
end    

  如果在组合逻辑中使用if-else语句,有一种等价写法,用连续赋值语句assign进行替换。比如:

reg     [1:0]    out;always @(*) beginif(a == 2'b11)out = 2'b00;else if(a == 2'b10)out = 2'b11;elseout = 2'b01;
end 

  可以使用三目运算符“ ?: ”进行替换,如下。需要注意的是连续赋值语句assign赋值的变量是wire型变量,而在always语句中赋值的变量是reg型变量。

wire    [1:0]    out;assign out = (a == 2'b11) ? 2'b00 : (a == 2'b10) ? 2'b11 : 2'b01;

问题一:if-else语句中各个条件是否具有优先级?各个条件的判断是串行的还是并行的?条件互斥是否存在影响?

  以下面这段代码为例,if-else语句中各个条件互斥。

// if-else(条件互斥)
module top(input    wire    [1:0]    din  ,input    wire    [3:0]    din_a,input    wire    [3:0]    din_b,input    wire    [3:0]    din_c,input    wire    [3:0]    din_d,output   reg     [3:0]    dout 
);always @(*) beginif(din == 2'b00)dout = din_a;else if(din == 2'b01)dout = din_b;else if(din == 2'b10)dout = din_c;else if(din == 2'b11)dout = din_d;elsedout = 4'b0000;
end   endmodule

  上述代码对应的真值表如下所示:

在这里插入图片描述

  其RTL Schematic如下图所示,可以看出这里5个条件所对应的4个MUX是串行的,存在优先级关系,其中优先级顺序为:第一级>第二级>第三级>第四级。

在这里插入图片描述

  而在FPGA内部,MUX是由LUT构成的,综合后的电路是否存在优先级关系?下图为综合后的Schematic,可以看到综合后的实际电路是并行的。

在这里插入图片描述
  这里if-else语句条件是互斥的,互斥是否会存在影响?对上述代码稍加修改(各个条件不互斥),如下:

// if-else(条件不互斥)
module top(input    wire    [1:0]    din  ,input    wire    [3:0]    din_a,input    wire    [3:0]    din_b,input    wire    [3:0]    din_c,output   reg     [3:0]    dout 
);always @(*) beginif(din[0] == 1'b1)dout = din_a;else if(din[1] == 1'b1)dout = din_b;elsedout = din_c;
end   endmodule

  上述代码对应的真值表如下所示:

在这里插入图片描述

  其RTL Schematic如下图所示,可以看出这里3个条件所对应的2个MUX同样是串行的,存在优先级关系,其中优先级顺序为:第一级>第二级。

在这里插入图片描述

  再对上述代码进行综合,综合后的电路如下。可以看出综合后的电路是并行的,不存在优先级关系。

在这里插入图片描述

  综上所述,在FPGA设计中,if-else语句综合后的电路无优先级关系,是并行执行的,与判断条件是否互斥无关。

二、case语句

  if-else语句常用于判断条件较少的情况。对于判断条件较多的情况下,使用if-else语句会显得繁琐,使用case语句会更加简洁直观。本节介绍case语句、casez语句和casex语句三者的用法。

2.1 case语句

  case语句的基本语法如下:

case(判断条件)条件值1: 表达式1;条件值2: 表达式2;条件值3: 表达式3;default: 表达式4; // 其他条件
endcase

  case语句中只有当判断条件与条件值完全相等时,才为真值(True),执行条件值对应的表达式。case语句的真值表如下所示:

case10xz
11000
00100
x0010
z0001

  case语句中有两点需要注意:(1)case语句没有补全default,则对于未声明的情况,变量保持原先的值。在组合逻辑中,若未声明所有情况,则对于未声明的情况,变量保持原先的值,综合时会产生锁存器Latch。而在时序逻辑中,对于未声明的情况,变量保持原先的值,综合出来的是寄存器;(2)case语句中各个状态之间需要互斥,若各个状态不互斥,则比较电路的输出结果可能是不定态x。

问题: case语句是否具有优先级?是串行还是并行?

  同样的,将前面if-else示例中的if-else语句替换为case语句,如下:

// case(条件互斥)
module top(input    wire    [1:0]    din  ,input    wire    [3:0]    din_a,input    wire    [3:0]    din_b,input    wire    [3:0]    din_c,input    wire    [3:0]    din_d,output   reg     [3:0]    dout 
);always @(*) begincase(din)2'b00: dout = din_a;2'b01: dout = din_b;2'b10: dout = din_c;2'b11: dout = din_d;default : dout = 4'b0000;endcase
end   endmodule

  其RTL Schematic如下图所示,可以看到case对应的各个条件之间无优先级关系,是并行的。

在这里插入图片描述
  综合后的电路如下图所示,是并行的。
在这里插入图片描述

  综上所述,case语句的各个条件之间无优先级关系,是并行的。

2.2 casez语句

  casez语句的基本语法如下:

casez(判断条件)条件1: 表达式1;条件2: 表达式2;条件3: 表达式3;default: 表达式4; // 其他条件
endcase

  casez语句的语法与case语句一致,但是其真值表不一致,如下表所示。

casez10xz
11001
00101
x0011
z1111

  在casez语句中,将高阻态z视为不关心的状态,即在进行比较时,高阻态z与任意状态的比较结果(==)均为真值1(True)。

2.3 casex语句

  casex语句的基本语法如下:

casex(判断条件)条件1: 表达式1;条件2: 表达式2;条件3: 表达式3;default: 表达式4; // 其他条件
endcase

  casex语句的真值表,如下表所示。在casex语句中将高阻态z和不定态x都视为不关心的状态,即在进行比较时,高阻态z、不定态x与任意状态的比较结果(==)均为真值1(True)。

casex10xz
11011
00111
x1111
z1111

写在后面

  在本文中,我们学习了if-else语句和case语句(case/casez/casex)的基本用法以及两者之间的区别。通过实验对比if-else语句与case语句综合后的电路,结果表明,两种条件语句中的各个条件不存在优先级关系,综合后的电路是并行的。


🧐:以上为个人学习笔记,如有疑问,欢迎评论区交流探讨 !!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 N 个泰波那契数

题目链接 第 N 个泰波那契数 题目描述 注意点 0 < n < 37答案保证是一个 32 位整数 解答思路 动态规划根据前三个数字推出新的泰波那契数 代码 class Solution {public int tribonacci(int n) {if (n 0) {return 0;}if (n 1 || n 2) {return 1;}int x 0;int x…

JSON格式化输出html——数组+对象+JSON字符串+汉字——基础积累——@pgrabovets/json-view

昨天写了一篇关于JSON格式化输出到页面上——数组对象JSON字符串汉字——基础积累的文章&#xff0c;效果是可以实现的 但是如果要实现右侧部分的展开/折叠&#xff0c;则可以使用到下面的插件了pgrabovets/json-view github链接&#xff1a;https://github.com/pgrabovets/j…

软考笔记随记

原码:(0正1负) 原码是最直观的编码方式,符号位用0表示正数,用1表示负数,其余位表示数值的大小。 例如,+7的原码为00000111,-7的原码为10000111。 原码虽然直观,但直接用于加减运算会导致计算复杂,且0有两种表示(+0和-0),不唯一。 反码: 反码是在原码的基础上得…

如何在VS Code中安装插件并进行中文化。

相关文章推荐: 如何下载和安装Visual Studio Code&#xff08;VSCode&#xff09; 在使用Visual Studio Code&#xff08;简称VS Code&#xff09;进行开发时&#xff0c;安装插件可以极大地提升开发效率和使用体验。而将VS Code插件界面进行中文化&#xff0c;则能更好地满足中…

十四、Redis Cluster集群

Redis Cluster是Redis提供的一个分布式解决方案&#xff0c;在3.0推出。Redis Cluster可以自动将数据分片分布到不同的master节点上&#xff0c;同时提供了高可用的支持&#xff0c;当某个master节点挂了之后&#xff0c;整个集群还是可以正常工作。1、为什么要用Redis Cluster…

rocketmq的流程

生产过程 消费过程 存储 在RocketMQ中&#xff0c;一个Broker的所有Topic的消息都会被写入到同一个CommitLog文件中。 每个队列&#xff08;Queue&#xff09;都有对应的ConsumeQueue文件。 ConsumeQueue每个记录定长&#xff0c;20字节&#xff0c;消息在commitlog中的偏移量…

外贸客户采集软件有哪些?

外贸客户采集软件可以帮助企业收集潜在客户的信息&#xff0c;以便进行市场分析和客户开发。以下是一些常用的外贸客户采集软件&#xff1a; 易谷歌地图数据采集大师&#xff1a;基于谷歌地图数据采集的软件&#xff0c;能够采集任意国家、地区的企业地址、电话号码、邮件地址等…

SpringCloud 2023.0.1

本文介绍如何使用 springboot3及cloud2023 进行微服务模块化开发 采用父-module 模块开发 父工程 demo-java pom.xml <!--配置 springboot的依赖的版本号, 方便 module 进行继承--><dependencyManagement><dependencies><!--增加 springboot的依赖--&g…

浅谈-数据分析之道--数据思维的培养

第一篇数据思维 数据分析中最重要的是数据思维&#xff0c;对于业务场景中常见的问题&#xff0c;只要有分析问题的思路和方法&#xff0c;无论用什么工具都可以得到结果。 数据思维是数据分析师分析问题的思路和角度。 第一章&#xff0c;什么是数据思维 什么是数据治理&a…

适合建站的香港服务器有哪些,企业和个人建站的

香港服务器适合外贸建站、个人和企业建站&#xff0c;尤其是中小企业官网非常适合放在香港服务器上&#xff0c;因为香港服务器在国内外的访问速度都很快&#xff0c;也就意味着全球客户都能访问到你的网站。 对于很多新手小白来说不知道怎么才能买到靠谱稳定的香港服务器&…

mysql主从热备+keepalived 部署mysql高可用主备模式

目录 1、环境准备 2、分别在主服务器和备用服务器上安装keepalived 3、修改keepalived服务的配置文件 3.1 修改主服务器上的keepalive服务的配置文件 3.2 修改备用服务器上的keepalive服务配置文件 4、编写mysql监控脚本放到主服务器上 5、在主服务器和备用服务器上查看…

水泡传感器内部结构

水泡传感器内部结构&#xff1a; 水泡传感器放大电路 电路是基于1.6V做的TIA I2V&#xff0c; 也就是输出部分基于1.6V做电压的增加或减少。

Milvus 快速入门

引言 在本篇文章中&#xff0c;我们将介绍 Milvus 的基本概念&#xff0c;并通过一个简单的示例展示如何在 Milvus 中创建集合、插入向量和执行搜索。最后&#xff0c;我们将概览 Milvus 提供的 API。 一、基本概念 1.1 集合 (Collection) 在 Milvus 中&#xff0c;集合类似…

如何组织 Vue 项目

介绍 在启动 Vue 项目时&#xff0c;思考项目结构至关重要。主要考虑因素是预期项目的规模。在本篇博文中&#xff0c;我将探讨适用于不同规模 Vue 项目的各种结构。这个考虑与康威定律相吻合&#xff1a; “设计系统的组织受限于产生这些组织沟通结构的设计。” - 梅尔康威 基…

C语言之指针初阶

目录 前言 一、内存与地址的关系 二、指针变量 三、野指针 四、const 五、传值调用与传址调用 总结 前言 本文主要介绍C语言指针的一些基础知识&#xff0c;为后面深入理解指针打下基础&#xff0c;因此本文内容主要包括内存与地址的关系&#xff0c;指针的基本语法&…

WebRTC实时音视频通话之语音通话设计与实践

一、背景 在移动互联网流量时代&#xff0c;很多业务场景都有音视频通信的需求&#xff0c;比如IM场景&#xff0c;除了文字交流还需要音视频通话进行实时交互。为了帮助58、赶集、安居客等业务线更好的为用户提供服务&#xff0c;节约沟通成本&#xff0c;提升效率&#xff0…

【Linux】19. 习题②

2022-11-12_Linux环境变量 1. 分页存储(了解) 一个分页存储管理系统中&#xff0c;地址长度为 32 位&#xff0c;其中页号占 8 位&#xff0c;则页表长度是__。 A.2的8次方 B.2的16次方 C.2的24次方 D.2的32次方 【答案解析】A 页号即页表项的序号&#xff0c;总共占8个二进制…

STM32的FLASH学习笔记

不同型号的 STM32&#xff0c;其 FLASH 容量也有所不同&#xff0c;最小的只有 16K 字节&#xff0c;最大的则达到了1024K 字节。大容量产品的闪存模块组织如图所示&#xff1a; STM32 的闪存模块由&#xff1a;主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。 ​ ①主…

Java环境搭建(二)Notepad++和IDEA的下载

Notepad&#xff08;不推荐使用&#xff09; 高级记事本 下载地址 Notepad (juxinwk1.cn) 下载安装后一直下一步就可以了 注&#xff1a;改一下路径还有建立快捷方式&#xff08;自己选择&#xff09; IDEA 集成环境 下载地址 IntelliJ IDEA – the Leading Java and Kotl…

React 第三十二章 虚拟DOM

面试题&#xff1a;什么是虚拟DOM&#xff1f;其优点有哪些&#xff1f; 标准且浅显的答案 虚拟dom本质上就是一个普通的 JS 对象&#xff0c;用于描述视图的界面结构 虚拟 DOM 最早是由 React 团队提出来的&#xff0c;因此 React 团队在对虚拟 DOM 的定义上面有绝对的话语权。…