概述
Verilog
关于运算的那些事
新手上路,到处是坑,且行且小心。
Verilog HDL
语言里面,进行加减乘除或者比较、
右移等运算,无符号运算和有符号运算有着
很大的区别。根据
Verilog-2001
标准,
只有当表达式右边的
所有变量
都具有
signed
类型属
性的时候,扩展符号位
才
被执行,否则,所有的变量高位都只扩展
0
.
举例如下:
例
1
reg signed [5:0] A;
reg signed [3:0] B;
reg [3:0] C;
A = B + C;
如果
B
是一个负数,那么
A
肯定不能得到正确的结果。
例
2
reg signed [32:0] A;
reg signed [15:0] B;
reg signed [31:0] C;
A = B * {C[31],C[6:0]}
作者本意是:
如果
C
的值介于
-127~127
之间,
那么直接取
C
的低
7
位,
并且用
C
的最高
位来当做符号位,
然后做乘法,
这样可以减少占用乘法器的个数,
但是这样的写法也是错误
的,如果
B
和
C
有一个是负数,那么也不会得到正确的结果。可以这样写:
A = B * $signed({C[31],C[6:0]})
其中
$signed()
是将括号内的表达式转换为
signed
的数据类型,同样的还有
$unsigned()
,
注:这两个函数是
verilog-2001
新增的系统函数。
同样的,如果用变量和常量进行运算,譬如:
A = B * (-5
’
D5)
,也得不到正确的结果,解
决办法是
A = B * $signed(-5
’
D5);
例
3
reg signed [19:0] A;
if( A
’
D65535)
A <= -17
’
D65535;
else if (A > 17
’D65535
)
A <= 17
’
D65535;
作者原意是对
A
的范围进行限定。抱歉的是,这样的写法同样会有问题。在这里我们
可以这样写
If(A[19])
//
首先判断此数是否为负数
begin
if(A
20
D
’
65535)
//
这里一定要注意的是:常量的位宽要保证与变量的位宽一致
A <= -17D
’
65535; //
这里就没关系了。
end
else if (A >
20
’
D65535)
//
同上
A <= 17
’
D65535;
在这个例子里面,想直接用下面的方法进行比较是不可以的!
if (A
’
d65535))
最后
以上就是忧虑指甲油为你收集整理的verilog幂次方_verilog关于运算的那些事的全部内容,希望文章能够帮你解决verilog幂次方_verilog关于运算的那些事所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复