今天学习VLSI(Very Large Scale Integration,超大规模集成电路)课程,其中涉及到一个波兹编码的知识点,书上(《数字集成电路:电路、系统与设计(第二版) 》)讲的不是很详细。接下来以几个乘法运算为例进行记录。
1、基础知识
1.1 原码、反码、补码
计算机中数据是由01字串组成,存储形式为补码
。原码是我们人脑最容易理解的编码。
[+1] = [00000001]原 = [00000001]反
[- 1] = [10000001]原 = [11111110]反
1.1.1 原码–>补码
如果给定一个原码,求其补码。对于正数:原码=反码=补码;
对于负数:原码是符号位(MSB)+其对应正数的原码,反码=原码符号位不变,其余位按位取反,补码=反码+1。
这么说太抽象了,我们来举个例子来说明(以8位表示,实际中的整型int是4字节-32位):
整数 | 原码 | 反码 | 补码 |
---|---|---|---|
13 | 0000 1101 | 0000 1101 | 0000 1101 |
23 | 0001 0111 | 0001 0111 | 0001 0111 |
-23 | 1001 0111 | 1110 1000 | 1110 1001 |
1.1.2 补码–>原码
同理,给定一个补码,求其原码(整数):对于正数:原码=反码=补码;
对于负数:有两种方式,第一种是1.1.1原码–>补码的逆过程(不推荐),反码=补码-1,原码=反码符号位不变,其余位按位取反;第二种是补码的符号位保持不变,其余位按位取反,加1得到原码。
以第二种为例:
补码 | Temp | 原码 | 整数 |
---|---|---|---|
0001 1010 | ~ | 0001 1010 | 26 |
1111 1000 | 1000 0111 | 1000 1000 | -8 |
1110 1001 | 1001 0110 | 1001 0111 | -23 |
其余不多讲,请自行baidu。
1.2 改进的波兹编码
该算法建立在波兹编码之上,算法通过减少部分积的产生,加快乘法器的速度。
对于X*Y,首先将Y进行扩展,最高位(MSB)增补两位符号位(如果是unsigned,则补充两位0),最低位(LSB)增补一位0,即 y − 1 = 0 y_{-1}=0 y−1