Verilog常用运算符及表达式

这篇具有很好参考价值的文章主要介绍了Verilog常用运算符及表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文详细介绍了Verilog常用的运算符和表达式,特别是分享了处理“计算位宽溢出”和“负数”的可行方式,帮助读者更加轻松地理解和掌握Verilog语言的运算符。

一、常见运算符以及表达式

算数运算符:加(+)、减(-)、乘(*)、除(/)、取余(%)

赋值运算符:非阻塞赋值(=)、阻塞赋值(<=);

关系运算符:大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)、小于等于(<=)

逻辑运算符:与(&&)、或(||)、非(!);

条件运算符:(?:);

位运算符 : 取反(~)、或(|)、异或(^)、与(&);

移位运算符:左移(<<)、右移(>>);

拼接运算符:位拼接({}),复制{n{b}};

二、详细介绍

1、算数运算符

加(+)、减(-)、乘(*)、除(/)、取余(%)

+:加法运算或者正值运算,a+b、+a
— :减法运算或者负值运算:a—b、—a
* :乘法运算:a*b
/ :除法运算:a/b,b不能等于0
% :求余运算:a%b,%两侧的数据必须为整型数据,b不能等于0

2、赋值运算符

非阻塞赋值(=)常用于组合逻辑,例如assign语句和always@(*)语句块。

wire [5:0] data0;
reg [6:0] data1;
​
assign data0 = 'd6;
always@(*) begin
    data1 = 'd10;
end

阻塞赋值(<=)常用于时序逻辑,例如always@(posedge clk)语句块。

reg [6:0] data1;
​
always@(posedge clk) begin
    data1 <= 'd10;
end

3、关系运算符

大于(>)、小于(<)、等于(==)

不等于(!=)、大于等于(>=)、小于等于(<=)

a < b  :a小于b
a > b  :a大于b
a == b :a等于b
a != b :a不等于b
a <= b :a小于或等于b
a >= b :a大于或等于b

4、逻辑运算符

(1)与(&&)

逻辑与:a&&b,a和b同时为真时才为真,否则为假

(2)或(||)

逻辑或:a||b,a和b同时为假时才为假,否则为真

(3)非(!)

a为真时,!a为假

5、条件运算符

条件表达式的值为真或假,如果为真,返回值1,否则返回值2。它主要用于简化if-else语句的书写和提高代码的可读性。

  条件表达式 ? 值1 : 值2

assign a = (b) ? 'b1 : 'b0; 如果b为真,那么a = 'b1,否则a = 'b0。

6、位运算符

(1)与(&)

对两个数的二进制形式进行“与”运算,只有两个相应位的值都为1时,结果才为1。

(2)或(|)

对两个数的二进制形式进行“或”运算,只要有一个相应位的值为1,结果就为1。

(3)异或(^)

对两个数的二进制形式进行“异或”运算,当两个相应位的值不同时,结果为1,否则为0。

(4)取反(~)

对一个数的二进制形式进行取反操作,即0变为1,1变为0。

~ :按位取反         a=1001   ~a=0110
& :按位与           a=1001   b=0011   a&b=0001
| :按位或           a=1001   b=0101   a|b=1101
^ :按位异或         a=1001   b=0101   a^b=1100

7、移位运算符

在Verilog中有两种移位运算符:<< (左移位运算符) 和 >>(右移位运算符)。其使用方法如下:a>>n或a<<n,a是操作数,n表示移动几位,这两种移位运算都用0填补移出的空位。

 reg [5:0] a,c;
 reg [7:0] b;
 a = 6'b101001;
 b = a<<2;    此时b=8'b10100100
 c = a>>2;    此时c=6'b1010

8、拼接运算符

位拼接运算符可以把两个或多个信号的某些位拼接起来进行运算操作,或者把单个信号复制多份。其使用方法如下:

wire [5:0] a, b;
wire [1:0] c
wire [4:0] d;
wire [11:0] e;
​
assign a = 6'b101101;
assign b = 6'h111000;
assign c = 2'h11;
assign d = {a[5],b[2:0],c};//即d = 100011
assign e = {2{b}};          //即e = {b,b} = 111000111000
​
​
wire aa, bb, cc, dd;
assign {aa, bb, cc, dd} = 4'b1011;
//即 aa = 1,bb = 0,cc = 1,dd = 1;
  1. 运算符优先级

Verilog常用运算符及表达式

三、常见问题和误区

1、位宽溢出问题

加法和乘法的计算结果需要扩展位宽,如果定义的结果变量位宽未做扩展,则计算结果将丢失最高位,导致结果异常。

简单处理办法:结果赋值的寄存器或wire的位宽引入进位即可。

module test
(
    input clk,
    output reg [7:0] a,c,d,
    output reg [8:0] b
);
​
reg [7:0] d0= 8'd145, d1= 8'd128;
​
always @ (posedge clk) begin
    a <= d0+ d1;
    b <= d0+ d1;
    c <= (d0+ d1) >> 1;
    d <= (d0+ d1 + 0) >> 1; 
end
​
endmodule

说明:

a <= d0+ d1,表达式中最大位宽是8bit,因此运算结果丢掉了进位,得到17;

b <= d0+ d1,整个表达式中最大位宽是9bit,因此运算结果保留了进位,得到273

c <= (d0+ d1) >> 1 ,表达式中最大位宽只有8bit,因此d0+ d1的中间结果也是8bit(丢掉进位后的17),这样不能起到保留最高有效位的效果。

d <= (d0+ d1+ 0) >> 1,表达式中多了一个未声明位宽的常数0,其默认位宽为32bit,这样加法的中间结果便不会丢掉进位。

2、负数问题

表达式中如果有一个操作数是“负数”,整个表达式的运算需要特别考虑,其实处理起来也很简单。

(1)如果只涉及到加法和减法,负数与表达式中最大操作数的位宽必须保持一致,如下处理:

reg [8:0] a = -128;
reg [9:0] b = 512;
reg [9:0] c;
reg [10:0] d;
​
assign c = {a[8], a} + b;
assign d = {{2{a[8]}}, a} - {a[9], a}};

(2)如果涉及乘法,则将负数转换为绝对值与符号位。

reg [8:0] a = -128;
reg [9:0] b = 512;
reg [17:0] c_abs;
reg [18:0] c;
reg a_sign;
reg [7:0] a_abs;
​
assign a_sign = a[8];
assign a_abs = a[8] ? (~a[7:0] + 1'b1) : a[7:0];
assign c_abs = a_abs*b; 
assign c = a_sign ? (~{1'b0, c_abs} + 1'b1') : {1'b0, c_abs};

本文将不断定期更新中,关注,收藏,不走丢哦

有任何问题,都可以在评论区和我交流哦

本文由FPGA入门到精通原创,公众号为“FPGA入门到精通”,github开源代码:“FPGA知识库

您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞、评论和收藏。文章来源地址https://www.toymoban.com/news/detail-475025.html

到了这里,关于Verilog常用运算符及表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB 运算符和表达式

    一、算术运算符 MATLAB中的算术运算符用于执行基本的算术运算,包括加、减、乘、除、取余和幂运算。下表列出了MATLAB中的算术运算符及其用法: 运算符 描述 示例 其中,点运算符用于执行元素级别的运算,即对两个向量或矩阵中的每个元素进行运算。 二、逻辑运算符 MA

    2024年02月13日
    浏览(44)
  • 3.3 运算符和表达式

    几乎每一个程序都需要进行运算,对数据进行加工处理,否则程序就没有意义了。要进行运算,就需规定可以使用的运算符。C语言的运算符范围很宽,把除了控制语句和输入输出以外几乎所有的基本操作都作为运算符处理,例如将赋值符“=”作为赋值运算符、方括号作为下

    2024年02月11日
    浏览(36)
  • JS基础-表达式和运算符

    表达式 :是由操作数和运算符(可选)构成的并产生运算结果的语法结构。例如:3+5 运算符 :进行计算或者逻辑运算的符号,比如表达式中的 + 号 表达式分类:算术、关系、逻辑、赋值、组合 以下符号都是算数运算符,运算符的就是运算 意义 运算符 加 + 减 - 乘

    2024年02月09日
    浏览(40)
  • C++的运算符与表达式

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++内置了丰富的运算符,并且提供了以下类型的运算符: 算数运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 在程序中,运算符是用来操作数据的,因此这些数据也被称为操作数,使用运算符将操

    2024年02月06日
    浏览(30)
  • (77)TCL脚本命令【运算符(expr运算表达式)】

    1.1 TCL简介 1.2 TCL的起源与发展 1.3 TCL语言与库介绍 1.4 TCL运行环境 1.5 TCL脚本命令【运算符(expr运算表达式)】 1.6 结束语 Tcl 语言的全称 Tool Command Language,即工具命令语言。这种需要在 EDA 工具中使用的相当之多,或者说几乎每个 EDA 工具都支持 Tcl 语言。所以对于 IC 专业的

    2024年02月16日
    浏览(33)
  • C++学习之运算符与表达式

    基本的算数运算有加法、减法、乘法、除法和取模(求余数),对应的算数运算符分别为:+、-、*、/、%。至于用法,大家应该耳熟能详,这里不再过多赘述。 自增与自减运算符 运算符 说明 ++ 自增运算符,将数值增加一 - - 自减运算符,将数值减少一 该运算符主要有前置和

    2024年02月09日
    浏览(42)
  • 三、C#—变量,表达式,运算符(3)

    变量名能不能用汉字? 全局变量 局部变量 错误1 错误2 错误3 2.2.1 值类型直接存储值 例如: 2.2.2 简单类型 2.2.3 整数类型 例如: 2.2.4 浮点类型 2.2.5 decimal 类型 注意: 定义decimal变量时的问题 2.2.6 bool类型 2.3.1 引用类型存储对值得引用 2.3.2 Object 类 不区分大小写得限制 2.3.3

    2024年02月09日
    浏览(35)
  • 【python数据分析】运算符与表达式

    🙋‍ 哈喽大家好,本次是python数据分析、挖掘与可视化专栏第三期 ⭐本期内容:运算符与表达式 🏆系列专栏:Python数据分析、挖掘与可视化 👍保持开心,拒绝拖延,你想要的都会有,加油加油! 本期内容为python的运算符与表达式~ 参考书籍:《Python数据分析、挖掘与可视

    2024年02月03日
    浏览(37)
  • Java-01变量、运算符、表达式、输入与输出

    tip:[start]编程是一种控制计算机的方式,和我们平时双击打开文件、关机、重启没有任何区别——闫学灿tip:[end] 内置数据类型: 类型 字节数 举例 byte整数 1 123 short整数 2 12345 int整数 4 123456789 long整数 8 1234567891011L float浮点数 4 1.2F double浮点数 8 1.2, 1.2D boolean 1 true or false char字符

    2024年02月05日
    浏览(38)
  • C#中使用 => 运算符的 switch 表达式

    目录 一、关于switch 语句 1.switch 语句及语法结构 2.switch 语句的一些重要注意事项 3.通常情况下的示例 1.示例1 2.示例2  二、使用 = 运算符的 switch 表达式 1.关于switch表达式 2.示例1 3.示例2         C# 中的 switch 语句是一种控制结构,允许您将一个表达式或值与多个值进行比

    2024年02月20日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包