verilog有符号扩展 无符号扩展

当把一个低精度的数据类型转成一个高精度的数据类型时,必然会涉及到如何扩展位数的问题。这里有两种解决方案:

  1. 补零扩展:填充一定位数的0。
  2. 补符号位扩展:填充一定位数的符号位(非负数填充0,负数填充1)。

对于无符号类型(相当于都是非负数)与有符号类型中的非负数部分,这两种方法没有区别,都是填充0;

对于有符号类型中的负数部分,这两种方法就会产生差异了,补零扩展会填充0,而补符号位扩展会填充1。

 

例如十进制的127,二进制原码为0111 1111,计算机中都是以补码的形式存储的,即:0111 1111

如果补零,即:0000 0000 0111 1111,看成补码,对应十进制为127;看成二进制,对应十进制为127

如果补符号位,即:0000 0000 0111 1111,看成补码,对应十进制为127;看成二进制,对应十进制为127

 

十进制-127,二进制原码为1111 1111,反码为1000 0000,补码为1000 0001

如果补零,即:0000 0000 1000 0001,看成补码,对应十进制为-127;看成二进制,对应十进制为129

如果补符号位,即:1111 1111 1000 0001,看成补码,对应十进制为-127;看成二进制,对应十进制为65409

 

我们可以发现规律:

  1. 计算机内部都是以补码的形式存储的,如果人类想读懂,都需要转换为原码才可以。
  2. 为什么要用补码来存数?请看:补码的来历,补码的优势

 

verilog表示有符号数和无符号数的位扩展

// inst_i是一个16位数字

// 无符号扩展,高16位补0:
imm <= {16'h0, inst_i[15:0]};

// 有符号扩展,高16位补符号位:
imm <= {{16{inst_i[15]}}, inst_i[15:0]};

 


参考文献:FPGA verilog 有符号数和无符号数运算的位扩展 FPGA – 最大最专业的FPGA论坛 (hifpga.com)

作者: 高志远

高志远,24岁,男生

发表评论

邮箱地址不会被公开。