有符号数累加器的分段设计
时间:10-02
整理:3721RD
点击:
最近在设计一个21bits的有符号累加器,输入数据是7bits有符号数,累加个数暂定为8192.
为了节省功耗,将累加器分成了3个7bits寄存器{acc_2, acc_1, acc0}.
acc_0负责与输入的7bits数据相加,如果溢出则acc_1 ± 1. 以此类推。
这样设计可以让高位累加器 acc_2,acc_1减少翻转,达到降低功耗的目的。
当前有问题的地方在,如何正确有效地给acc_1传递 ±1的信息。
不同于无符号数,有符号数这里不好处理,往高手能给予帮助。多谢!
为了节省功耗,将累加器分成了3个7bits寄存器{acc_2, acc_1, acc0}.
acc_0负责与输入的7bits数据相加,如果溢出则acc_1 ± 1. 以此类推。
这样设计可以让高位累加器 acc_2,acc_1减少翻转,达到降低功耗的目的。
当前有问题的地方在,如何正确有效地给acc_1传递 ±1的信息。
不同于无符号数,有符号数这里不好处理,往高手能给予帮助。多谢!
这要看数如何表示了。如果输入的数din,和累加器的数都用补码表示,可以这样处理:
1. 如果din的b6为0(非负)。若 acc_0+din, 的进位为1, 则{acc_2,acc_1}+1; 若进位为0,不管acc21。
2. 如果din的b6为1(负数)。若 acc_0+din, 的进位为0, 则{acc_2,acc_1} -1; 若进位为1,不管acc21。
第1点好理解。
第2点的解释如下: 若din是负数,则可表示为分段的21位数 7f_7f_din. 运算时acc0+din,acc21+7f_7f+进位. 若acc_0+din的进位为1,可先运算7f_7f+1 == 00_00(最高位丢弃), 则不管acc21。若进位为0, acc21最终要加7f_7f,也就是减1.
你可以编一个C语言程序来验证。
你这种方法也是可以的。多谢帮助。
我后来仔细想了想,直接把输入din转成原码计算,符号位作为加/减判断。进/借位往上传递,加/减则同时给3个累加器。
这样,3个累加器级联出来的结果直接就是补码了。
