**这是本文档旧的修订版!**

码制

1.数字系统

用数字信号完成对数字量进行算术运算和逻辑运算的电路称为数字电路,或数字系统。由于它具有逻辑运算和逻辑处理功能,所以又称数字逻辑电路。人类已经进入到了数字时代,数字系统在我们日常生活中愈发重要,并广泛应用于通信、商贸、交通控制、航空航天、医疗、天气检测、互联网等等重要领域。人们从而拥有了数字电话、数字电视、数字通用光盘、数字相机等等数字化设备。数字系统的一个特性是其通用性,它可以执行一系列的指令,对给定程序进行操作和处理;它的另一特性是具备描述和处理离散信息的能力,我们知道,任何一个取值数目有限的元素集都包含着离散信息,如十进制的各个数、字母表的26个字母等等。数字系统中的离散信息可由“信号”进行表示,最常见的信号就是电压和电流,它们一般由晶体管构成的电路产生。目前,在各种数字电子系统中的电信号只有两种离散值,因而也被称为二进制。

数字设计方法发展的主要趋势是采用硬件描述语言(HDL)描述和模拟数字电路的功能,HDL类似于编程语言,非常适合于以文本的形式描述数字电路。利用HDL可以在硬件电路建立之前模拟和验证数字系统的功能。HDL也可以和逻辑工具一起,用于数字系统的自动设计过程。因此,熟悉一种硬件描述语言并掌握基于硬件描述语言的设计方法是十分重要的。

综上所述,数字系统处理二进制形式表示的离散信息值。用于计算的操作数可以表示成二进制数的形式。其它离散元素,包括十进制数和字母表中字母也可以利用二进制码来表示。在下一小节,我们会着重向大家介绍二进制码。

2.二进制数

在数学和数字电路中,二进制(binary)数是指用二进制记数系统,即以2为基数的记数系统表示的数字。这一系统中,数通常用两个不同的符号0(代表零)和1(代表一)来表示。以2为基数代表系统是二进位制的。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(二进制位)。
那么,二进制与其它进制是什么关系呢? 其实很简单,举个例子,十进制数234,234等于2个百加上3个十加上4个一,可以写为: 然而,按照惯例,幂次从左到右递增,带小数点的十进制数即可表示为(此处例子为10位数): 如果,十进制的数为234,那么a2=2,a1=3,a0=4; 读到这里,相信您也能领会10进制的系数与位数的对应关系与计算方法,那么二进制如何计算呢? 由于十进制只能使用是个数字,每个系数均要与10的幂次相乘,因此,十进制的基数为10。二进制与十进制是不同的数制,其系数只有两种取值“0”和“1”,所以,每个系数都要乘以基数的幂,结果相加后就是10进制数,举个例子,二进制数11010.11相对应的十进制数如何计算呢? 如果这里明白了,我们继续向下推倒,假设我们推广到以r为基数的任何进制呢?我们可推倒出如下公式: 这个公式看起来复杂,但实际使用起来十分简单:举个例子,8进制数127.4,我们把它转化为10进制: 当基数小于10时,我们到对应位数进位即可,例如8进制,我们逢8进位,10进制就是逢10进位,那么16进制我们如何进行处理呢?请参照下表: 由表中可知,字母A~F分别被用来表示10、11···15这六个数字。例如,某个16进制数为:

3.数制的转换

在上一小节,主要阐述了任意进制转变为10进制的方法,那么,我们如何将10进制的数转化为其它进制的数呢? 举个例子,我们将十进制数19转化为二进制数。
首先,我们把19除以2得到整数商9和余数1,将得到的商(9)再继续除以2,得到新的商4和余数1,再用商(4)除以2,得到商2与余数0,如此反复,我们可以得到: 其它进制的转化,我们将除数换为对应进制数即可。

4.八进制和十六位进制数

二进制数在使用中往往在使用过程中会不太方便,与十进制数相比,二进制数的有效数字是10进制的3-4倍,例如,二进制数1111111111111111等于10进制的65535,等于16进制的FFFF。因此,大多数技术手册与参考文档中8进制与16进制使用的更多,从普遍情况来看,目前使用率最高的数制为16进制(除10进制外),下表给出了各进制之间的对应关系:

5.补码

计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

5.1 反码

对于十进制数:十进制数的反码是用9减去其每一个数字,如: 对于二进制数:二进制数的反码在形式上就是将1改为0或将0改为1,如: 同样,八进制数或者十六进制数的反码试用7或者F分别减去该数每一位数字得到的。

5.2 补码

懂得如何计算反码,那么掌握补码的计算也不是件难事,补码即为原码取反+1,具体如下所示,相信你仔细读完以下内容,你就能够掌握补码的运算: \\对于十进制数:我们将原码取反后加1: 对于二进制数,我们采取同样的方法,将原码取反后加1: 在前面的定义中,都是假设那些数没有小数点。如果原始数据N包含小数点,应该将小数点临时去掉计算补码或反码,然后再将相同的位置将小数点恢复。 同样值得强调的是,补码的补码又重新等于它的原码。

5.3 补码的减法

上面已经知道了求补码的方法,下面介绍一下补码的减法。要知道的是在计算机中实际上全是采用补码方式进行运算的,特别是减法运算。 补码减法运算法则如下: 上式说明,求两个机器数的差的补码,可以用被减数的补码加上负减数的补码来表示。其中负减数即是对减数进行求负操作,运算中就是对其全部数据位取反加一,实际上也是分别对符号位和真值位进行求反,因为正数与负数的符号也正好相反。例如:已知[15]补= 00001111,则[-15]补=11110000+1=11110001。 例子:

                    试用二进制补码计算5-2
                    解:因为(5-2)补=(5)补+(-2) 补
                       =0101+1110
                       =0011
                        所以  5-2=3

6.带符号的二进制数

二进制数的最高位是符号位,1代表这个二进制数为负数,0代表其为正数,这种形式的数成为原码。 在做带符号数的减法运算时,先比较它们绝对值的大小,其中较大的一个数作被减数,另一个则作为减数,运算结果的符号位由绝对值大的数决定。 这个过程相对复杂,所以一般都用两数的补码求和代替上述减法,可以使电路结构大大简化。

6.1 算数加法

执行算术加法时,把两个加数的符号位以及来自最高有效数字位的进位相加,得出的结果即为和的符号位,此时需要舍弃符号位相加产生的溢出,需要强调的是,两个同符号位绝对值之和不能超过有效数字位表示的最大值,否则会产生溢出导致计算结果出错。例如:

                           试用补码计算5+7
                           解: 
                               因为(5+7)补=(5)补+(7)补
                                =0 101 + 0 111
                                =0 1100

此时我们对数字位进行了位扩展,由原来的三位变为四位。

6.2 算数减法

如果你从上面一直学到现在,你一定知道这一小节中的减法运算和加法运算实质是一样的,只是对减数先求其补码再进行加法运算。 具体运算可参考5.3中的例子。

7.二进制码

先介绍一个概念,码制——即编制代码所要遵循的规则,不同的码制二进制数的位数或内容不同。 二进制代码的位数(n),与需要编码的事件的个数(N)之间应满足以下关系:

2n-1≤N≤2n(式中的n与n-1均为次幂数) 

优点有: (1)技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。 (2)简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。 (3)适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。 (4)易于进行转换,二进制与十进制数易于互相转换。 (5)用二进制表示数据具有抗干扰能力强,可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高还是低。

7.1 BCD码

BCD码英文为Binary Code Decimal,常见的BCD码又称8421码,是十进制代码中最常用的一种,由于从左到右每一位的1分别表示8.4.2.1,所以把这种代码称为8421码。 BCD码都是用四位二进制数表示十进制中的0~9十个数,每一位的1代表的十进制数称为这一位的权,且每一位的权是固定不变的。 从4位二进制数16种代码中,选择10种来表示0~9个数码的方案有很多种。每种方案产生一种BCD码。

    8421BCD码表示形式
    1:0001    2:0010    3:0011
    4:0100    5:0101    6:0110
    7:0111    8:1000    9:1001

7.2 BCD加法

8421BCD码加法原理: BCD码中1——9可以用四位二进制数0000——1001表示,而1010——1111这6个数为无效数。两个4位二进制数相加所得的结果超过1001,则将所得数加0110, 来跳过6个无效数,并产生一个进位。两个组合BCD码进行减法运算时,当低位向高位有借位时,由于“借一作十六”与“借一作十”的差别,将比正确的结果多6,所以有借位时,可采用“减6修正法”来修正.两个BCD码进行加减时,先按二进制加减指令进行运算,再对结果用BCD调整指令进行调整,就可得到正确的十进制运算结果。 实际上,计算机中既有组合BCD数的调整指令,也有分离BCD数的调整指令。另外,BCD码的加减运算,也可以在运算前由程序先变换成二进制数,然后由计算机对二进制数运算处理,运算以后再将二进制数结果由程序转换为BCD码。

7.3 十进制算数运算

十进制数的每一个数位的基为10,但到了计算机内部,出于存储与计算方便的目的,必须采用基2码对每个十进制数位进行重编码,所需要的最少的基2码的位数为log210,取整数为4。4位基2码有16种不同的组合。
① 十进制有权码是指表示一个十进制数位的4位基2码的每一位有确定的位权。用得最普遍的是8421码,即4个基2码位的权从高向低分别为8、4、2和1,使用基2码的0000、0001、…1001这10种组合,分别表示0到9这十个值。这种编码的优点是这4位基2码之间满足二进制的规则,而十进制数位之间则是十进制规则,故称这种编码为以二进制编码的十进制(Binary Coded Decimal)数,简称BCD码或二-十进制码。
② 十进制无权码是指表示一个十进制数位的4位基2码的每一位没有确定的位权。   在采用的无权码的一些方案中,早期用的比较多的是余3码(Excess-3 code),是把原二进制的每个代码都加0011值得到的。它的主要优点是执行十进制数位相加时,能正确地产生进位信号,而且还给减法运算带来了方便。   

7.4 其它的十进制码

余3码的编码规则与8421码不同,如果把每一个余3码看作4位二进制数,则它的数值要比它所表示的十进制数码多3,故而将这种代码称为余3码。 如果将两个余3码相加,所得的和将比十进制数和所对应的二进制数多6。
2421码是一种恒权代码,它的0和9,1和8,2和7,3和6,4和5也互为反码,这个特点和余3码相仿。
5211码是另一种恒权代码。如果按8421码接成十进制计数器,则连续输入计数脉冲时,4个触发器输出脉冲对于计数脉冲的分频比从低位到高位依次为5:2:1:1.可见,5211码每一位的权正好 与8421码十进制计数器4个触发器输出脉冲的分频比相对应。这种对应关系在构成某些数字系统时很有用。
余3循环码是一种变权码,每一位的1在不同代码中并不代表固定的数值。它的特点是相邻的两个代码之间仅有一位的状态不同。

7.5 格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反 射码。在数字系统中,常要求代码按一定顺序变化。若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码。
格雷码属于可靠性编码,是一种错误率最小的编码方式,另外由于这种编码相邻的两个码组之间只有一位不同,因而在用于方向的转角位移量-数字量的转换中,当方向的转角位移量发生微小变化,而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。
格雷码是一种变权码,每一位码都不固定,因此不可以直接进行算术运算,需要经过一次变换成自然二进制码。

7.6 ASCII码

ASCII码是由是美国国家标准化协会指定的一种信息代码,广发应用于计算机和通信领域中。
ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII 码也叫基础ASCII码,使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0到9标点符号,以及在美式英语中使用的特殊控制字符。
0~31及127(共33个)是控制字符或通信专用字符,32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。

7.7 检错码

检错码是一种编码,指在传输过程中发生错误后,在接收端能自动检查并发现错误的编码.目前常用的检错码有奇偶校验码、恒比码等。为提高信息传输的有效性和可靠性,根据香农信息理论,必须对信源消息实施信源编码和信道编码。
检错码的两大类别:奇偶校验编码和循环冗余编码。奇偶校验码是在原信息码元后面附加一个监督元,使码组中1或0的个数为奇数或偶数,为奇数者称为奇数校验码;为偶数者称为偶数校验码。
循环校验码(CRC码),是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

8.二进制存储与寄存器

存储器和寄存器虽然都是可以存数据的容器,但从根本上将,寄存器和存储器的物理结构不一样,一般寄存器是由RS触发器衍生出来的D出发,在CPU内部,是由一些与非门结构组成的。而存储器则有自己的工艺一般1Bit由六MOS管构成,在CPU内部。所以这两者的物理结构不一样也导致了两者的性能不同。寄存器访问速度快,但是所占面积大。而存储器相反,所占面积小,功率低,可以做成大容量的,但访问速度相对慢一点。目前存储器都是半导体存储器,分为ROM和RAM两种,现在的DDR4(RAM)读写速度最高可以达到60GB/S了,但ROM的速度相对就慢多了。

8.1 寄存器

寄存器是中央处理器(CPU)内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。
寄存器在集成电路和计算机领域中都有各自的应用,在集成电路中分为电路内部寄存器和内外部接口寄存器,内部寄存器不允许外部访问,只供给内部电路使用,而接口寄存器可以被内外部寄存器访问,CPU中的寄存器就是其中一种寄存器。在计算机中是CPU内部的元件,包括通用寄存器和控制寄存器等等,寄存器速度非常高,因此来回传输数据非常快。
寄存器的基本单元是D触发器,按照其用途分为基本寄存器和移位寄存器。基本寄存器是由D触发器组成,在CP脉冲作用下,每个D触发器能够寄存一位二进制码。在D=0时,寄存器储存为0,在D=1时,寄存器储存为1。移位寄存器按照移位方向可以分为单向移位寄存器和双向移位寄存器。

8.2 寄存器传输

寄存器的基本单元是 D触发器,按照其用途分为基本寄存器和移位寄存器
基本寄存器是由D触发器组成,在CP脉冲作用下,每个D触发器能够寄存一位二进制码。在D=0时,寄存器储存为0,在D=1时,寄存器储存为1。
在低电平为0,高电平为1时,需将信号源与D间连接一反相器,这样就可以完成对数据的储存。 需要强调的是,目前大型数字系统都是基于时钟运作的,其中寄存器一般是在时钟的边缘被触发的,基于电平触发的已较少使用。
移位寄存器按照移位方向可以分为单向移位寄存器和双向移位寄存器 单向移位寄存器是由多个D触发器串接而成,在串口 Di 输入需要储存的数据,触发器FF0就能够储存当前需要储存数据,在CP发出一次时钟控制脉冲时,串口Di同时输入第二个需要储存是的数据,而第一个数据则储存到触发器FF1中。 双向移位寄存器按图中方式排列,调换连接端顺序,可以控制寄存器向左移位,增加控制电路可以使寄存器右移,这样构成双向移位寄存器.

               {{:43a7d933c895d14378b9c49172f082025baf07b0.png?200|}}
               \\ {playground:hikey-43.jpg}

9.二进制逻辑

9.1 二进制逻辑定义

9.2 逻辑门