计算进位保存号码的符号

时间:2013-12-27 15:12:49

标签: verilog sign system-verilog carryflag

有没有人知道如何计算进位保存格式中数字的符号,即使用虚拟总和和虚拟进位,而不将它们加在一起? 一个verilog的例子是理想的。 谢谢!

1 个答案:

答案 0 :(得分:4)

未签名版本 比较两个数字(我的热身):

当然你必须经历一些数字,但只是从最重要的位开始(我假设我们谈论无符号数)。该算法是一种进位保存算法,但是向后:

一个例子:

0001111010101 = the number to compare with
0000211002000 = the carry save number

从顶部开始

0 = 0
0 = 0
0 = 0
1 > 0   - ops! keep the compare-number
0 = 2 - phew! (02 = 10)
1 = 1 
1 = 1 
0 = 0 
0 = 0
1 < 2 :: aha! Carry save number wins!

当我们谈论有符号数时,你想确保设置最高有效位(并且不关心任何其他结果),或者更确切地说消除了较低进位符号位对结果的影响。< / p>

当你添加两个数字时,他们改变比他们更高的唯一可能性是其中一个是他们在一个位上设置了多个位。因此,只要您发现两个位均为零的事件,您就可以确定您将获得正数(而不是推翻数字)。

符号的算法将回答这样一个问题:“低位的总和是否可以改变进位和符号数字会改变我现在正在看的位?”

当在一个位置设置两个位时会发生这种情况,并且当进位和符号位都为0时算法可以终止:

       Sign bit
       v
Carry: 100010010000
Sign : 011101110000

将被视为: 符号位已设置。下面的6位具有正XOR。第五位(左起)都设置好了。标志会改变。 (如果最低有效位不同,它会再次改变吗?是的,只要XOR链给出1)。

       Sign bit
       v
Carry: 000001111111
Sign : 011101111111

此处未设置符号位。以下三位给出XOR = 1,继续。左起八位都是零。符号位无法更改。

因此,粗略的逻辑门实现将是:

THESIGN = false

loop through the numbers SIGNBIT, CARRYBIT from highest (sign) bits downwards:
    when  XOR(SIGNBIT, CARRYBIT) = 1, continue
    when  AND(SIGNBIT, CARRYBIT) = 1, flip THESIGN bit, continue
    when NAND(SIGNBIT, CARRYBIT) = 1, stop the evaluation, return THESIGN.