自本世纪七十年代开始,数字电子技术席卷了全球半导体工业,技术和工艺一直在升级革新。数字电路主要研究各类逻辑门元器件、时序电路、微处理器引脚IO,伴随近几年嵌入式微处理器技术的长足进步,数字电路大范围的应用于各类嵌入式设备的信号处理场景,传统的模拟信号也逐步转换为数字信号做处理,数字化已经越来越成为现代电子技术的明确发展方向。
本文言简意赅的总结了数字逻辑电路当中常用知识点,主要涉及数制以及码制、嵌入式系统总线技术、片选与时序等,是《电子技术小书-模拟电路篇》一文的姊妹篇,笔者力图通过两篇文章刷遍嵌入式开发涉及的主要知识点,方便大家在工作中融会贯通,两篇文章计划长期进行更新,逐步融入笔者日常工作中的一些心得和经验,由于知乎不支持Markdown表格语法,因此文中表格全部转换为清晰度较低的截图,若需要查看最近更新的内容或者需要获得更加清晰的图表阅读体验,请移步至笔者的电子技术博客/b>
:
[ˈæski],American Standard Code for Information Interchange,美国信息交换标准代码
)是一套大多数都用在显示现代美国英语的计算机编码系统,但是仅能显示26个基本拉丁字母、阿拉伯数字、英式标点符号。
)能够对世界上大部分文字系统来进行了编码,使得多国文字的处理和呈现更简单。Unicode标准至今仍在不断修订,最新版本为2018年6月5日公布的
二-十进制编码(BCD,Binary-Coded Decimal)是一种十进制数字的编码格式,每一位十进制数都使用一串二进制数(4位或8位)来表示。BCD码的优点是格式转换容易,十进制数值表达精度较高;缺点是增加了电路进行算术运算的复杂度,并且存储效率较低。常见的BCD编码方式有如下三种:
奇偶校验位(parity bit)用来表达一组二进制编码中0或1的个数是奇数还是偶数,是一种简单有效的错误检测方式。
常用的数制有二进制(Binary [baɪnərɪ])、十进制(Decimal [desɪm(ə)l])、十六进制(Hexadecimal [,heksədesɪm(ə)l]),日常生活中通常使用十进制,计算机出于设备易于实现和可靠性方面的考虑使用了二进制,又因为二进制不易记忆所以一般会用十六进制进行描述。
十进制转换到二进制处理起来相对复杂一些,需要分别对整数部分、小数部分进行转换。
整数部分(基数除法): 1. 把需要转换的十进制数除以二进制的基数2,将余数作为二进制数的最低位; 2. 将上一次转换得到的商再除以2,把余数作为二进制数的次低位; 3. 重复上一步,直至最后的商为0,此时的余数就是二进制数的最高位。
小数部分(基数乘法): 1. 将十进制数的小数部分乘以二进制基数2,把结果的整数部分作为二进制数小数部分的最高位; 2. 把上一步得到的十进制数结果的小数部分再乘以2,再将结果的整数部分作为二进制数小数部分的次高位; 3. 重复上一步骤,直至结果的小数部分变为0或达到预定要求为止。
将需要转换的二进制数从低位至高位,每4位一组,高位不足时在有效位前面添加0,然后将每组二进制数转换为十六进制即可。
将上面二进制转换十六进制数的过程逆转过来,即将十六进制数的每1位使用等值4位二进制数代替。
将十进制数转换为十六进制数时,可以先将十进制数转换为二进制数,然后再将得到的二进制数转换为等值的十六进制数。
二进制数前增加一个符号位来标识正负(符号位为0表示+正数,符号位是1表示-负数),这样的二进制数称为原码。如果原码为正数,则原码与其反码和补码相同。如果原码为负数,则将原码除符号位之外按位取反,所得的新二进制数称为该原码的反码,反码基础上再加1即为该原码的补码。
逻辑门是大规模数字集成电路的基本构成单元,主要由晶体管组成,通过输入高、低电平得到相应的电平结果,以此来实现逻辑运算。逻辑门常用的表示法有ANSI/IEEE(美国国家标准协会/电机电子工程师学会)和IEC(国际电工委员会)两种,如下面表格所示:
高阻抗状态(High impedance)表示电路中的某个节点具有相对电路中其它点更高的阻抗,电路分析时通常将高阻态作为开路理解。即可以将其视为输出/输入电阻极大,界限状态可以认为是悬空(断路)的状态,高阻态通常使用字母Z表示。
数字电路中的三态逻辑(Three-state logic)是指其输出既可以是代表0和1的高低电平,也可以是其特有的高阻抗状态(相当于隔断状态,电阻极大,类似于开路)。
具有高电平、低电平、高阻态三种状态的元器件称为三态器件,三态器件都通过一个控制使能端B来控制整个三态门电路的通断。当使能端高电平有效时,三态器件能够顺利的0或1输出,当使能端低电平无效时,三态电路将会输出高阻态。
TTL电路的工作电平称为TTL电平,CMOS电路的工作电平称为CMOS电平。TTL和CMOS是目前最主要的两种逻辑门集成电路,TTL电路是电流控制器件,而CMOS电路是电压控制器件。TTL速度较快,CMOS速度慢但省电成本低,近几年伴随CMOS技术的进步,其速度已经逐步超越TTL,并且CMOS工艺集成电路无需制作处理麻烦的电阻。相对而言,TTL目前发展比较缓慢,大多数都用在制作一些简单的数字电路。
CMOS,Complementary Metal-Oxide-Semiconductor
)是电压控制的一种放大器件,是组成CMOS数字集成电路的基本单元,生产的基本工艺是在硅质晶圆上制作NMOS(
),输入低于1.2V为低电平,高于2.0V为高电平,输入低电平时噪声容限为(0.8-0)/2=0.4V,高电平时噪声容限为(5-2.4)/2=1.3V。
)主要由电阻器和晶体管组成,最早由德州仪器开发,当前的生产厂商沿用了德州仪器的编码命名规则,比如常用的74系列逻辑芯片。 CMOS电平标准:输出(
),因为CMOS电源一般会用12V,则输入低于3.6V为低电平,噪声容限为1.8V;高于3.5V为高电平,噪声容限高为1.8V,相比TTL噪声容限更高。
),其任一时刻的稳态输出仅与该时刻输入的变量取值有关,而与该时刻之前输入的变量取值无关。组合电路主要由各种逻辑门(
)任意时刻的稳态输出不仅取决于当前输入,还与前一时刻输入的状态有关,换而言之,时序逻辑电路必须拥有特定的储存元件来保存前一次的输入状态。因此,时序逻辑电路除包含有组合逻辑电路以外,还必须含拥有存储信息能力的电路(
通用输入输出(General-purpose input/output),功能类似于8051单片机的P0到P3口,引脚输出的高低电平可由研发人员读写相应寄存器来控制。该接口有时也称为总线扩展器,当开发板接口不够用时,能够最终靠转接板将其扩展为I²C、SPI等其它串行接口。
嵌入式微处理器通常是根据时间片串行处理任务,因此对于外围IO设备的访问也是串行的(即单一时间内处理器只能访问一个外设)。
总线(Bus)是嵌入式微处理器连接外围IO设备的一条公共信号线,外围IO设备之间通过地址进行区分,因此总线又分为数据总线(Data Bus)、地址总线(Address Bus)、控制总线(Control Bus)。通常情况下,个人电脑PC的三类总线系列单片机复用了地址总线与数据总线(总线某些时刻的信号表示数据而另一些时刻表示地址)。总线带宽是指单位时间内可以传输的数据总量,等于总线位宽与工作频率的乘积。例如64位800MHz的前端总线GB/s。
位于帧开头,用于确认数据字符的开始;数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符通常为1到2个,用于接收端对接收到的字符序列进行正确性校验。同步通信要求发送时钟和接收时钟保持严格的同步。
:数据逐帧进行传输,工作时钟相互独立,需要保证双方具有相同的波特率。帧与帧之间的时间间隔任意,间隙为高电平。异步通信的每帧数据都拥有固定格式,双方按照即定格式发送和接收,硬件结构比同步通信简单,还能利用校验位检测错误,嵌入式微处理器中广泛采用异步通信方式。
波特率用来代表串行通信的传输速率,代表串口通信过程中二进制数据位的速率,即每发送一位二进制数据的持续时间。
集成电路总线(Inter-Integrated Circuit),是由PHILIPS公司开发的两线式、多主从架构的同步串行通信总线,I²C总线硬件上由时钟总线(SCL)和数据总线(SDA)两条线构成,SCL时钟线负责收发双方的时钟节拍,SDA数据线则负责传输数据。Linux已经将I²C总线列入其内核模块的支持,能够最终靠/usr/include/linux/i2c.h查找其说明。
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)是异步串行通信接口的总称,包括RS232、RS449、RS423、RS422、RS485等接口标准规范和总线标准规范。台式电脑串行接口默认采用RS232规范,笔记本上能够最终靠USB转串口工具进行代替。串口通信时,收发双方一定要保持相同的波特率。
P3.0引脚(RXD,串行数据接收引脚)和P3.1引脚(TXD,串行数据发送引脚)进行UART串行通信,下图当中通过2块MCU的RXD和TXD对应连接实现了相互之间的通信。
串行外设接口(Serial Peripheral Interface Bus),是一种应用于单片机系统中的全双工同步串行通信接口规范,类似于I²C总线。该接口首先由Motorola开发,然后发展为行业规范,典型应用包括SD卡和液晶显示屏。 SPI设备之间使用全双工模式通信,包含一个主机和多个从机。主机产生待读写的帧数据,多个从机通过一条片选线路来决定哪个设备来响应主机的请求,标准SPI由4根线数成,
1/时钟源频率,例如采用12M晶振的8051单片机系统,其时钟周期为1/12秒。机器周期:单片机系统完成一个操作的最小时间单位,主要是针对汇编语言而言,汇编语言程序每条语句的执行时间总是机器周期的整数倍。C语言程序语句执行时间并不确定,只可以通过开发手册提供的公式进行计算;例如标准8051单片机架构1个机器周期等于12个时钟周期,即12*(1/12)。对于其它工作速度更快的单片机系统,1个机器周期可能等于1个或4个时钟周期。指令周期:时序中的最大时间单位,是指取出一条指令并分析执行的时间,一般由若干个机器周期组成。传统8051单片机的指令周期是单周期指令,即指令周期 = 机器周期,目前新推出的单片机已经不分频并且保持单指令周期,即指令周期 = 机器周期 = 时钟周期。时序
:嵌入式系统中许多元器件都挂载在一条总线上,若需要对指定的元器件进行访问,就需要一个使能信号来告知元器件该信号是传递给哪个的。这个信号就叫做片选信号
)。数字电路当中,开路输入管脚通常呈现为高电平,因此片选信号多数情况下是一个低电平。
:存储器往往要是由少数的芯片构成,微处理器要实现对存储单元的访问,首先要选择存储芯片,即进行
;然后再从选中的存储芯片依据地址码选中相应存储单元进行数据的存取,这称为
。片内的字选是由CPU送出的N条低位地址线完成,地址线连接到全部存储芯片的地址输入端,而片选信号则大多是通过高位地址译码后产生的。
)是中央处理器内部的组成部分,存储速度极快。可用来暂存指令、数据、地址,中央处理器控制部件中包含有
指令寄存器和程序计数器两类寄存器,中央处理器算术及逻辑部件中包含的寄存器主要是有累加器。译码器
多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的逻辑电平。译码器大致上可以分为通用译码器(较少输入变为较多输出,例如$n→2^n$线BCD译码器$)、数字显示译码器(将二进制数转换成对应的七段码,用于驱动LED或LCD)两大类。缓冲器
),分为输入和输出两种类型,输入缓冲寄存器的作用是暂时存放外设发送过来的数据,便于嵌入式处理器取用;输出缓冲寄存器则暂时存放处理器发送给外设的数据。缓冲寄存器可以协调并缓冲高速工作的CPU与慢速工作的IO外设,以实现数据传送的同步。因为缓冲器直接挂载至数据总线,因而一定要具有三态输出功能。
0和1。4位锁存器可以存储4Byte数据,8位锁存器可以存储8Byte数据。触发器
0和1)的信息存储器件,是构成多种时序电路的基本逻辑单元。数字电路中的存储单元常常需要在同一时刻进行协同工作,因此每个存储单元都使用时钟脉冲(CLK)作为控制信号,只有其才能触发电路开始工作并依据输入信号进行相应输出,这种时钟信号触发工作的存储单元电路即触发器。而上面描述的锁存器,是不需要时钟信号来控制的。比较器