执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。无符号数存储在:
*
*
*
有符号数存储在:
*
*
下面是一些赋值语句的实例:
reg
integer
.
Bar
Tab
-4'd12
-12
因为Bar是普通寄存器类型变量,只存储无符号数。右端表达式的值为'b110100(12的二进制补码)。因此在赋值后,Bar存储十进制值52。在第二个赋值中,右端表达式相同,值为'b110100,但此时被赋值为存储有符号数的整数寄存器。Tab存储十进制值-12(位向量为110100)。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为无符号数,而在第二种情况下,向量被解释为有符号数。
下面为具体实例:
Bar
Tab
Bar
Tab
在第一次赋值中,Bar被赋于十进制值61(位向量为111101)。而在第二个赋值中,Tab被赋于与十进制1073741821(位值为0011...11101)。Bar在第三个赋值中赋于与第一个赋值相同的值。这是因为Bar只存储无符号数。在第四个赋值中,Bar被赋于十进制值-3。
下面是另一些例子:
Bar
Tab
Bar被赋于十进制值62(-2的二进制补码),而Tab被赋于十进制值-2(位向量为111110)。
下面为另一个实例:
Bar
Tab
>Bar被赋于十进制值58(位向量为111010),而Tab被赋于十进制值-6(位向量为111010)。
因为VERILOG对reg跟wire型变量的乘法(*)都默认为无符号数相乘,所以不能直接用*号来表示。我是这样处理的:先把两个操作数变为源码,再用FOR循环进行移位相加,结果是对的,但是综合出来的结果占有的资源比较多,比直接调用QUARTUS库里的乘法器占用资源多百分之二十左右。请问各位大侠对有符号数的乘法是怎样进行的?谢谢讨论!
如果你用verilog2001,可以直接声明有符号数,做有符号数乘法,你再用synplify综合一下看看资源如何。
module
input
output
assign
endmodule