什么是canonical signed digit(CSD)以及如何将二进制数转换为CSD并将CSD转换回二进制数?你怎么知道CSD的数字是否应该被规范地选为+
,-
或0
?
答案 0 :(得分:7)
有符号位二进制在每个2的幂位置使用三个符号:-1,0,1。表示的值是位置系数乘以相应功率2的总和,就像二进制一样,差别在于一些系数可能是-1。一个数字在这个系统中可以有多个不同的表示。
Canonical 带符号的数字表示是相同的,但受限于没有两个连续数字非0。可以看出,每个数字在CSD中都有唯一的表示。
请参阅Parhi's Bit Level Arithmetic中的幻灯片31以及更多信息,包括二进制到CSD转换算法。
答案 1 :(得分:4)
Canonical Signed Digit(CSD)是一种数字表示。 CSD演示的重要特征是:
首先,找到号码的binary演示文稿。
示例1 让我们采用例如数字287,其为二进制表示的1 0001 1111。 (256 + 16 + 8 + 4 + 2 + 1 = 287)
1 0001 1111
从右边(LSB)开始,如果在一行中找到多个非零元素(1或-1),则取所有元素加上下一个零。 (如果MSB左侧没有零,则在那里创建一个)。我们看到这个数字的第一部分是
01 1111
在数字上加1(即将0更改为1,将所有1&0更改为0' s),并强制最右边的数字为-1。
01 1111 -> 10 000-1
您可以检查数字是否仍然相同:16 + 8 + 4 + 2 + 1 = 31 = 32 +( - 1)。 现在数字看起来像这样
1 0010 000-1
由于没有更多连续的非零数字,转换完成。因此,数字287的CSD表示为1 0010 000-1,即256 + 31-1。
示例2
一个更具挑战性的例子怎么样?数字345.在二进制中,它是
1 0101 1001
找到第一个位置(从righ开始),其中一行中有多个非零数字。也拿下一个零。添加一个,并强制最右边的数字为-1。
1 0110 -1001
现在我们刚刚创建了另一对,必须进行转换。取011
,然后添加一个(获取100
),并强制最后一位为-1。 (得到10-1
)。现在数字看起来像这样
1 10-10 -1001
再做同样的事情。这一次,您将不得不想象MSB左侧的零。
10 -10-10 -1001
通过观察:1)没有连续的非零数字,您可以确保这是正确的CSD演示。 2)总和增加到325(512 - 128 - 32 - 8 + 1 = 345)。
此算法的更正式定义可在[2]中找到。
CSD也可能用于其他一些应用,但这是数字微电子学的观点。它通常用于数字乘法。 [1,2]。数字乘法包括两个阶段:计算部分产品和总结部分产品。让我们考虑1010
和1011
的乘法:
1010
x 1011
1010
1010
0000
+ 1010
= 1101110
正如我们所看到的,必须总结的非零部分乘积(1010
' s)的数量取决于乘数中非零数字的数量。因此,部分乘积之和的计算时间取决于乘法器中非零数字的数量。因此,使用CSD转换数字的数字乘法比使用传统数字数字更快。 CSD表格比二进制表示(平均)包含少33%的非零数字。例如,传统的双精度浮点乘法可能需要100.2 ns,但在使用CSD演示时仅需93.2 ns。 [1]
那么负面的呢?微电路中实际上有三种状态(电压电平)吗?不,使用负号计算的部分产品不会立即求和。相反,您将这些数字的2's complement(即否定呈现)添加到最终总和中。
来源:
[1] D. Harini Sharma,Addanki Purna Ramesh:使用Canonical Signed的浮点乘数 位
[2] Gustavo A. Ruiz,Mercedes Grand:高效的标准数字重新编码