数字电路【常见编码规则】

  1. 为了用二进制表示十进制,早期有几种编码方式,这些编码方式是补码出现常用的处理二进制和十进制关系的编码方式,

由于十进制一共有0 ~ 9十个数,这几种编码方式都需要4bit,

8421码,这是最简单直接的编码方式,它为每一位bit i附上了2^(i-1)的权值(1 <= i <= 4),使用这种方式可以很直观地将二进制转换为十进制,

反之也可以较为容易地从十进制获得对应的二进制编码,

但8421的减法较为麻烦,根据之前的学习我们知道为了绕开减法电路可以用模余-补数的方式把减法巧妙地换成加法,这对十进制也是同样的,

因此在十进制中我们对于任意的数N,它的补数一定是 10 - N,因此A - B可以转换成A + (10 - B)mod 10,或者A + (10 - B) - 10,

于是相同的问题出现:如何计算10 - B?并且由于我们用的是4bit二进制表现,10在模16的二进制中不会像补码那样可以由某一高位置1来表示,

因此同样导致模10的计算不方便,

考虑之前求补码是通过先求反码的方式实现从而绕开了2 ^ n + N (N < 0)的计算,这里同样考虑用反码,那么4bit计算反码就是15 - N,

为了找到10 - N在4bit中的表示,很显然 (15 - N + 11) mod 16 ≡ (10 - N) mod 16,

所以我们可以通过对一个数取反再加上8421的11的方式并对16取模即去除二进制结果的第5个比特得到N对于10的补数,

比如,求6的补数,15 - 6 + 11 = 20,取模16得到结果为4,恰好是6对于模10的补数,

二进制层面,BCD(6) = 0110,按位取反1001,BCD(11) = 1011,1001 + 1011 = 1 0100,模16结果为0100恰好为4,

接着计算A + (10 - B) - 10 mod 16,同样,为了绕开减法,由于-10和6模16同余,这一计算可以转变为A + (10 - B) + 6 mod 16,

这样8421码的减法就被转换为了A + (15 - B + 11) + 6 mod 16,15 - N等于对N按位取反,

我们计算8 - 3,首先3对于10的补数应该是7,由之前的讨论,0011按位取反得到1100,加上1011得到1 0111,模16得到0111 = 7

接着8 - 3就转换为8 + 7 + 6mod16 ≡ 5,显然8 - 3 = 5,进一步转换为8421码,

1000 + 0111 + 0110 = 1 0101,模16得到0101 = BCD(5),

余3码只是在原有的8421码基础上为每个码加3,这样E(A) = A + 3,

考虑余3码的减法,相似的会有E(A) - E(B) = E(A) + E(10 - B) = A + 3 + 10 - B + 3 = A - B + 16 mod 16,

那么当A - B >= 0时,上述结果恰好等于A - B,但为了获得结果对应的余3码,我们还需要加上3,于是E(A-B) = A - B + 3,

所以余3码减法计算需要对结果+3修正得到正确结果,

观察余3码的码型会发现,对于一个E(N),它的反码恰好是N对10的补数,所以有E(9 - N) = E(N)反 = 15 - N,又E(10 - N) = E(9 - N) + 1,

所以十进制余3码的补码计算可以通过先计算对9的补码然后+1得到,而N对9的补码就是N的反码,

我们同样计算8 - 3 = 5,

首先带入余3码模16的计算 8 + 3 + 10 - 3 + 3 mod 16结果是5,

换为余3码,E(3) = 0110,取反得E(6) = 1001,再加一得到E(7) = 1010,

1011 + 1010 = 1 0101,模16得到0101 = E(2),再加上3校准就得到0101 + 0011 = 1000 = E(5),

这里简单记录了我对余3码和8421码的思考,过程中我发现:这些早期的编码方式通常涉及到不同进制之间的计算,流程相较于补码较为复杂,

剩下的还有

2421码,这种编码方式为每一位赋权,属于定权码,但是由于两个bit为权值为2导致需要预先约定一些数字的表示,否则存在二义性,

5211码,这种编码方式是8421加法器四个触发器输出的脉冲分频为5:2:1:1,但我对这方面不了解,

余3循环码,这种编码方式来源于格雷码和余3码,并且结合了二者的优点。

  1. 格雷码

格雷码是一种为了消除电平变化时可能出现的噪声而诞生的一种编码方式,它的特点是相邻的两个码间只有一个bit不同,这意味着数字变换时每次只有1个bit跳变,

格雷码的生成方式是:

1 从全0开始(如0000),

2 对最右侧一位取反,

3 对最右侧的1的左侧1位取反,

4 重复2,3直到获取所需的所有格雷码。

posted @ 2026-08-13 14:40  lf123z  阅读(0)  评论(0)    收藏  举报