导读 | Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。因此,在简化硬件设计任务、提高设计效率与可靠性、语言易读性、层次化和结构化设计等方面展现了强大的生命力与潜力。 |
本节主要对有符号数的十进制与二进制表示以及一些数值变换进行简单的总结。
定义一个宽度为 DW 的二进制补码格式的数据 dbin ,其表示的有符号十进制数字为 ddec 。
reg [DW-1:0] dbin ;
正数的补码为原码。
假如十进制数 ddec 为负数,则计算其对应的二进制补码的方法主要有 2 种:
将ddec 最高位符号位改写为 1,剩余数值部分取反加一
例如,4bit 数字 -6 的数值部分为 4’b0110,取反加一后为 4’b0010,高位改写后为 4’b1010。
dbin = {1'b1, ~3'b110 + 3'b1} ; //4'b1010
将负数 ddec 直接与其代表的最大数值范围数相加(有人称之为模数)
例如,4bit 数字 -6 与 16(2 的 4 次幂)的和为 10, 即对应 4’b1010。
dbin = ddec + (1<<4) ; //4'b1010
当 dbin 最高位为 0 时,其数值大小即为其表示的十进制正数。
当 dbin 最高位为 1 时,计算其表示的十进制有符号数方法主要有 2 种:
将 dbin 取反加一,并增加符号位
例如,4bit 数字 -6 的补码为 4'b1010,取反加一后为 4'b0110,增加符号位后为 -6。
ddec = -(~4'b1010 + 1'b1) ; //-6
将 dbin 代表的无符号数值与其代表的最大数值范围数直接相减
例如,4bit 数字 -6 的补码为 4'b1010,即无符号数值为 10,10 减 16 便可得到 -6 。
ddec = dbin - (1<<4) ; //-6
求 dbin 的绝对值逻辑如下:
dbin_abs = (dbin[DW-1]? ~dbin : dbin) + 1'b1 ;
例如,4bit 数字 -6 的补码为 4'b1010,取反加 1 后的值为 4'b0110(6),即为 -6 的绝对值。
但如果 dbin 为正数,加 1 后的值比其真正的绝对值要大 1,此步操作只是为了让正数部分的绝对值数量与负数部分一致。因为一定位宽下,由于 0 值的存在,有符号数表示的负数数量会比正数多 1 个。
将有符号数扩展成为无符号数的逻辑如下:
dbin_unsigned = {!dbin[DW-1], dbin[DW-2:0]) ;
例如:
4'b1010 (-6) -> 4'b0010 (2),4'b0010 (2) -> 4'b1010 (10)
其实转换原则是将数据代表的数值范围移动到 0 以上,有符号数转换成无符号数之后,数据相对间的差并没有改变。
计算时有时会根据需要对有符号数位宽进行扩展。假设位宽增量为 W,扩展逻辑如下:
dbin_extend = {{(W){dbin[DW-1]}}, dbin} ;
扩展原则就是将信号代表符号位的最高位,填充至扩展的高位数据位中。
例如 4'b1010 (-6) 扩展到 8bit 为 8'b11111010,计算其对应的负数仍然是 -6。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/124787.html