verilog signed to unsigned offset binary

verilog signed to unsigned offset binary

背景

有符号数据的最高bit 是 符号位,通常有符号数据都用补码来表示。补码就是该数绝对值的原码取反 再加1 得到,取补码的原因是为了把减法操作变成加法操作,便于电路实现。

但是在HDL语言中处理有符号数据比较麻烦,HDL更习惯于无符号数据,无符号数据的补码就是其原码,不需要任何转换。因此在需要做有符号数计算的时候,通常会把有符号数转换到无符号数,计算完成之后再转换到有符号数据。这样就可以避免对补码进行操作。

转换方法

原理

比如对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等数据处理应用中十分有用。

posted @ 2024-08-06 09:30  Hello-FPGA  阅读(51)  评论(0编辑  收藏  举报