自学内容网 自学内容网

Verilog中的有符号数与无符号数

1. 有符号与无符号最本质的区别在于高位扩展时的扩展规则不同;

对于同一个4‘b1001进行位扩展成8位:

有符号扩展结果为:8’b11111001

无符合扩展结果为:  8'b00001001

2. 同第一点,若在运算中没有涉及位扩展,则有符号与无符号的运算没有啥区别;

例如计算 2’b1001 + 2‘b0010, 在硬件的计算逻辑无论这两个数据是有符号数还是无符号数,还是一个是有符号数,一个是无符号数,硬件上得到的结果都是2’b1011,区别的是后面是用有符号数规则使用这个数据,还是使用无符号数使用该数据;

3. 从人的角度上看,去读取一个有符号和无符号的规则不同;

   例如数据4‘b1011,用无符号数规则读取就是11,用有符号读取就是-5;

4. 工具计算的判定逻辑;
   1. 有符号数与有符号的运算,结果为有符号数;
      1.   a[4:0] = signed(4'b1001) + signed(4'b0001) ,则a[5:0] = {1'b1,4'b1010},的有符号数,最高位为符号位扩展;
   2. 有符号数与无符号数的运算,结果为无符号数;
      1.   a[4:0] = signed(4'b1001) + unsigned(4'b0001) ,则a[5:0] = {1'b0,4'b1010}的无符号数,最高位直接扩0;
   3. 无符号与无符号的运算,结果为无符号数;
      1. a[4:0] = signed(4'b1001) + unsigned(4'b0001) ,则a[5:0] = {1'b0,4'b1010}的无符号数,最高位直接扩0;
   4. 运算结果通过$signed 或 $unsigned 指定时,以该指定为准,但等式左边的指定不影响等式右边的运算。
      1. unsigned(a[4:0]) = signed(4'b1001) + signed(4'b0001) ,则a[4:0] = {1'b1,4'b1010},的无符号数,最高位为符号位扩展;本来等式右边算出的值{1'b1,4'b1010}赋给无符号数a[5:0];
      2. signed(a[4:0]) = signed(4'b1001) + unsigned(4'b0001) ,则a[5:0] = {1'b0,4'b1010}的有符号数。将等式右边的计算结果{1'b0,4'b1010}作为有符号数赋值给a[4:0];


原文地址:https://blog.csdn.net/weixin_45857247/article/details/143695310

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!