verilog signed to unsigned offset binary
verilog signed to unsigned offset binary
背景
有符号数据的最高bit 是 符号位,通常有符号数据都用补码来表示。补码就是该数绝对值的原码取反 再加1 得到,取补码的原因是为了把减法操作变成加法操作,便于电路实现。
但是在HDL语言中处理有符号数据比较麻烦,HDL更习惯于无符号数据,无符号数据的补码就是其原码,不需要任何转换。因此在需要做有符号数计算的时候,通常会把有符号数转换到无符号数,计算完成之后再转换到有符号数据。这样就可以避免对补码进行操作。
- 有些时候,也可以直接声明参与计算的数据为有符号数据,但是这种场景通常比较受限,且在扩展位宽时不好处理。 01signal: Signed arithmetics in Verilog: The only rule one needs to know
转换方法
原理
比如对8bit 数据来说,有符号数据的范围是-128 - 127,无符号数据的表示范围为0-255,实际上就是多了128的偏移,因此可以将有符号数整体偏移后 参与后续处理,其数据范围并没有改变。在后续DSP处理完成之后再转换到有符号数据即可。
有符号数转无符号数 offset binary
下面是8bit数据的转换,整体加上8‘h80 即可实现转换。比如8’h80 + 8’h80 = 8’h00,其中产生的进位由于位数原因会自动丢弃。
assign id_unsigned = id_signed + 8'h80;//二进制补码转换到 offset binary convert
十进制 | 补码 | 转换后 |
---|---|---|
-128 | 8’h80 | 8’h00 |
-127 | 8’h81 | 8’h01 |
-126 | 8’h82 | 8’h02 |
0 | 8’h00 | 8’h80 |
126 | 8’h7e | 8’hfe |
127 | 8’h7f | 8’hff |
offset binary 无符号数转有符号数
与上述转换相反,整体减去8‘h80 即可实现转换。为了避免减法的出现,我们可以做如下操作
assign id_signed = id_unsigned<8'h80 ?(id_unsigned + 8'h80) : id_unsigned[7:0] ;//offset binary convert to 二进制补码
进行上述操作后,符号位就被轻松做了化解,这在ADC/DAC等数据处理应用中十分有用。