概述
自本世纪七十年代开始,数字电子技术席卷了全球半导体工业,技术和工艺不断升级革新。数字电路主要研究各类逻辑门元器件、时序电路、微处理器引脚IO,伴随近几年嵌入式微处理器技术的长足进步,数字电路广泛应用于各类嵌入式设备的信号处理场景,传统的模拟信号也逐步转换为数字信号进行处理,数字化已经越来越成为现代电子技术的明确发展方向。
本文言简意赅的总结了数字逻辑电路当中常用知识点,主要涉及数制以及码制、嵌入式系统总线技术、片选与时序等,是《电子技术小书-模拟电路篇》一文的姊妹篇,笔者力图通过两篇文章刷遍嵌入式开发涉及的主要知识点,方便大家在工作中融会贯通,两篇文章计划长期进行更新,逐步融入笔者日常工作中的一些心得和经验,由于知乎不支持Markdown表格语法,因此文中表格全部转换为清晰度较低的截图,如果需要查看最近更新的内容或者需要获得更加清晰的图表阅读体验,请移步至笔者的Github Pages。
电子技术小书-数字电路篇uinika.github.io有兴趣的同学可以加入成都天府软件园QQ群621843391参与相关讨论,一起聊聊成都IT那些事儿。也欢迎优秀原创技术类、IT产业经济类文章向知乎【成都IT圈】专栏进行投稿。
文中摘要图取自
Freescale i.MX28X
系列MCU的总线概览图,GPIO扩展板图片截自Raspberry Pi扩展板示意图。
Bit与Byte
- bit 比特:二进制中的一位,数字信息的最小单位。其中缩略词
kb
(kilobit)表示千比特。 - Byte 字节:1字节(Byte)= 8比特(bit)。其中缩略词
KB
(kilobyte)表示千字节。
编码
计算机科学当中,使用二进制数来表达信息的手段称为编码。
ASCII与Unicode编码
ASCII和Unicode都是一种字符编码格式。
- ASCII([ˈæski],American Standard Code for Information Interchange,美国信息交换标准代码)是一套主要用于显示现代美国英语的计算机编码系统,但是仅能显示26个基本拉丁字母、阿拉伯数字、英式标点符号。
- Unicode(统一字符编码)能够对世界上大部分文字系统进行了编码,使得多国文字的处理和呈现更加简单。Unicode标准至今仍在不断修订,最新版本为2018年6月5日公布的
11.0.0
。
BCD编码
二-十进制编码(BCD,Binary-Coded Decimal)是一种十进制数字的编码格式,每一位十进制数都使用一串二进制数(4位或8位)来表示。BCD码的优点在于格式转换容易,十进制数值表达精度较高;缺点是增加了电路进行算术运算的复杂度,并且存储效率较低。常见的BCD编码方式有如下三种:
- 8421码:最为常用的一种BCD码,各位的权值分别为
8
、4
、2
、1
。 - 余3码:8421BCD码的每个编码组加
3
(0011
)形成,常用于BCD码运算电路。 - 2421码:2421BCD码为有权的BCD码,从高位到低位的权值分别为
2
、4
、2
、1
。
奇偶校验码
奇偶校验位(parity bit)用来表达一组二进制编码中0
或1
的个数是奇数还是偶数,是一种简单有效的错误检测方式。
数制
常用的数制有二进制(Binary ['baɪnərɪ])
、十进制(Decimal ['desɪm(ə)l])
、十六进制(Hexadecimal [,heksə'desɪm(ə)l])
,日常生活中通常使用十进制,计算机出于设备易于实现和可靠性方面的考虑使用了二进制,又因为二进制不易记忆所以通常采用十六进制进行描述。
书写时可以在相应数制的尾部添加字母B
、D
、H
或者下标2
、10
、16
进行标识。
数制转换
二进制 ⇨ 十进制
将二进制数按权展开,将各项数值按照十进制数相加,就得到等值的十进制数,具体请参考下面的例子:
十进制 ⇨ 二进制
十进制转换到二进制处理起来相对复杂一些,需要分别对整数部分、小数部分进行转换。
整数部分(基数除法): 1. 把需要转换的十进制数除以二进制的基数2
,将余数作为二进制数的最低位; 2. 将上一次转换得到的商再除以2
,把余数作为二进制数的次低位; 3. 重复上一步,直至最后的商为0
,此时的余数就是二进制数的最高位。
小数部分(基数乘法): 1. 将十进制数的小数部分乘以二进制基数2
,把结果的整数部分作为二进制数小数部分的最高位; 2. 把上一步得到的十进制数结果的小数部分再乘以2
,再将结果的整数部分作为二进制数小数部分的次高位; 3. 重复上一步骤,直至结果的小数部分变为0
或达到预定要求为止。
例如,将
// 首先,处理整数部分
213 ÷ 2 = 106 余 1
106 ÷ 2 = 53 余 0
53 ÷ 2 = 26 余 1
26 ÷ 2 = 13 余 0
13 ÷ 2 = 6 余 1
6 ÷ 2 = 3 余 0
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0.5 余 0
// 然后,处理小数部分
0.8125 × 2 = 1.6250 整数部分 1
0.6250 × 2 = 1.2500 整数部分 1
0.2500 × 2 = 0.5000 整数部分 0
0.5000 × 2 = 1.0000 整数部分 1
最终得到的结果是:
二进制 ⇨ 十六进制
将需要转换的二进制数从低位至高位,每4位一组,高位不足时在有效位前面添加0
,然后将每组二进制数转换为十六进制即可。
例如
0101 1101 1110 . 1101 0010
↓ ↓ ↓ ↓ ↓
5 D E . B 2
十六进制 ⇨ 二进制
将上面二进制转换十六进制数的过程逆转过来,即将十六进制数的每1位使用等值4位二进制数代替。
例如
C 1 B . C 6
↓ ↓ ↓ ↓ ↓
1100 0001 1011 . 1100 0110
十六进制 ⇨ 十进制
将十六进制数按权进行展开,然后将各项数值按照十进制数相加。
十进制 ⇨ 十六进制
将十进制数转换为十六进制数时,可以先将十进制数转换为二进制数,然后再将得到的二进制数转换为等值的十六进制数。
原码、反码、补码
二进制数前增加一个符号位来标识正负(符号位为0
表示+
正数,符号位是1
表示-
负数),这样的二进制数称为原码。如果原码为正数,则原码与其反码和补码相同。如果原码为负数,则将原码除符号位之外按位取反,所得的新二进制数称为该原码的反码,反码基础上再加1
即为该原码的补码。
逻辑门
逻辑门是大规模数字集成电路的基本构成单元,主要由晶体管组成,通过输入高、低电平得到相应的电平结果,从而实现逻辑运算。逻辑门常用的表示法有ANSI/IEEE(美国国家标准协会/电机电子工程师学会)和IEC(国际电工委员会)两种,如下面表格所示:
高阻态
高阻抗状态(High impedance)表示电路中的某个节点具有相对电路中其它点更高的阻抗,电路分析时通常将高阻态作为开路理解。即可以将其视为输出/输入电阻极大,极限状态可以认为是悬空(断路)的状态,高阻态通常使用字母Z表示。
三态门
数字电路中的三态逻辑(Three-state logic)是指其输出既可以是代表0
和1
的高低电平,也可以是其特有的高阻抗状态(相当于隔断状态,电阻极大,类似于开路)。
具有高电平、低电平、高阻态三种状态的元器件称为三态器件,三态器件都通过一个控制使能端B来控制整个三态门电路的通断。当使能端高电平有效时,三态器件可以正常的0
或1
输出,当使能端低电平无效时,三态电路将会输出高阻态。
CMOS与TTL电平
TTL电路的工作电平称为TTL电平,CMOS电路的工作电平称为CMOS电平。TTL和CMOS是目前最主要的两种逻辑门集成电路,TTL电路是电流控制器件,而CMOS电路是电压控制器件。TTL速度较快,CMOS速度慢但省电成本低,近几年伴随CMOS技术的进步,其速度已经逐步超越TTL,并且CMOS工艺集成电路无需制作处理麻烦的电阻。相对而言,TTL目前发展比较缓慢,主要用于制作一些简单的数字电路。
- 互补金属氧化物半导体(CMOS,Complementary Metal-Oxide-Semiconductor)是电压控制的一种放大器件,是组成CMOS数字集成电路的基本单元,生产工艺是在硅质晶圆上制作NMOS(n-type MOSFET)和PMOS(p-type MOSFET)基本元件,是硅芯片制作的主流技术。 TTL电平标准:输出(
低<0.8V,高>2.4V
)、输入(低<1.2V,高>2.0V
),输入低于1.2V为低电平,高于2.0V为高电平,输入低电平时噪声容限为(0.8-0)/2=0.4V,高电平时噪声容限为(5-2.4)/2=1.3V。 - 晶体管-晶体管逻辑半导体(TTL,Transistor-Transistor Logic)主要由电阻器和晶体管组成,最早由德州仪器开发,当前的生产厂家沿用了德州仪器的编码命名规则,比如常用的74系列逻辑芯片。 CMOS电平标准:输出(
低<0.1×Vcc,高>0.9×Vcc
)、输入(低<0.3×Vcc,高>0.7×Vcc
),因为CMOS电源通常采用12V,则输入低于3.6V为低电平,噪声容限为1.8V;高于3.5V为高电平,噪声容限高为1.8V,相比TTL噪声容限更高。
组合/时序逻辑电路
- 组合逻辑电路(Combinational Logic Circuit),其任一时刻的稳态输出仅与该时刻输入的变量取值有关,而与该时刻之前输入的变量取值无关。组合电路主要由各种逻辑门(
半加器
、全加器
、半减器
、全减器
、数据选择器
、数据分配器
、编码器
、译码器
)组成,电路中没有记忆元件和反馈线。 - 时序逻辑电路(Sequential Logic Circuit)任意时刻的稳态输出不仅取决于当前输入,还与前一时刻输入的状态有关,换而言之,时序逻辑电路必须拥有特定的储存元件来保存前一次的输入状态。因此,时序逻辑电路除包含有组合逻辑电路以外,还必须含拥有存储信息能力的电路(
触发器
、寄存器
、计数器
)。
GPIO
通用输入输出(General-purpose input/output),功能类似于8051单片机的P0到P3口,引脚输出的高低电平可由开发人员读写相应寄存器进行控制。该接口有时也称为总线扩展器,当开发板接口不够用时,可以通过转接板将其扩展为I²C
、SPI
等其它串行接口。
总线
嵌入式微处理器通常是根据时间片串行处理任务,因此对于外围IO设备的访问也是串行的(即单一时间内处理器只能访问一个外设)。
总线(Bus)是嵌入式微处理器连接外围IO设备的一条公共信号线,外围IO设备之间通过地址进行区分,因此总线又分为数据总线(Data Bus)、地址总线(Address Bus)、控制总线(Control Bus)。通常情况下,个人电脑PC的三类总线是分开的,但是51系列单片机复用了地址总线与数据总线(总线某些时刻的信号表示数据而另一些时刻表示地址)。总线带宽是指单位时间内可以传输的数据总量,等于总线位宽与工作频率的乘积。例如64位800MHz的前端总线,其数据传输率等于64bit × 800MHz ÷ 8Byte = 6.4GB/s
。
总线通常具有如下两种数据传输方式:
- 并行通信:各数据位在多条线上以字或字节为单位同时进行传输,优点是速度快,缺点是通信线路较多因而成本较高,不宜进行远距离传输。常见的并行总线有:
VGA
、DVI
、HDMI
。 - 串行通信:数据依次逐位在一条数据线上进行传递,每一位数据占据一个固定的时间长度,优点是适宜远距离通信,缺点是传输效率相对较低。常见的串行总线有:
I²C
、SPI
、USB
、SATA
。
串行通信的数据传输方式分为同步
、异步
两种:
- 同步:连续串行传送数据的通信方式,每次只传送一帧信息,每帧信息包含有
同步字符
、数据字符
、校验字符
。其中同步字符
位于帧开头,用于确认数据字符的开始;数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符通常为1到2个,用于接收端对接收到的字符序列进行正确性校验。同步通信要求发送时钟和接收时钟保持严格的同步。 - 异步:数据逐帧进行传输,工作时钟相互独立,需要保证双方具有相同的波特率。帧与帧之间的时间间隔任意,间隙为高电平。异步通信的每帧数据都拥有固定格式,双方按照即定格式发送和接收,硬件结构比同步通信简单,还能利用校验位检测错误,嵌入式微处理器中广泛采用异步通信方式。
串行通信的数据传输方向分为单双工
、半双工
、全双工
三种:
- 单双工:数据只能由A发送至B;
- 半双工:A和B之间能够互相发送,但是不能在两个方向同时传送,每次只能一个设备发送另一个设备接收;
- 全双工:允许AB双方同时进行发送和接收。
波特率用来代表串行通信的传输速率,代表串口通信过程中二进制数据位的速率,即每发送一位二进制数据的持续时间。
I²C
集成电路总线(Inter-Integrated Circuit),是由PHILIPS公司开发的两线式、多主从架构的同步串行通信总线,I²C总线硬件上由时钟总线(SCL)和数据总线(SDA)两条线构成,SCL时钟线负责收发双方的时钟节拍,SDA数据线则负责传输数据。Linux已经将I²C总线列入其内核模块的支持,可以通过/usr/include/linux/i2c.h
查找其说明。
I²C主要用于板内通信,例如微处理器与外围芯片的通信。
UART
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)是异步串行通信接口的总称,包括RS232
、RS449
、RS423
、RS422
、RS485
等接口标准规范和总线标准规范。台式电脑串行接口默认采用RS232
规范,笔记本上可以通过USB转串口工具进行代替。串口通信时,收发双方必须保持相同的波特率。
51系列单片机提供P3.0
引脚(RXD,串行数据接收引脚)和P3.1
引脚(TXD,串行数据发送引脚)进行UART串行通信,下图当中通过2块MCU的RXD和TXD对应连接实现了相互之间的通信。
UART通常用于板间设备间的通信,例如单片机与电脑或者设备与设备之间。
SPI
串行外设接口(Serial Peripheral Interface Bus),是一种应用于单片机系统中的全双工同步串行通信接口规范,类似于I²C总线。该接口首先由Motorola开发,然后发展为行业规范,典型应用包括SD卡和液晶显示屏。 SPI设备之间使用全双工模式通信,包含一个主机和多个从机。主机产生待读写的帧数据,多个从机通过一条片选线路来决定哪个设备来响应主机的请求,标准SPI由4根线数成,
- SCLK(Serial Clock):时钟信号,由主机发出,与I²C总线的SCL功能类似。
- MOSI(Master Output,Slave Input):主机向从机发送指令和数据的通道。
- MISO(Master Input,Slave Output):主机读取从机状态和数据的通道。
- SS(Slave Selected):从设备片选使能信号,通常低电位有效。如果从设备低电位有效,拉低该引脚从设备就会被选中。
某些场景下,可以将标准SPI剪裁至 2线或 3线进行通信,例如主机只向从机发送数据但不需要从机回复数据的时候可以省略MISO,或者系统只拥有一个主机一个从机的时候,从机的片选可以固定为使能状态,则SSEL可以取消。
时钟/机器/指令周期
时钟周期:时序中最小的时间单位,计算的方法是1/时钟源频率
,例如采用12M晶振的8051单片机系统,其时钟周期为1/12
秒。 机器周期:单片机系统完成一个操作的最小时间单位,主要针对汇编语言而言,汇编语言程序每条语句的执行时间总是机器周期的整数倍。C语言程序语句执行时间并不确定,只能通过开发手册提供的公式进行计算;例如标准8051单片机架构1
个机器周期等于12
个时钟周期,即12*(1/12)
。对于其它运行速度更快的单片机系统,1
个机器周期可能等于1
个或4
个时钟周期。 指令周期:时序中的最大时间单位,是指取出一条指令并分析执行的时间,一般由若干个机器周期组成。传统8051单片机的指令周期是单周期指令,即指令周期 = 机器周期
,目前新推出的单片机已经不分频并且保持单指令周期,即指令周期 = 机器周期 = 时钟周期
。
时序
嵌入式微处理器的时序是指执行指令时所发出控制信号的时间序列,本质是一系列具有时间顺序的脉冲信号。CPU发出的时序用于控制片内资源,也用于控制片外的存储器以及I/O端口,后者对于硬件电路分析极为重要,了解IC芯片的操作时序是嵌入式编程的一项重要工作内容。
片选
- 总线元器件的片选:嵌入式系统中许多元器件都挂载在一条总线上,如果需要对指定的元器件进行访问,就需要一个使能信号来告知元器件该信号是传递给哪个的。这个信号就叫做片选信号CS(chip select)、CE(Chip Enable)、SS(slave select)。数字电路当中,开路输入管脚通常呈现为高电平,因此片选信号多数情况下是一个低电平。
- 存储芯片的片选:存储器往往要是由一定数量的芯片构成,微处理器要实现对存储单元的访问,首先要选择存储芯片,即进行片选;然后再从选中的存储芯片依据地址码选中相应存储单元进行数据的存取,这称为字选。片内的字选是由CPU送出的N条低位地址线完成,地址线连接到全部存储芯片的地址输入端,而片选信号则大多是通过高位地址译码后产生的。
寄存器
寄存器(Register)是中央处理器内部的组成部分,存储速度极快。可用来暂存指令、数据、地址,中央处理器控制部件中包含有指令寄存器
和程序计数器
两类寄存器,中央处理器算术及逻辑部件中包含的寄存器主要是有累加器
。
译码器
译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的逻辑电平。译码器主要分为通用译码器(较少输入变为较多输出,例如$n→2^n$线译码器和8421BCD译码器$)、数字显示译码器(将二进制数转换成对应的七段码,用于驱动LED或LCD)两大类。
缓冲器
缓冲寄存器(Buffer),分为输入和输出两种类型,输入缓冲寄存器的作用是暂时存放外设发送过来的数据,便于嵌入式处理器取用;输出缓冲寄存器则暂时存放处理器发送给外设的数据。缓冲寄存器可以协调并缓冲高速工作的CPU与慢速工作的IO外设,以实现数据传送的同步。因为缓冲器直接挂载至数据总线,因而必须具备三态输出功能。
锁存器
锁存器(Latch)可以将信号暂时保存并维持特定的电平状态,从而能够去记录二进制数字信号0
和1
。4位锁存器可以存储4Byte
数据,8位锁存器可以存储8Byte
数据。
触发器
触发器(Flip-flop)是一个拥有记忆功能并且具备2个稳定状态(0
和1
)的信息存储器件,是构成多种时序电路的基本逻辑单元。数字电路中的存储单元常常需要在同一时刻进行协同工作,因此每个存储单元都使用时钟脉冲(CLK)作为控制信号,只有其才能触发电路开始工作并根据输入信号进行相应输出,这种时钟信号触发工作的存储单元电路即触发器。而上面描述的锁存器,是不需要时钟信号进行控制的。
比较器
比较器(Comparator)是通过比较两个输入端的电流或电压的大小,在输出端输出不同电压结果的电子元件。常用于模数转换电路中,可以将比较器理解为一个1位的ADC模/数转换器。
- 本文作者: Hank
- 本文链接: https://uinika.github.io/electron/digital.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
最后
以上就是唠叨水池为你收集整理的数字电子技术基础知识点_电子技术小书-数字电路篇的全部内容,希望文章能够帮你解决数字电子技术基础知识点_电子技术小书-数字电路篇所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复