我是靠谱客的博主 忧虑指甲油,最近开发中收集的这篇文章主要介绍verilog幂次方_verilog关于运算的那些事,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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关于运算的那些事所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部