【Verilog】运算符

系列文章

数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter)



算术运算符

Verilog HDL中常用的算术运算符主要有五种,分别是加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。

算术操作结果的位宽 。 算术表达式结果的长度由最长的操作数决定。 在赋值语句下,算术操作结果的长度由操作左端的目标长度决定。


关系运算符

关系运算符也是双目运算符,是对两个操作数的大小进行比较。关系运算符有大于(>)、小于(<)、大于等于(>=)和小于等于(<=)几种。

在进行关系比较时,如果成立则结果为"1 ",否则返回的结果为"0 ";若不确定则返回结果为不定值(x)。例如:10>15的结果为假(0),20>18的结果为真(1),而4'b1101<4'hx的结果为不定值(x)。


相等关系运算符

相等关系运算符是对两个操作数进行比较,比较的结果有三种:真(1) 、假(0)和不定值(x)。Verilog HDL语言中有四种相等关系运算符:等于( == )、不等于( != )、全等(===)、非全等(! ==)。

"=="和"!="称为逻辑等式运算符,其结果由两个操作数的值决定。

" === "和" !== "运算符则不同,它是对操作数进行按位比较,两个操作数必须完全一致,其结果才是1,否则为0。但是,若两个操作数对应位出现不定值x和高阻值z,则可认为是相同的。" ==="和"!=="运算符常用于case表达式的判别,所以又称为"case等式运算符"。


逻辑运算符

逻辑运算符有三种,分别是逻辑与 运算符(&& )、逻辑或 运算符(|| )、逻辑非运算符(!)。其中逻辑与和逻辑或是双目运算符,逻辑非为单目运算符。

逻辑运算符的操作数只能是逻辑0或者逻辑1。

三种逻辑运算符的真值表如下所示:

在逻辑运算符的操作过程中,如果操作数是1位的,那么1就代表逻辑真,0就代表逻辑假;如果操作数是由多位组成的,则当操作数每一位都是0时才是逻辑0值,只要有某一位为1,这个操作数就是逻辑1值。例如:寄存器变量a、b的初值分别为4'b1110和4'b0000,则 !a=0,!b=1,a&&b=0;a||b=1。

需注意的是,若操作数中存在不定态x,则逻辑运算的结果也是不定态,例如:a的初值为4'b1100,b的初值为4'b01x0,则 !a=0,!b=x,a&&b=x,a||b=x。


按位运算符

数字逻辑电路中,信号与信号之间的运算称为位运算。Verilog HDL提供了以下五种类型的位运算符:按位取反(**)、按位与(&)、按位或(**|**)、按位异或(**^**)、按位同或(**^)。

按位运算举例:

verilog 复制代码
module bit_tb;
    reg[2:0]a;
    reg[4:0]b;
    initial
        begin
            a=5'b101;//运算的时候a自动变为5'b00101
            b=5'b11101;
       
            $display("%b",~a);//结果为3'b010
 			$display("%b",~b);//结果为5'b00010
 			$display("%b",a&b);	//结果为5'b00101 
 			$display("%b",a|b); //结果为5'b11101
  			$display("%b",a^b);	//结果为5'b11000          
        end
endmodule
            

归约运算符

归约运算符按位进行逻辑运算,属于单目运算符 。由于这一类运算符操作的结果是产生1位逻辑值,因而被形象地称为缩位运算符。

Verilog HDL中,缩位运算符包括&(与)、| (或)、^ (异或)以及相应的非操作&、|、^、^。归约运算符的操作数只有一个。

归约运算符的运算过程是:设a是一个4位的寄存器型变量,它的四位分别是a[0]、a[1]、a[2]和a[3]。当对a进行缩位运算时,先对a[0]和a[1]进行缩位运算,产生1位的结果,再将这个结果与a[2]进行缩位运算,再接着是a[3],最后产生1位的操作结果。

归约操作举例:

verilog 复制代码
module cut_tb;
    reg[5:0]a;
    initial
        begin
            a=6'b101011;
          $display("%b",&a);   	//结果为1'b0
          $display("%b",|a);    	//结果为1'b1
          $display("%b",^a);	 	//结果为1'b0
        end
endmodule

移位运算符

移位运算符有两种:左移位运算符(<<)、右移位运算符(>>)。运算过程是将左边(右边)的操作数向左(右)移,所移动的位数由右边的操作数来决定,然后用0来填补移出的空位。


条件运算符

条件运算符是Verilog HDL里唯一的三目运算符,它根据条件表达式的值来选择执行表达式,其表达形式为:<条件表达式>?<表达式1>:<表达式2>。其中,条件表达式的计算结果有真(1)、假(0)和不定态(x)三种。当条件表达式的结果为真时,执行表达式1,当条件表达式的结果为假时,执行表达式2。


连接和复制运算符

Verilog HDL语言中还有两个特殊的运算符:连接运算符 ({} )和复制运算符 ({{}})。

连接运算符 是把位于大括号({})中的两个或两个以上信号或数值用逗号(,)分隔的小表达式按位连接在一起,最后用大括号括起来表示一个整体信号,形成一个大的表达式。其格式为:{信号1的某几位,信号2的某几位,...,信号n的某几位}

重复运算符({{}}) 将一个表达式放入双重花括号中,复制因子放在第一层括号中。它为复制一个常量或变量提供了一种简便方法。

连接和复制操作举例:

verilog 复制代码
module con_rep_tb;
    reg [2:0]a;
    reg [3:0]b;
    reg [7:0]c;
    reg [4:0]d;
    reg [5:0]e;
    initial
        begin
            a=3'b101;
            b=5'b1110;
            c={a,b};
            d={a[2:1],b[2:0]};
            e={2{a}};
            $display("%b",c);   	//结果为8'b01011110	
            $display("%b",d);	//结果为5'b10110
            $display("%b",e);	//结果为6'b101101
        end
endmodule
            
相关推荐
FPGA之旅15 小时前
FPGA从零到一实现FOC(一)之PWM模块设计
fpga开发·dubbo
XMAIPC_Robot16 小时前
基于ARM+FPGA的光栅尺精密位移加速度测试解决方案
arm开发·人工智能·fpga开发·自动化·边缘计算
cycf17 小时前
状态机的设计
fpga开发
szxinmai主板定制专家19 小时前
【精密测量】基于ARM+FPGA的多路光栅信号采集方案
服务器·arm开发·人工智能·嵌入式硬件·fpga开发
千宇宙航1 天前
闲庭信步使用SV搭建图像测试平台:第三十二课——系列结篇语
fpga开发
千宇宙航1 天前
闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别
图像处理·人工智能·深度学习·神经网络·计算机视觉·fpga开发
小眼睛FPGA2 天前
【RK3568+PG2L50H开发板实验例程】FPGA部分/紫光同创 IP core 的使用及添加
科技·嵌入式硬件·ai·fpga开发·gpu算力
forgeda2 天前
如何将FPGA设计验证效率提升1000倍以上(2)
fpga开发·前沿技术·在线调试·硬件断点·时钟断点·事件断点
9527华安2 天前
FPGA实现40G网卡NIC,基于PCIE4C+40G/50G Ethernet subsystem架构,提供工程源码和技术支持
fpga开发·架构·网卡·ethernet·nic·40g·pcie4c
search73 天前
写Verilog 的环境:逻辑综合、逻辑仿真
fpga开发