让心去旅行!

Verilog HDL无符号数和有符号数

上一篇 / 下一篇  2006-09-08 09:36:37 / 天气: 晴朗 / 心情: 高兴

算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。无符号数存储在:EDA中国门户网站oQqIM#n"M.G2X7I
* 线网
N.F y~x5r0* 一般寄存器EDA中国门户网站%L Z]'e*FAF$G
* 基数格式表示形式的整数
)@!zP|6O!Z_v0  有符号数存储在:EDA中国门户网站.IW.A AWP
* 整数寄存器
Gq7ax6c6ce'h B0* 十进制形式的整数
$n#]1m,Fu*q7ZI9P0  下面是一些赋值语句的实例:
b5u8U_E:|u[0EDA中国门户网站{t/QDtGn
reg [0:5] Bar;EDA中国门户网站AB a8WO)V
integer Tab;EDA中国门户网站V~}-c3h _U0Ud
. . .EDA中国门户网站;?N?^9T}$^Q
Bar = -4'd12; //寄存器变量Bar的十进制数为52,向量值为110100。EDA中国门户网站RI*B[V0Ba6h:O
Tab = -4'd12; //整数Tab的十进制数为-12,位形式为110100。
P L a q.Iyt1M#E0EDA中国门户网站B8C W&X~3r6P
-4'd12 / 4 //结果是1073741821。
g-ET"\2j!?k`0-12 / 4 //结果是-3
!}2_+|(V}YV7iz0EDA中国门户网站9Y!s @6x3NM
  因为Bar是普通寄存器类型变量,只存储无符号数。右端表达式的值为'b110100(12的二进制补码)。因此在赋值后,Bar存储十进制值52。在第二个赋值中,右端表达式相同,值为'b110100,但此时被赋值为存储有符号数的整数寄存器。Tab存储十进制值-12(位向量为110100)。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为无符号数,而在第二种情况下,向量被解释为有符号数。
vU M#V&htTZ0  下面为具体实例:EDA中国门户网站g9y%PT\nsm;X i
EDA中国门户网站'Y yV.v#aw
Bar = - 4'd12/4;EDA中国门户网站p+X"|%pm0U7o
Tab = - 4'd12 /4;EDA中国门户网站;\@2b$QO j2v
EDA中国门户网站~(r ]1bw|4k(d^&w)?
Bar = - 12/4
5aq a-b6^5Z0Tab = - 12/4
BjJ0G g1ZM0EDA中国门户网站t%{7o B,Syj
  在第一次赋值中,Bar被赋于十进制值61(位向量为111101)。而在第二个赋值中,Tab被赋于与十进制1073741821(位值为0011...11101)。Bar在第三个赋值中赋于与第一个赋值相同的值。这是因为Bar只存储无符号数。在第四个赋值中,Bar被赋于十进制值-3。
M,e5} iw?V0z0  下面是另一些例子:
#e mM7?4BMO0EDA中国门户网站%qs'Ym _
Bar = 4 - 6;EDA中国门户网站;mC'F&d` x+i)M7]
Tab = 4 - 6;EDA中国门户网站Cq5S6uq
Bar被赋于十进制值62(-2的二进制补码),而Tab被赋于十进制值-2(位向量为111110)。EDA中国门户网站 c#|(k:IjJP/i
EDA中国门户网站6@'xud"h\a
  下面为另一个实例:
R/q E5s#`S-PJv0EDA中国门户网站7t%`(b~\!q k
Bar = -2 + (-4);EDA中国门户网站5Y7`)G#yi8f1[ @-}
Tab = -2 + (-4);
J?t y@Y!t.BJ \0Bar被赋于十进制值58(位向量为111010),而Tab被赋于十进制值-6(位向量为111010)。
FPGA/CPLD器件价格查询

TAG:

Jiang_online 引用 删除 surpass3000   /   2006-09-12 14:47:32
楼上说得很好,看来也相当的有研究
xiaomei2的温馨之家 引用 删除 xiaomei2   /   2006-09-11 22:45:05
看来surpass3000不爱回答别人的问题呀,我来回答吧,integer是可以被综合,但是只要引用就要占去32位宽。所以,verilog2001对此作了修正,引入了signed关键字,从而可以用reg来存储有符号数了,那么就方便多了,哈哈。
tangwenming的个人空间 引用 删除 tangwenming   /   2006-09-11 13:42:33
-4位宽应该是4位啊 怎么变成六位了?
hwei的个人空间 引用 删除 hwei   /   2006-09-09 23:41:52
5
对于楼主我有一个疑问:
是不是将数据定义成interger就能够存储有符号数,那么这个有符号数是不是可以进行数据大小的比较,比方说:
interger a  = -4'd3;
interger b = 4'd2;
此时如果有一段代码为:
if(a > b)
    c <= 1'b1;
else
    c <= 1'b0;
这个时候c会是0还是1呢?
我想问这个问题是想说,-4'd3的2进制数为1101,4'd2的2进制数为0010,因此在无符号数情况下做大小比较的时候会判断-4'd3大于4'd2,而这与有符号数是相违背的。
如果定义成为interger以后是否可以避免上面的情况发生呢?
还有interger是否可以被综合呢?
谢谢指导!
hwei的个人空间 引用 删除 hwei   /   2006-09-09 23:31:38
to楼上:
bar = -4'd12中的‘-4’不是一个整体,实际上‘-4'd12’表示-12这个数,即如果要表示一个负数的时候不能用4'd-12,而是应该将‘-’放在最前面。
xiaomei2的温馨之家 引用 删除 xiaomei2   /   2006-09-08 17:02:47
3
赞!但是有些地方不明白:
1、bar = -4'd12中的‘-4’表示什么意思呀?
2、01语法中,提出了signed关键字,普通的寄存  器也可以存储有符号数了,是不是就不用这么留心了?
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-21  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 14544
  • 日志数: 106
  • 图片数: 9
  • 文件数: 4
  • 建立时间: 2006-05-07
  • 更新时间: 2008-06-17

RSS订阅

Open Toolbar