
在Verilog HDL语言有一个特殊的运算符:位拼接运算符{},用这个运算符可以把两个或多个信号的某些位拼接起来进行运算 *** 作。其使用方法如下:
即把某些倍号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号,例如:
也可以写成为:
在位拼接表达式中不允许存在没有指明位数的信号。这是因为在计算拼接信号的位宽的大小时必需知道其中每个信号的位宽。
位拼接也可以用重复法来简化表达式,如下所示:
位拼接还可以用嵌套的方式来表达,如下所示:
【拓展资料】
Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类:
(1)算术运算符 +,-,*,/,%
(2)赋值运算符 =,<=
(3)关系运算符>,<,>=,<=
(4)逻辑运算符 &&, ||, !
(5)条件运算符 ?:
(6)位运算符 ~, | , ^ ,&,^~
(7)移位运算符 <<,>>
(8)拼接运算符 {}
(9)其他。
1)基本的算术运算符:加减乘都比较简单这里不再记录。
在进行整数的除法运算时,结果要略去小数部分,只取整数部分;而进行取模运算时(%,亦称作求余运算符)结果的符号位采用模运算符中第一个 *** 作数的符号。
-10%3 结果 -1 11%-3 结果为2
注意:在进行算术运算时,如果某一个 *** 作数有不确定的值x,则整个结果也为不确定值x。
2)位运算符:
按位取反~ 、按位与 &、按位或 | 、按位异或 ^ 、按位同或 ^~
在不同长度的数据进行位运算时,系统会自动的将两个数右端对齐,位数少的 *** 作数会在相应的高位补0,一时的两个 *** 作数按位进行 *** 作。
3)逻辑运算符:
逻辑与 &&、逻辑或 ||、逻辑非 !
其中&&和||是双目运算符,其优先级别低于关系运算符,而 !高于算术运算符。
4)关系运算符
<、 >、 <= 、 >= 如果关系运算是假的,则返回值是0,如果声明的关系是真的,则返回值是1。 关系运算符的优先级别低于算数运算符。
如: a<size-1 //这种表达方式与下面的表达方式相同
a<(size-1) //
size-1<a //这种表达方式与下面的表达方式不同
size-(1<a) //
5)等式运算符
== 、!= 、===、!== 符号之间不能有空格。
“==”和“!=”称作逻辑等式运算符,其结果由两个 *** 作数的值决定。由于 *** 作数可能是x或z,其结果可能为x;
“===”和“!==”常用于case表达式的判别,又称作cae等式运算符。其结果只为0和1.如果 *** 作数中存在x和z,那么 *** 作数必须完全相同结果才为1,否则为0.
逻辑等式运算符和case等式运算符的区别:
6)移位运算符
<<、 >> a>>n其中a代表要进行移位的 *** 作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。
如果 *** 作数已经定义了位宽,则进行移位后 *** 作数改变,但是其位宽不变。
/*不懂之处(夏宇闻第三版,p41)
4'b1001<<1=5'b10010 4'b1001<<2=6'b100100 (左移会使得位数增加?)
1<<6=32'b1000000 4'b1001>>1=4'b0100 (右移不会改变位数?)
4‘b1001>>4=4'b0000;
*/
7)位拼接运算符
{信号1的某几位,信号2的某几位,......信号n的某几位} 将某些信号的某些为列出来,中间用逗号分开,最后用大括号括起来表示一个整体的信号。
在位拼接的表达式中不允许存在没有指明位数的信号。
{a,b[3:0],w,3'b101} //等同于{a,b[3],b[2],b[1],b[0],w,1b'1,1'b0,1'b1}
{4{w}} //等同于{w,w,w,w}
{b,{3{a,b}}} //等同于{b,a,b,a,b,a,b} 这里面的3、4必须是常量表达式。
8)缩减运算符
这是单目运算符,也包括与、或、非运算。运算规则与位运算相似,不过是对单个运算符的每一位逐步运算,最后的运算结果是一位的二进制数。
c=&B //意思同c=((B[0]&B[1]) &B[2] ) &B[3]
楼上说的只是针对它这个例子的一种用法而已。拼接运算就是把两个信号的位宽拼起来,得到另一个信号,其位宽是那两个信号之和。
比如说假设信号B={A[6:0],C[7]}。信号A是7位,C是1位,那么B就有8位宽了。就是这么简单。
拼接拼接嘛,就是拼起来用。
{cout,sum}其实相当于一个信号X,它的位宽是cout和sum的位宽之和。ina+inb+inc和的位宽其实是X,但是他为了直观的阐述X的含义,所以用cout,sum拼起来,这样你就知道了X的含义是sum和进位
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)