草庐IT

Verilog的运算符及优先级

Doreen Zou 2023-07-24 原文

Verilog运算符按功能可以分为八类。

1. 基本算数运算符

运算符中文名举例举例结果说明
+加法运算符或正值运算符12+315同普通加法
-减法运算符或负值运算符12-39同普通减法
*乘法运算符12*336同普通乘法
/除法运算符12.5/34结果为4,小数部分省去
%模运算符12%40可整除,余数为0

注:若进行基本运算操作时,某一操作数有不确定数X,则结果也为X;

2. 赋值运算符

a. 连续赋值:用于对线网型变量进行赋值,而不能对寄存器变量进行赋值。

基本语法格式为:线网型变量类型 [线网型变量位宽] 线网型变量名;

                                assign #(延时量) 线网型变量名 = 赋值表达式;

举例:wire  [2:0]  a;

            wire  [3:0]  b; 

            assign   a = 3'd4;

            assign   b [3] = 1'b1;

b. 过程赋值:主要用于两种结构化模块(initial 模块和always模块)中的赋值语句,在过程块中只能使用过程赋值语句,过程赋值语句只能对寄存器类型的变量(reg、integer、real、time)进行操作,经过赋值后,上面这些变量的取值将保持不变,直到另一条赋值语句对变量重新赋值为止。

基本格式为:<被赋值变量><赋值操作符><赋值表达式>

举例: reg  c;

            always. @(c)

            begin

                   c = 1'b0;

            end

3. 关系运算符

在进行关系运算时,如果操作数之间的关系成立,则返回值为1;关系不成立,则返回0;若某一个操作数的值不定,则关系是模糊的,返回的是不定值X;关系运算符共有以下8种:

>>=<<===!====!==
大于大于等于小于小于等于逻辑相等逻辑不相等实例相等实例不相等

4. 逻辑运算符

对运算符两边操作数进行操作,返回“True”或“FALSE”。

&&||!
逻辑与逻辑或逻辑非

逻辑运算符的真值表

ab!a!ba&&ba||b
110011
100101
011001
001100

5. 条件运算符

条件运算符格式如下:

y = x ? a : b;      // 若y = x为True,返回操作数a,否则返回第三个操作数b。

嵌套的条件运算符可以多路选择:

assign s = (a >= 2) ? 1: (a < 0) ? 2:0;   //当a >= 2时,s = 1 ; 否则继续执行下一个条件选择选择;即当a < 0时,s = 2;若0 <= a < 2时,s = 0;

6 . 位运算符

位运算对其自变量的每一位进行操作,如S1 & S2 的含义就是S1 和 S2 的对应位相与。

&^^~~&~
异或同或与非或非

7. 移位运算符

移位运算符有两种: “<<”(左移)和“>>”右移,左移相当于乘2,右移一位相当于除2。

S1 << N,其含义是将第一个操作数S1向左移位,所移动的位数由N决定,且用0来填补移出的空位。

8. 拼接运算符

拼接运算符可以将两个或多个信号的某些位拼接起来进行运算操作,格式如下:

{S1, S2, ......, Sn}

例: 拼接符的Verilog实现

reg [15:0] shiftreg;

always @(posedge clk)

          shiftreg [15:0] <= {shiftreg [14:0],data_in} ;

优先级总结: 

名称运算符优先级
求非,求反~ !
乘,除,取模*,/,%
加,减+,-
移位<< , >>
关系< , < = , > , > =
等式= = , != , = = = , != =
按位与&,~&
按位异或^ , ~^
按位或| , ~ |
逻辑与&&
逻辑或||
选择? :

注:由上至下,优先级由高到低;

参考: 《无线通信FPGA设计》田耕 徐文波 张廷伟等.

有关Verilog的运算符及优先级的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  3. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  4. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  5. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

  6. ruby - OR 运算符和 Ruby where 子句 - 2

    可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby​​的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在

  7. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

  8. ruby - 我可以在 Ruby 中动态调用数学运算符吗? - 2

    ruby中有这样的东西吗?send(+,1,2)我想让这段代码看起来不那么冗余ifop=="+"returnarg1+arg2elsifop=="-"returnarg1-arg2elsifop=="*"returnarg1*arg2elsifop=="/"returnarg1/arg2 最佳答案 是的,只需像这样使用send(或者更好的是public_send):arg1.public_send(op,arg2)这是可行的,因为Ruby中的大多数运算符(包括+、-、*、/、andmore)只需调用方法。所以1+2与1.+(2)相同

  9. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  10. ruby - 如何在不使用文本的情况下找到 Ruby 运算符的含义? - 2

    您如何找到有关代码中运算符用法的信息(最好是通过Google)?在这种情况下,我想找到这段代码在Ruby中的含义。x=[1,2,3]x.send:[]=,0,2x[0]+x.[](1)+x.send(:[],2)我要你教我如何钓鱼——不要告诉我运算符(operator)是做什么的。当我去Google并尝试搜索符号时,我得到的示例或教程没有涵盖特定的用法。https://stackoverflow.com/questions/1165786/how-to-search-for-punctuation-that-gets-ignored-by-google表示谷歌驳回了这种表示法;我寻找“

随机推荐