1

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

4

1 回答 1

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!

当我们谈论有符号数时,您要确保设置了最高有效位(并且不关心任何其他结果),或者更确切地说消除低进位符号位影响结果的可能性。

当您添加两个数字时,它们的唯一可能会比它们的值更高一点,其中一个是它们在单个位上设置了多个位。因此,一旦您发现两个位都为零的情况,您可以确定您将有一个正数(而不是推翻数)。

符号算法将回答“进位和符号数的低位总和是否会改变我现在正在查看的位?”的问题。

当在一个位置设置两个位时会发生这种情况,当进位和符号位都为 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.
于 2014-01-04T21:51:13.767 回答