Verilog HDL无符号数和有符号数运算(转)
来源:互联网 发布:安卓手机还原网络设置 编辑:程序博客网 时间:2024/06/05 00:32
转自:http://forum.eepw.com.cn/thread/180303/1
今天要用Verilog建立一个器件的行为模型,涉及到有符号数的加减和乘法运算,因此查阅了些相关资料,觉得不错,转载于此。
执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。无符号数存储在:
* 线网
* 一般寄存器
* 基数格式表示形式的整数
有符号数存储在:
* 整数寄存器
* 十进制形式的整数
下面是一些赋值语句的实例:
reg [0:5] Bar;
integer Tab;
. . .
Bar = -4'd12; //寄存器变量Bar的十进制数为52,向量值为110100。
Tab = -4'd12; //整数Tab的十进制数为-12,位形式为110100。
-4'd12 / 4 //结果是1073741821。
-12 / 4 //结果是-3
因为Bar是普通寄存器类型变量,只存储无符号数。右端表达式的值为'b110100(12的二进制补码)。因此在赋值后,Bar存储十进制值52。在第二个赋值中,右端表达式相同,值为'b110100,但此时被赋值为存储有符号数的整数寄存器。Tab存储十进制值-12(位向量为110100)。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为无符号数,而在第二种情况下,向量被解释为有符号数。
下面是另一些例子:
Bar = 4 - 6;
Tab = 4 - 6;
Bar被赋于十进制值62(-2的二进制补码),而Tab被赋于十进制值-2(位向量为111110)。
因为VERILOG对reg跟wire型变量的乘法(*)都默认为无符号数相乘,所以不能直接用*号来表示。我是这样处理的:先把两个操作数变为源码,再用FOR循环进行移位相加,结果是对的,但是综合出来的结果占有的资源比较多,比直接调用QUARTUS库里的乘法器占用资源多百分之二十左右。
如果你用verilog2001,可以直接声明有符号数,做有符号数乘法,你再用synplify综合一下看看资源如何。
module multiplier_8by8 (a, b, product);
input signed [7:0] a, b;
output signed [15:0] product;
assign product = a * b;
endmodule
- Verilog HDL无符号数和有符号数运算
- Verilog HDL无符号数和有符号数运算(转)
- 有符号和无符号数运算
- verilog数值计算-有符号数和无符号数
- Verilog有符号数运算
- 【讨论】有符号数和无符号数运算效率
- 有符号数和无符号数的运算
- verilog中的有符号数运算(转)
- 有符号/无符号数混合运算
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 无符号数和有符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 12.13
- ※设计模式※→☆创建型模式☆============Abstract Factory模式(四)
- <a> 标签的target属性的介绍
- 关于 OGRE 与 OSG 的简略比较(转自www.MyException.Cn )
- Android中缩放图片的一个方法
- Verilog HDL无符号数和有符号数运算(转)
- 设计模式之工厂方法
- 一些开源代码网站介绍(持续添加中....)
- JDBC
- 操作系统中睡眠、阻塞、挂起的区别形象解释
- Non-transient non-serializable instance field in serializable class sonar
- UVALive 3938 "Ray, Pass me the dishes!"
- MySQL索引与高性能SQL介绍
- weblogic服务器:报BEA-000337警告