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 @(*) begin
    if(条件1)
        // 表达式1
end    

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

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

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

reg     [1:0]    out;

always @(*) begin
    if(a == 2'b11)
        out = 2'b00;
    else if(a == 2'b10)
        out = 2'b11;
    else
        out = 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 @(*) begin
    if(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;
    else
        dout = 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 @(*) begin
    if(din[0] == 1'b1)
        dout = din_a;
    else if(din[1] == 1'b1)
        dout = din_b;
    else
        dout = 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 @(*) begin
    case(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语句综合后的电路,结果表明,两种条件语句中的各个条件不存在优先级关系,综合后的电路是并行的。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NLP】文本分类

n-gram 的局限性 n-gram 只能对于填空这样的通顺性问题做出推测,但是没有办法完全解决句子的语义问题,从而无法实现文本的分类 文本的分类,就是将文本在语义的理解下划分到特定的主题下 手工规则 如一些垃圾过滤系统,需要人工制…

PHP开发中的不安全反序列化

序列化是开发语言中将某个对象转换为一串字节流的过程,转换后的字节流可以方便存储在数据库中,也可以方便在网络中进行传输。而反序列化则是将数据库取出的字节流或从网络上接收到的字节流反向转换为对象的过程。概念虽如此,但不同的开发语言…

【JavaEE 初阶(七)】网络原理 TCP与UDP协议

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多网络知识 目录 1.前言2.应用层2.1xml2.2json 3.传输层3.1UDP协议3.2TCP协议3.2.1确认响应3.2.2超时重…

【c++】map和set的封装

1.红黑树源码 我们使用上节课的红黑树源码来封装map和set. 因为map存的是(key,value),set存的是(key),为了我们set和map使用同一个类模板(红黑树),所以我们先要修改红黑树结点中存的数据类型&a…

苹果永久版安装PD虚拟机:Parallels Desktop 19 一键激活版

Parallels Desktop 19是一款功能强大的虚拟机软件,专为Mac用户设计,允许用户在同一台Mac电脑上同时运行Windows、Linux等多个操作系统,而无需额外的硬件设备。 下载地址:https://www.macz.com/mac/9581.html?idOTI2NjQ5Jl8mMjcuM…

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

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

展馆展厅设计施工流程

1、需求分析和确定: 与客户沟通,了解客户需求,对展馆展厅的用途、面积、功能、展品特点等进行分析,并确定设计方案。 2、方案设计 根据需求确定设计方案,包括平面布局、展品陈列、展示方式、照明等。设计师需要提供设计…

防静电劳保鞋:工业安全中的隐形守护者

在工业生产环境中,静电问题常常被忽视,然而它却是许多安全事故的潜在隐患。静电不仅可能损坏敏感的电子设备,更在易燃易爆环境中构成严重威胁。因此,防静电措施在工业安全中显得尤为重要。在众多防静电措施中,防静电劳…

618有哪些好物值得推荐?收下这份618必买好物清单

随着618购物节的脚步越来越近,你是不是已经开始摩拳擦掌,准备大肆采购一番了?在这个购物狂欢节里,要说哪些宝贝最值得你入手,那一定少不了数码家电类!今天就给大家整理了一些我往期自用过还不错的数码家电好…

各种姿势打穿企业内网

以前不是说要讲隧道吗??? 鸽了这么久终于想起来了!!! 1.本次实验环境拓扑 先来讲一下本次的实验环境吧,这样会更加清晰明了一点 首先我们是拿到了win7,然后最终目标上线内网的Wi…

回收站删除的照片怎么恢复?7个实用方法为你找回照片!

“我刚刚在对电脑上的照片进行清理,不小心错删了一张还需要的照片,但是在使用回收站时,将它删除了,有什么恢复回收站照片的简单方法吗?” 照片是我们生活点滴的见证,无论是外出旅游还是日常琐碎&#xff0c…

SpringBoot环境隔离Profiles

前言 通常我们开发不可能只有一个生产环境,还会有其它的开发,测试,预发布环境等等。为了更好的管理每个环境的配置项,springboot也提供了对应的环境隔离的方法。 直接上干货 知识点 激活环境方法 1,在application…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B,甚是喜爱,然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开,选择,根据自己板子型号定 操作系统用最新的就行,64位不太稳定 储存卡,需…

代码随想录算法训练营第二十九天|39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 文档讲解代码随想录 题目链接:. - 力扣(LeetCode) 这道题目的关键点: candidates :无重复元素的数组、candidates 中的数字可以无限制重复被选取。 与之前做过的组合问题的区别: 组合问题…

Leetcode2391. 收集垃圾的最少总时间

Every day a Leetcode 题目来源:2391. 收集垃圾的最少总时间 解法1:前缀和 收集垃圾的时间分为两部分: 垃圾车收拾垃圾的时间:垃圾车收拾一单位的任何一种垃圾都需要花费 1 分钟。三辆垃圾车行驶的时间:每辆垃圾车…

windows部署腾讯tmagic-editor03-DSL 解析渲染

创建项目 将上一教程中的editor-runtime和hello-editor复制过来 概念 实现 创建hello-ui目录 渲染节点 在hello-ui下创建 Component.vue 文件 由于节点的type是由业务自行定义的,所以需要使用动态组件渲染,在vue下可以使用component组件来实现 c…

软考笔记随记

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

绘唐2跟绘唐3有什么区别

绘唐2跟绘唐3有什么区别 这款产品的最大亮点在于其高度精准的语音克隆能力,利用先进的模型,能够捕捉到用户独特的音调、音高和调制方式,使用户能够以前所未有的方式复制和利用自己的声音。仅需10秒钟的录制时间,即可实现声音的克…

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言: 一:结构体 1.1:什么是结构体? 1.2:结构体类型的声明 1.3:结构体变量的定义 1.4:结构体的内存对齐 1.5:结构体传参 二:位段 2.1:位段是什…

docker镜像容器常用命令

常用基础命令1、docker info #查看docker版本等信息 2、docker search jenkins #搜索jenkins镜像 3、docker history nginx #查看镜像中各层内容及大小,每层对应的dockerfile中的一条指令。 4、docker network ls #显示当前主机上的所有网络 5、docker logs nginx …