Verilog 计算进位保存号码的符号

Verilog 计算进位保存号码的符号,verilog,sign,system-verilog,carryflag,Verilog,Sign,System Verilog,Carryflag,是否有人知道如何计算进位保存格式中的数字符号,即使用虚拟和和和虚拟进位,而不将它们相加? 一个verilog示例将是理想的。 谢谢 未签名版本: 比较两个数字(我的热身): 当然,您必须遍历一些数字,但只需从最高有效位开始(我假设我们讨论的是无符号数字)。该算法是一种进位保存算法,但向后: 例如: 0001111010101 = the number to compare with 0000211002000 = the carry save number 自上而下 0 = 0 0 = 0 0

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

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

当然,您必须遍历一些数字,但只需从最高有效位开始(我假设我们讨论的是无符号数字)。该算法是一种进位保存算法,但向后:

例如:

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!
将被视为: 符号位已设置。下面的6位具有正的异或。第五位(从左起)均已设置。标志将改变。(如果最低有效位不同,它能再次改变吗?是的,只要异或链给出1)

此处未设置符号位。以下三位表示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.

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

当然,您必须遍历一些数字,但只需从最高有效位开始(我假设我们讨论的是无符号数字)。该算法是一种进位保存算法,但向后:

例如:

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!
将被视为: 符号位已设置。下面的6位具有正的异或。第五位(从左起)均已设置。标志将改变。(如果最低有效位不同,它能再次改变吗?是的,只要异或链给出1)

此处未设置符号位。以下三位表示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.

From:“我们仍然不知道加法的结果是大于还是小于给定的数字(例如,我们不知道它是正的还是负的)。”换句话说,您仍然需要一个将虚拟和与进位相结合的全长涟波进位加法器。为了获得更好的解决方案,我们必须更多地了解上下文。例如,在同一篇维基百科文章中提出的“蒙哥马利乘法”可能表现更好,但仅在特定情况下。一些细节如何?From:“我们仍然不知道加法的结果是否大于或小于给定的数字(例如,我们不知道它是正的还是负的)。”换句话说,您仍然需要一个结合虚拟和和和进位的全长涟波进位加法器。为了获得更好的解决方案,我们必须更多地了解上下文。例如,在同一篇维基百科文章中提出的“蒙哥马利乘法”可能表现更好,但仅在特定情况下。一些细节如何?你的第一次计算是错误的;在第4位和第5位,二进制中的11不等于进位保存中的02。您可以通过将这两个数字转换为十进制来判断:000111010101=981,000021102000=720;进位保存号较小。至于符号的算法,我想这对于串行二进制加法器来说是个不错的主意。在常规(并行)加法器中,没有循环;你必须时刻记住最坏的情况。这仍然需要你经历所有的细节;就像一个(相对较慢的)纹波进位加法器一样。感谢你指出我进位符号数字中的错误,我将尝试了解它们如何更好地工作。关于串行加法器,您是正确的,但如果您只有1位符号+(log2 n位)计数器,则最坏的情况更快。最坏的情况只会发生在正好有n个比特集的分布中,即2^(2*n)个组合中的2^n个组合。所有其他组合将提前终止。最坏的情况发生在1/2^n的情况下,平均值(给定完全随机数)远小于此值,准确地说,每一步终止的概率为25%。Verilog不是普通的CPU,每一位都计数。(假设数字是完全随机的,这有点乐观——如果它们是对数分布,算法的终止不是每一步25%,而是每一步增加)。但仔细想想,随机数终止的几率只有25%,随机分布位的潜在节省比我第一次评论中的要少。你的第一次计算是错误的;在第4位和第5位,二进制中的11不等于进位保存中的02。您可以通过将这两个数字转换为十进制来判断:000111010101=981,000021102000=720;进位保存号较小。至于符号的算法,我想这对于串行二进制加法器来说是个不错的主意。在常规(并行)加法器中,没有循环;你必须时刻记住最坏的情况。这仍然需要你经历所有的细节;就像一个(相对较慢的)纹波进位加法器一样。感谢你指出我进位符号数字中的错误,我将尝试了解它们如何更好地工作。关于串行加法器,您是正确的,但如果您只有1位符号+(log2 n位)计数器,则最坏的情况更快。最坏的情况只会发生在正好有n个比特集的分布中,即2^(2*n)个组合中的2^n个组合。所有其他组合将提前终止。最坏的情况发生在1/2^n的情况下,平均值(给定完全随机数)远小于此值,准确地说,每一步终止的概率为25%。Verilog不是普通的CPU,每一位都计数。(假设数字是完全随机的,这有点乐观——如果它们是对数分布,算法的终止不是每一步25%,而是每一步增加)。但仔细想想,随机数终止的几率只有25%,随机分布位的潜在节省比我第一次评论中的要少。