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

news2025/1/19 11:29:02

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语句综合后的电路,结果表明,两种条件语句中的各个条件不存在优先级关系,综合后的电路是并行的。


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

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

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

相关文章

使用docker安装doccano

使用docker安装doccano 1 介绍 数据标注的工具比较多,比较出名的有Doccano、Label Studio等。 Label Studio :图像标注、文本标注、音频标注、视频标注、时间序列标注,功能比较多。 Doccano:主要是针对文本的标注,…

平芯微PW4057H中文规格书

产品概述(百度翻译) PW4057H 是可以通过外部电阻编程的恒流/恒压充电的充电管理电路。该器件内部包括功率晶体管应用时不需要外部的电流检测电阻和阻流二极管。 PW4057H 只需要极少的外围元器件,并且符合 USB 总线技术规范,非常适…

英睿达硬盘数据恢复方法:从丢失到找回的详细指南

在数字化时代,硬盘作为我们存储重要数据的关键设备,承载着大量的个人、工作甚至商业信息。然而,无论是由于意外删除、格式化、病毒感染还是硬件故障,硬盘数据丢失的情况时有发生。英睿达硬盘作为市场上的知名品牌,其数…

后仿真中的必懂VCS仿真选项之 +ignorempcond

当多个输入同时改变时,VCS支持延迟注释。它忽略条件检查,并从适用的延迟中插入最小的延迟。 当多个输入同时改变时,它们会对特定的输出信号产生影响。 如果没有匹配的条件弧线从输入(切换)延伸到输出,那么VCS不会标注零延迟。 …

ITSM的服务台如何让工作更流畅

在现代企业的信息技术管理框架内,IT服务管理(IT Service Management, ITSM)体系扮演着至关重要的角色,而其中的服务台则是这一复杂体系的心脏地带。服务台不仅仅是解答技术疑问的一线窗口,更是企业IT运维效率与用户满意…

STM32_IIC通信

IIC通信 • I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线 • 两根通信线:SCL(串行时钟线)、SDA(串行数据线) • 同步,半双工 • 带数据应答 • 支持总线挂载多…

C++ 程序员常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

VirtualBox虚拟机串口通信

主机:Win11 VirtualBox: 7.0 两台Guest虚拟机: CentOS 现在希望两台CenOS虚拟机能通过串口通信。 设置前先关闭两台虚拟机。 设置方式就是在VirtualBox的设置里面设置串口,需要注意的是其中一台不勾选“连接至现有通道或套接字”,另外一…

分享我经常用的一个图片下载插件,不会写爬虫代码也能随意下载图片

更多精彩内容在公众号。 ImageAssistant(图片助手)是一款专为Chrome浏览器设计的扩展程序,它具备强大的网页图片处理功能。以下是关于ImageAssistant的一些主要特点和功能: 批量下载图片:ImageAssistant的核心功能之一…

什么是蜜罐,在当前网络安全形势下,蜜罐能提供哪些帮助

在当前的互联网时代,网络安全威胁日益严峻,攻击手段层出不穷。为了应对这些威胁,网络安全专家们不断探索新的防御手段,在过去的几年里,一种更加积极主动的网络安全方法正在兴起。蜜罐技术便是这样一种备受瞩目的主动防…

GPT大模型不再遥不可及:本地化部署让每个人都能拥有

本地化部署是GPT发展的一个趋势。 本地化部署指的是将大模型部署在用户自己的设备上,而不是依赖于云服务商提供的接口。本地化部署有以下几个优势: 数据完全私有化,降低数据丢失和泄露风险,对数据安全性和私密性有保障。 降低使…

uniapp微信小程序使用vscode代替HBuilderX开发uniapp微信小程序并且vscode改动代码微信开发者工具能实时更新

前言 最近公司开发新的小程序项目,经调研综合所有人员考虑,用uni-app Vue3tsvite技术栈开发;而官方推荐使用HBuilderX开发,而考虑到目前公司所有前端人员对VsCode更熟悉,故此总结了一下uniapp项目使用vscode代替HBuild…

【Python探索之旅】字典

字典的基本特性 创建字典 修改字典 添加键值对 删除键值对 字典方法 遍历字典 完结撒花​ 前言 字典是 Python 中内建的一种具有弹性储存能力的数据结构,可存储任意类型对象,与序列使用整数索引不同,它使用键(key)进行索引。 通常任何不…

Lazyboy品牌发布会“球幕气膜”

Lazyboy品牌发布会“球幕气膜”为品牌活动提供了一个独特、现代化、环保的展示空间。这座球幕气膜不仅为发布会提供了一个视觉震撼的场地,也为与会嘉宾带来了全新的体验。作为轻空间(江苏)膜科技有限公司(以下简称“轻空间”&…

微信自主创建表单投票小程序源码系统 带充值刷礼物功能 附带源代码以及完整的安装部署教程

系统概述 本小程序实现的核心功能包括:用户注册登录、表单提交投票、查看投票结果、在线充值以及赠送礼物等。其中,投票表单可以根据实际需求进行自定义设置,满足不同类型的调查或评选活动。同时,通过引入第三方支付接口&#xf…

PyQt5实现PDF预览

PyQt不支持PDF预览的,为了解决这个问题,本文思路是:想将PDF生成长图片,让后PyQt加载长图片达到预览效果。 步骤 1: PDF生成长图片程序 import fitz # PyMuPDF from PIL import Imagedef pdf_to_long_image(pdf_path, output_pa…

pytorch-8 单层神经网络及激活函数

一、单层回归网络:线性回归 1. tensor手动实现单层回归神经网络的正向传播 # tensor手动实现单层回归神经网络的正向传播 import torch from torch.nn import functional as FX = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32) # 特征张量 w =…

复制即用!纯htmlcss写的炫酷input输入框

一般我们写css样式都要用样式库,但是嫌麻烦,如果能找到现成的内容复制上去就很香了,下文是笔者觉得好看的纯html&css写的样式,可以直接复制到Vue等内,十分方便。 input组件 1) 下面这个很推荐&#…

HNCTF_RE复现(一)

baby_python hnctf.yuanshen.life:33276 网页打不开,只能 nc 连接远程服务器。 运行没有回显 利用pickletools库进行反编译为字节码(不知道为什么) # Python 3.10.12 from pickle import loads import pickletools main b"\x80\x04ct…

记某src通过越权拿下高危漏洞

在挖掘某SRC时,遇到了一个社区网站,社区站点是我在挖掘SRC时比较愿意遇到的,因为它们可探索的内容是较多的,幸运地,通过两个接口构造参数可进行越权,从而获得整个网站用户的信息。 图片以进行脱敏处理。在…