Math 右移进位保存号码

Math 右移进位保存号码,math,vhdl,verilog,hdl,cordic,Math,Vhdl,Verilog,Hdl,Cordic,进位保存算法使用两倍的位数,一个字保存“虚拟和”,一个字保存“虚拟进位”,以避免传播进位,进位是硬件速度的限制因素 我有一个系统,需要将这些数字除以二的幂,但简单地右移两个数字并不能在所有情况下都起作用。例如,两个16位进位保存数字,你加起来生成4000,C001是虚拟和,7FFF是虚拟进位 C001 + 7FFF = 4000 (discard overflow bits) but after right shift 6000 + 3FFF = 9FFF (when it should

进位保存算法使用两倍的位数,一个字保存“虚拟和”,一个字保存“虚拟进位”,以避免传播进位,进位是硬件速度的限制因素

我有一个系统,需要将这些数字除以二的幂,但简单地右移两个数字并不能在所有情况下都起作用。例如,两个16位进位保存数字,你加起来生成4000,C001是虚拟和,7FFF是虚拟进位

C001 + 7FFF = 4000  (discard overflow bits)
but after right shift
6000 + 3FFF = 9FFF   (when it should be 2000)

简言之:如何将进位保存数除以二的幂?(保留进位保存编号)

首先,按1右移实际上是在忘记余数的情况下按2删除。但要得到准确的结果,可能还需要剩余的部分。例如,更改初始示例,将C000添加到8000,或将C002添加到7FFE。两者的总和相同,但移位值的总和是A000,而不是9FFF,这肯定更正确。所以,只有当LSB的总和可能丢失时,才能进行这种移位。在2个求和数和1位移位的情况下,这意味着其LSB中最多只能有1个求和数


第二,认为这是固定的,你有1000。一个简单的理想数学表示(A+b)/2==A/2+b/2。对于您的情况,您最初忽略的进位重0x10000,但移位1后,它重0x8000。这正是A000与您预期的2000的不同之处。因此,如果您在方法的其他方面确信,请使用逻辑AND和~0x8000==0x7FFF来完成它。

有一种技术可以纠正表示,使其可移动。这源于Tobias Noll的一篇论文“高速数字信号处理的进位保存架构”。您可以计算进位向量和和向量的新符号位,如下所示:

c'=c_out

s'=s xor c xor c_out


其中s和c是原始符号位,c_out是进位保存加法中丢弃的进位。

您能解释一下行的含义吗?c001 7fff=4000意味着什么?增加了一点。在您添加虚拟进位和虚拟保存以获取普通二进制数字的所有操作之后,我需要检查我的右手边没有丢失进位,也没有添加在左手边会被丢弃的数字。谢谢,非常感谢