verilog基础语法之表达式

verilog基础语法之表达式

  • 1、操作数
  • 2、操作符
  • 3、示例

   在Verilog中,表达式是由操作数和操作符组成的组合,包括:算术操作符、关系操作符、等价操作符、逻辑操作符、按位操作符、归约操作符、移位操作符、拼接操作符和条件操作符,它们用于执行算术运算、逻辑运算、位操作、关系和等价比较等。

1、操作数

   操作数可以是任意的数据类型,只是某些特定的语法结构要求使用特定类型的操作数。操作数可以为常数,整数,实数,线网,寄存器,时间,位选,域选,存储器及函数调用等。

module test;//实数
real a, b, c;
c = a + b ;//寄存器
reg  [3:0]       cprmu_1, cprmu_2 ;
always @(posedge clk) begincprmu_2 = cprmu_1 ^ cprmu_2 ;
end//函数
reg  flag1 ;
flag = calculate_result(A, B);//非法操作数
reg [3:0]         res;
wire [3:0]        temp;
always@ (*)beginres    = cprmu_2 – cprmu_1 ;//temp = cprmu_2 – cprmu_1 ; //不合法,always块里赋值对象不能是wire型
endendmodule

2、操作符

   Verilog 中提供了大约 9 种操作符,分别是算术、关系、等价、逻辑、按位、归约、移位、拼接、条件操作符。大部分操作符与 C 语言中类似。同类型操作符之间,除条件操作符从右往左关联,其余操作符都是自左向右关联。圆括号内表达式优先执行。

操作符描述
算数表达式加法:+、减法:-、乘法:*、除法:/、模运算取余:% 、求幂:**
逻辑表达式逻辑与:&&、逻辑或:||、逻辑非:~、逻辑异或:^
位操作表达式位与:&、位或:|、位非:~、位异或:^、同或:~^、位取反:~、位与非:&~ 或 ~&、位或非:|~ 或 ~|、位位移:左移 <<,右移 >>、算术左移:<<<、算术右移:>>>
归约操作表达式归约与:&、归约与非:~&、归约或:|、归约或非:~|、归约异或:^ 、归约同或:~^
关系表达式大于:>、小于:<、大于等于:>=、小于等于:<=、逻辑等于:==、逻辑不等于:!=
等价表达式全等价:=== 、 非全等价:!==
条件表达式条件运算符:? :(类似于C语言中的三元运算符)
赋值表达式连续赋值:=、非阻塞赋值:<=(仅用于reg类型)
索引和切片表达式位选择(索引):使用方括号[]、部分选择(切片):使用方括号加冒号[:]

3、示例

下面是一些示例:

module expression_example(input wire [7:0] data_in,output reg result
);// 算术表达式
wire [15:0] data_sum = data_in + 8'hAA;
b = 4'b100x ;
c = a+b ;       //结果为c=4'bxxxx,如果操作数某一位为 X,则计算结果也会全部出现 X。// 逻辑表达式:计算结果是一个 1bit 的值,0 表示假,1 表示真,x 表示不确定
wire logic_and = ~data_in[7] & data_in[6];
A = 3; 
B = 0; 
C = 2'b1x ;A && B    //     为假
A || B    //     为真
! A       //     为假
! B       //     为真
A && C    //     为X,不确定
A || C    //     为真,因为A为真
(A==2) && (! B)  //为真,此时第一个操作数为表达式// 位操作表达式:对 2 个操作数的每 1bit 数据进行按位操作,如果 2 个操作数位宽不相等,则用 0 向左扩展补充较短的操作数。
wire bit_set = data_in | 8'b00001111;//归约表达式:归约操作符只有一个操作数,它对这个向量操作数逐位进行操作,最终产生一个 1bit 结果。
A = 4'b1010 ;
&A ;      //结果为 1 & 0 & 1 & 0 = 1'b0,可用来判断变量A是否全1
~|A ;     //结果为 ~(1 | 0 | 1 | 0) = 1'b0, 可用来判断变量A是否为全0
^A ;      //结果为 1 ^ 0 ^ 1 ^ 0 = 1'b0//移位表达式:算术左移和逻辑左移时,右边低位会补 0。逻辑右移时,左边高位会补 0;而算术右移时,左边高位会补充符号位,以保证数据缩小后值的正确性。
A = 4'b1100 ;
B = 4'b0010 ;
A = A >> 2 ;        //结果为 4'b0011
A = A << 1;         //结果为 4'b1000
A = A <<< 1 ;       //结果为 4'b1000
C = B + (A>>>2);    //结果为 2 + (-4/4) = 1, 4'b0001// 关系表达式:关系操作符的正常结果有 2 种,真(1)或假(0)
wire is_positive = data_in[7] == 0;// 等价表达式 :等价操作符的正常结果有 2 种:为真(1)或假(0)
wire same_parity = (^data_in) === data_in[7];
A = 4 ;
B = 8'h04 ;
C = 4'bxxxx ;
D = 4'hx ;
A == B        //为真
A == (B + 1)  //为假
A == C        //为X,不确定。逻辑相等/不等操作符不能比较 x 或 z,当操作数包含一个 x 或 z,则结果为 x。
//全等比较时,如果按位比较有相同的 x 或 z,返回结果也可以为 1,即全等比较可比较 x 或 z。所以,全等比较的结果一定不包含 x。
A === C       //为假,返回值为0
C === D       //为真,返回值为1 // 条件表达式:条件表达式类似于 2 路(或多路)选择器,其描述方式完全可以用 if-else 语句代替。
wire [7:0] selected_data = is_positive ? data_in : ~data_in; //当is_positive  为 1(真) 时,selected_data 赋值为 data_in ; 否则,将 ~data_in赋值给 selected_data 。// 赋值表达式
always @(posedge clk) beginresult <= selected_data;
end// 索引和切片表达式
wire [2:0] lower_nibble = data_in[2:0]; // 选择低四位
wire most_significant_bit = data_in[7]; // 选择最高位//拼接表达式:拼接操作符用大括号 {,} 来表示,用于将多个操作数(向量)拼接成新的操作数(向量),信号间用逗号隔开。拼接符操作数必须指定位宽,常数的话也需要指定位宽。
A = 4'b1010 ;
B = 1'b1 ;
Y1 = {B, A[3:2], A[0], 4'h3 };  //结果为Y1='b1100_0011
Y2 = {4{B}, 3'd4};  //结果为 Y2=7'b111_1100
Y3 = {32{1'b0}};  //结果为 Y3=32h0,常用作寄存器初始化时匹配位宽的赋初值endmodule

在Verilog中,表达式的使用非常广泛,它们可以出现在赋值语句、条件语句、循环语句等中。表达式的结果可以是一个标量(单个位),也可以是一个向量(多位宽)。在使用表达式时,需要注意操作数的位宽,以确保结果的准确性和避免位宽不匹配的问题。

需要说明的是,对变量进行声明时,要根据变量的操作符对变量的位宽进行合理声明,不要让结果溢出。上述例子中,相加的 2 个变量位宽为 4bit,那么结果寄存器变量位宽最少为 5bit。否则,高位将被截断,导致结果高位丢失。无符号数乘法时,结果变量位宽应该为 2 个操作数位宽之和。

reg [3:0]        mula ;
reg [1:0]        mulb;
reg [5:0]        res ;
mula = 4'he   ;
mulb = 2'h3   ;
res  = mula * mulb ; //结果为res=6'h2a, 数据结果没有丢失位数

负数表示时,可以直接在十进制数字前面增加一个减号 -,也可以指定位宽。因为负数使用二进制补码来表示,不指定位宽来表示负数,编译器在转换时,会自动分配位宽,从而导致意想不到的结果。例如:

mula = -4'd4 ;
mulb = 2 ;
res = mula * mulb ;      //计算结果为res=-6'd8, 即res=6'h38,正常
res = mula * (-'d4) ;    //(4的32次幂-4) * 2, 结果异常 

另外,位操作符的逻辑规则为,与操作时有0则值为0,否则有x则值为x,都为1时值为1;或操作时有1则值为1,否则有x则值为x,都为0时值为0;异或操作时有x则值为x,否则有1则值为1,操作数相同时值为0;同或操作时有x则值为x,否则有0则值为0,操作数相同时值为1;整理如下表所示:

&(与)01x|(或)01x
0000001x
101x1111
x0xxxx1x
^(异或)01x~^(同或)01x
001x010x
110x101x
xxxxxxxx

参考资料:
编码宝库:Verilog 表达式

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

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

相关文章

学习java第六十六天

Spring 中的 bean 的作用域有哪些? singleton : 唯一 bean 实例&#xff0c;Spring 中的 bean 默认都是单例的。 prototype : 每次请求都会创建一个新的 bean 实例。 request : 每一次HTTP请求都会产生一个新的bean&#xff0c;该bean仅在当前HTTP request内有效。 sessio…

GT2505HS-VTBD 三菱触摸屏手持式5.7寸型

GT2505HS-VTBD 三菱触摸屏手持式5.7寸型 GT2505HS-VTBD参数,GT2505HS-VTBD用户手册,GT2505HS-VTBD使用手册GT2505HS-VTBD参数说明&#xff1a;手持式5.7吋型&#xff0c;VGA 640*480&#xff0c;TFT彩色液晶屏,65536色,内存32MB&#xff0c;DC24V,内置以太网接口。 GT2505HS-VT…

agiletc部署

数据库创建及运行 启动命令 cd /AgileTC/case-server&& nohup mvn spring-boot:run &查看是否启动成功 http://192.168.101.:8094/case/caseList/1需要安装java javac等 一、安装java 1 安装java11 sudo yum install java-11-openjdk-devel -y2 切换到java11 …

【零基础】system generator①设置卡解析

1.在matlab中我们输入的是双精度浮点型数据&#xff0c;经过gateway后变成定点型。十六位十四个小数位&#xff0c;整个数据有十六位&#xff0c;其中十四位给了小数 2.fixed-point定点型&#xff1b;signed有符号&#xff1b;2’s comp补码 3.量化误差 truncate&#xff0c;舍…

同时安装多个nodejs版本可切换使用,或者用nvm管理、切换nodejs版本(两个详细方法)

目录 一.使用nvm的方法&#xff1a; 1.卸载nodejs 2.前往官网下载nvm 3.安装nvm 4.查看安装是否完成 5.配置路径和淘宝镜像 6.查看和安装各个版本的nodejs 7.nvm的常用命令 二.不使用nvm&#xff0c;安装多个版本&#xff1a; 1.安装不同版本的nodejs 2.解压到你想放…

Ubuntu 22.04 下,VS Code 配置 C++ 编译及 CMake

一、VS Code 安装以及 C 编译环境配置 1. 在 Ubuntu 中安装 VS Code 笔者直接在 Ubuntu Software 中心安装 VS Code。也可以从VS Code官网下载 deb&#xff0c;解压 dpkg -i 安装。 2. VS Code 中配置 g/gcc 1) 安装 C/C 扩展 &#xff08;CtrlShiftX&#xff09; 2&#x…

差速机器人模型LQR 控制仿真(c++ opencv显示)

1 差速机器人状态方程构建 1.1差速机器人运动学模型 1.2模型线性化 1.3模型离散化 2离散LQR迭代计算 注意1&#xff1a;P值的初值为Q。见链接中的&#xff1a; 注意2&#xff1a;Q, R参数调节 注意3&#xff1a;LQR一般只做横向控制&#xff0c;不做纵向控制。LQR输出的速度…

辅助阅读代码

辅助代码工具&#xff1a; 1、sourcetrail 2、valgrind &#xff0c; qcachegrind sourcetrail&#xff0c;可以生成类图&#xff0c;以及类之间&#xff0c;函数之间的调用关系 1、安装 2、使用该工具需要使用cmake 编译一次 cmake -DCMAKE_EXPORT_COMPILE_COMMANDSON 其他…

手机同步与数据安全:让手机和电脑完美结合!

在当今这个高度信息化的社会&#xff0c;手机和电脑不仅为我们提供了丰富的信息资源&#xff0c;让我们能够随时随地获取所需的信息&#xff0c;还为我们的生活带来了极大的便利。无论是工作、学习还是娱乐&#xff0c;手机和电脑都发挥着至关重要的作用。 然而&#xff0c;随…

XMLHttpRequest与Axios详解

XMLHttpRequest发送请求 在JavaScript中&#xff0c;使用XMLHttpRequest()发送多个参数通常涉及到设置HTTP请求的Content-Type头部&#xff0c;并且将参数作为请求体的一部分发送。以下是一个示例&#xff0c;展示了如何发送包含多个参数的POST请求&#xff1a; var xhr new X…

Paddle 实现DCGAN

传统GAN 传统的GAN可以看我的这篇文章&#xff1a;Paddle 基于ANN&#xff08;全连接神经网络&#xff09;的GAN&#xff08;生成对抗网络&#xff09;实现-CSDN博客 DCGAN DCGAN是适用于图像生成的GAN&#xff0c;它的特点是&#xff1a; 只采用卷积层和转置卷积层&#x…

nvm切换node版本命令

nvm切换node版本命令 使用 nvm 切换 Node.js 版本的命令如下&#xff1a;12 查看 nvm 支持安装的 Node 版本。进入命令行界面&#xff0c;输入 nvm list available&#xff0c;这会显示可以安装的 Node.js 版本。安装指定版本的 Node.js。输入 nvm install <版本号>&…

优先队列——大小堆—— priority_queue

本人博客主页 本篇博客相关博客 二叉树--讲解 文章目录 目录 文章目录 前言 一、priority_queue是什么&#xff1f; 二、priority_queue的使用 1、相关函数 2、代码使用 3、堆的插入删除 三、模拟实现 1、大框架 2、仿函数 3、向下调整 4、向下调整 总结 前言 在我们学习二叉…

免费SSL证书怎么签发

大家都知道SSL证书好&#xff0c;作用大&#xff0c;安全性高&#xff0c;能加权重&#xff0c;等保必须的参考值。但是如何选择合适且正确的证书也是至关重要的&#xff0c;网站更适合单域名证书、多域名证书、泛域名证书、还是多域名通配符证书。 首先大家要清楚&#xff0c…

网站访问提示不安全怎么办??

当网站访问时提示“不安全”&#xff0c;这通常与网站的SSL证书有关&#xff0c;或者是网站本身存在一些安全风险。以下是一些解决步骤和建议&#xff1a; 1、检查URL前缀&#xff1a;首先&#xff0c;检查URL是否以https://开头。如果仍然是http://&#xff0c;则网站没有使用…

python 新特性

文章目录 formatted字符串字面值formatted字符串支持 字符串新方法变量类型标注二进制表示中数字为1的数量统计字典的三个方法新增mapping属性函数zip()新增strict参数dataclass字典合并match 语法 formatted字符串字面值 formatted字符串是带有’f’字符前缀的字符串&#xf…

HashMap在JDK1.8的优化

目录 数据结构上的优化 Hash碰撞问题解决方案的优化 Hash值算法的优化

我必须要吹一波MATLAB 2024a,太牛逼了!|福利:附安装教程及下载地址

最近逛MATLAB官网&#xff0c;发现MATLAB 2024a版本已经Pre-release了&#xff0c;翻了下release note&#xff0c;不得不感叹&#xff0c;实在是太强了&#xff01; 这次重点更新了四个工具箱&#xff1a; Computer Vision Toolbox Deep Learning Toolbox Instrument Contro…

图像下载的新趋势:Kotlin技术探索与实践

随着互联网的迅速发展和智能设备的普及&#xff0c;图像下载作为一项重要的技术应用&#xff0c;也在不断演进和创新。在这篇文章中&#xff0c;我们将探讨图像下载的新趋势&#xff0c;并使用Kotlin语言进行实践探索。 引言 图像下载是指从网络上获取图像并保存到本地设备的…

鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄

句柄 | handle int open(const char* pathname,int flags); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大…