第5章 输入输出与接口技术
5.1 接口概述 5.1.1 I/O接口基本概念 1.接口的概念 定义:接口是CPU与“外部世界”的连接电路,负责“中转”各种信息。 5.1 接口概述 5.1.1 I/O接口基本概念 1.接口的概念 定义:接口是CPU与“外部世界”的连接电路,负责“中转”各种信息。 分类:存储器接口和I/O接口。 位置:介于系统总线与外部设备之间。
2.为什么要引入接口 微机和I/O设备的信息类型和格式可能不一样。 微机和I/O设备信号传输处理的速度可能不匹配。 不用接口, I/O直接接CPU,随着外设增加,会大大降低CPU的效率。 I/O直接接CPU,会使外设硬件结构过于依赖CPU,对外设本身发展不利。
3.I/O接口与I/O设备 不同I/O设备对应I/O接口不同。 I/O接口受CPU控制,I/O设备受I/O接口控制。 微机的应用离不开外部设备接口的设计、选用和连接。 可能是单向的 数据 数据 控制信号 控制信号 外设 CPU 接口 状态信号 状态信号
5.1.2 I/O接口功能 数据缓冲功能:通过寄存器或锁存器实现。 接口中存放数据的寄存器或锁存器称之为数据口。 接受和执行CPU命令功能: 控制和监视设备执行功能: 接口中存放执行状态信息的寄存器称之为状态口。 设备选择功能:CPU通过地址译码选择不同外设。 即CPU通过地址译码选择不同I/O接口和I/O接口中连接的不同的设备。 数据缓冲包含数据宽度转换 一个接口一般有多个数据口、命令口和状态口,CPU通过地址译码寻址接口。 接口内部逻辑寻址这些口。 信号转换功能:协调总线信号与I/O设备信号。 转换包括信号的逻辑关系、时序配合和电平转换。 可编程功能:增加接口的灵活性和智能性。
5.1.3、I/O接口组成 接口由接口硬件和接口软件组成。 核心部分 1.接口硬件 控制信号主要用于控制时序
系统总线侧引脚信号: 地址信号:选择I/O接口中的不同寄存器(端口); 数据信号:命令或数据写入到相应寄存器,或者从相关寄存器读出数据或状态; 控制信号:控制命令的执行、时序、信号同步和片选; 状态信号:接口的部分工作状态信号。 外设侧引脚信号: 数据信号:接口缓冲寄存器与外设间的数据交换; 状态信号:外设工作状态送给接口的状态寄存器; 控制信号:接口的内部控制逻辑控制外设工作的控制信号和同步信号。 内部控制逻辑: 根据控制寄存器、状态寄存器、总线控制信号及外设状态信号控制I/O接口的工作。
常见接口插槽1 串行口 10/100M网卡 PS2鼠标 MIDI/游戏接口 并行口 PS2键盘 音箱/线入/麦克风接口 1394a USB VGA接口 千兆网 1394
常见接口插槽2 声道输入 中置与重低音 后置扬声器输出 前置扬声器输出 侧置扬声器输出 麦克风输入 VGA、DVI和HDMI都是视频接口,用于连接显示器。VGA是传输模拟信号,DVI和HDMI能传输数字信号,支持1080P全高清视频。与DVI相比,HDMI主要优势是能够同时传输音频数据,在视频数据的传输上没有差别。另外,还有一种新兴的视频接口叫“DisplayPort”接口,简称DP接口,同样能够传输音频。 上图中还有一个光纤音频接口,很多朋友仅知道是光纤接口,但不知做什么用的,是否能插光纤网线?答案是否定的。该接口仅为高端音频设备传输音频信号。 e-SATA并不是一种独立的外部接口技术标准,简单来说e-SATA就是SATA的外接式界面,拥有e-SATA接口的电脑,可以把SATA设备直接从外部连接到系统当中,而不用打开机箱,但由于e-SATA本身并不带供电,因此也需要SATA设备也需要外接电源,这样的话还是要打开机箱,因此对普通用户也没多大用处。 e-SATA上面是IEEE 1394接口,IEEE 1394接口最大的优势是接口带宽比较高,其在生活中应用最多是高端摄影器材,这部分应用人群本来就少;加上更多用户采用USB接口来传输储存卡上的数据。因此,对于绝大部用户来说,IEEE 1394接口也很少用上。 请注意,上图的下端两个接口并不是e-SATA,而是USB 2.0与e-SATA结合的USB PLUS接口,外观上比e-SATA更厚点。USB PLUS接口是爱国者2009年发布的,目的是解决e-SATA没有提供供电的缺陷。 中置与重低音 声道输入 后置扬声器输出 前置扬声器输出 侧置扬声器输出 麦克风输入
2.接口软件(设备驱动程序) 初始化程序段:设置接口工作方式及初始条件。 传送方式处理程序段:CPU针对不同的I/O设备有不同的处理方式。如设置中断向量等。 主控程序段:完成接口任务的程序。 程序终止与退出程序段:对接口电路硬件保护及操作系统中数据恢复。 辅助程序段:提供人-机对话手段。
5.2 I/O编址与访问 5.2.1 I/O端口 1.I/O端口 I/O端口是供CPU直接存取访问的接口中的寄存器或电路。
5.2.2 I/O端口编址 1.I/O统一编址(存储器映象I/O编址) 一个I/O端口等同于一个存储器单元。存储单元和I/O端口统一编址。 MEM空间 I/O空间 N-1 K K-1 存储类指令 5.2.2 I/O端口编址 1.I/O统一编址(存储器映象I/O编址) 一个I/O端口等同于一个存储器单元。存储单元和I/O端口统一编址。 应用:Motorola系列和Apple 系列均采用此方式 优点: 对I/O端口的访问命令与对存储器单元访问相同,不必使用专用I/O指令; 外设数目或I/O寄存器数几乎不受限制。 系统读写控制逻辑较简单。 缺点: I/O端口占用部分MEM空间,可用MEM空间减小; 对MEM访问指令较长,执行速度较慢; I/O端口地址译码时间较长。
I/O端口地址空间与存储器地址空间相互独立。 应用:Z-80系列和x86系列均采用此方式。 优点: MEM地址空间不受I/O端口地址空间影响; I/O端口数量不多,占用地址线少,地址译码简单,速度较快,使得此类指令执行速度快; 使用专用I/O命令(IN/OUT),与MEM访问命令(LOAD/STORE、MOV)有明显区别,便于理解和检查。 N-1 MEM K-1 I/O设备 存储类指令 I/O类指令
Intel系列微机系统仅支持I/O独立编址方式。 缺点: 专用I/O指令增加指令系统复杂性,且I/O指令类型少,寻址方式也少,程序设计灵活性较差; 要求处理器提供MEMR#/MEMW#和IOR#/IOW#两组控制信号,增加了控制逻辑的复杂性。 3.Intel系列微机I/O编址 Intel系列微处理器支持I/O独立编址方式和I/O统一编址(存储器映象编址)方式。 Intel系列微机系统仅支持I/O独立编址方式。
5.2.3 IA-32系列微机I/O端口访问 1.I/O端口地址空间 I/O端口地址空间:有64K个独立编址的8位端口空间。两个连续8位端口可作为16位端口,4个连续的8位端口可作为32位端口处理。注意端口地址对齐。 00~0FFH(256个端口)地址用于主板 100~3FFH(768个端口)地址用于扩展板 400~0FFFFH地址用于I/O扩展设备(如PCI设备) 源于IBM PC I/O端口地址信号:借用地址线信号和IOW#/IOR#信号线以及表示DMA正在工作的AEN的反相信号组成。
系统板I/O接口芯片口地址(0000H-00FFH): 地址范围 DMAC1 DMAC2 DMA页面寄存器 0000-001FH 00C0-00DFH 0080-009FH 中断控制器1 中断控制器2 0020-003FH 00A0-00BFH 定时器 并行接口芯片(键盘接口) RT/CMOS RAM 协处理器(现保留) 0040-005FH 0060-006FH 0070-007FH 00F0-00FFH 返回地址译码
扩展槽I/O接口卡端口地址(0100H-03FFH): 地址范围 游戏控制卡 0200-020FH 并行口控制卡1 并行口控制卡2 0370-037FH 0270-027FH 串行口控制卡1 串行口控制卡2 03F8-03FFH 02F8-02FFH 原型插件板(用户可用) 0300-031FH 同步通信卡1 同步通信卡2 03A0-03AF 0380-038FH 单显MDA 彩显CGA 彩显EGA/VGA 03B0-03BFH 03D0-03DFH 03C0-03CFH 软驱控制卡 硬驱控制卡 03F0-03FFH 01F0-01FFH PC网卡 0360-036FH
2.I/O端口地址寻址方式 I/O端口支持直接寻址和间接寻址方式。 直接寻址是使用一字节立即数寻址,端口寻址范围为00H~FFH共256个。 间接寻址是使用DX寄存器间接给出I/O端口地址,可寻址的范围是0000H~FFFFH共64K个端口。 3.I/O端口与累加器间I/O指令——寄存器I/O指令 格式:IN、OUT。 结果:完成I/O端口和EAX、AX、AL之间的数据传送,可使用直接寻址和间接寻址方式。 举例:mov dx, 3fdh mov al, 36h in al, dx out 43h, al
4. I/O端口与存储器间I/O指令——块I/O指令 格式:INSB/W/D、OUTSB/W/D。 参数:用DX指定I/O端口地址,输入/输出时的目的/源RAM地址用ES:DI(EDI)/DS:SI(ESI)指定。EFLAG寄存器中DF位来决定地址加和减。 结果:通过前缀REP在I/O端口和连续的存储器空间之间传送数据。 5.I/O端口访问 CPU通过I/O指令对I/O接口进行访问。 汇编语言指令:IN、OUT。 C语言指令:inportb(inport)、outportb(outport)。 VC++指令:_inp(_inpw)、_outp(_outpw)。
例:读取CMOS信息。 ;功能:读取CMOS信息 main() ;调用:AL=CMOS地址 { ;返回:AL=CMOS内容 proc_read_cmos proc cli or al,80h ;屏蔽NMI out 70h,al jmp $+2 ;延迟 in al,71h ;读CMOS数据 sti ret proc_read_cmos endp main() { short int i, j; unsigned char c_CmosMessage[64]; for (i=0;i<=63;i++) j=i|0x80 outportb(0x70,j); c_CmosMessage[i]=inportb(0x71) ; } printf("CMOS信息读取完毕。\n");
OUT 43H, AL A19~A16/S6~S3 IO/M# 或 WR #( IOW# ) CS8254 # 0H 00H 43H
作业1 请参照上页OUT 43H, AL 指令的时序图画出IN AL,21H的时序图,假设从21H端口中读到的数据是02H,21H是8259芯片的一个端口地址。
5.2.4 Pentium的I/O保护 I/O保护在保护模式下有效,在实地址模式下无效。 1.I/O特权级IOPL保护 保护通过比较当前任务的特权级CPL和标志寄存器的IOPL字段实现的。 若CPL ≤ IOPL,可执行IN、OUT、INS、OUTS、CLI、STI等敏感指令(对IOPL敏感);否则不行。 每个任务都有自己的IOPL,用以表示指定的I/O操作处于特权级的哪一级。它在EFLAGS中。 0级特权的过程可通过POPF和IRET指令修改任务的IOPL。
I/O允许位映象用来修正IOPL对I/O敏感指令的影响,允许低特权的程序访问某些I/O端口。 操作系统可通过改变任务TSS中的I/O允许映象来为某任务分配端口。(一定是在0级) 思考题:如何让普通用户访问I/O端口? 思路是进到0级 通过操作系统提供的接口函数; 通过设备驱动程序(其运行在0级上); 通过操作系统的漏洞。
IOPL用以表示指定的I/O操作处于特权级的哪一级。它在EFLAGS中。 CPL当前段的I/O优先级,它实际上是CS段选择符的第0~第1位。 执行in, out指令 是 CPL ≤ IOPL? 否 是 IOPM是对所有VM都起作用的权限机制,它以位(bit)来代表每个端口。某位为1,则该代表的端口被禁止访问;某位为0;则允许访问该位所代表的端口。 IOPM相关位=0? 否 产生一个一般保护异常 进行I/O操作
V86模式下(DOSVM)的I/O端口访问 执行in, out指令 是 IOPM相关位=0? 否 进行I/O操作 产生一个一般保护异常
5.3 I/O端口地址译码方法 端口地址=端口所在接口基地址+端口号 5.3.1 接口芯片中与地址译码有关的管脚及其运用 1)片选(CS#)信号:其有效表明该接口芯片可以通过系统总线与CPU进行数据交换 使用IOW#/IOR#信号(有效)、AEN信号(无效)和地址线高位(接口基地址)经过译码得到片选信号。 2) 接口芯片内部端口号: 地址线低位直接组成。
5.3.2 固定式端口地址译码 接口中只有一个端口时可采用门电路构成。 接口中有多个端口时一般采用译码器电路构成,常见的译码器有74LS138、74LS154等。 74LS138译码器: 15 Y0# Y7# A B C G2B# G2A# G1 14 13 12 11 10 9 7 1 2 3 4 5 6 74LS138 工作条件: G1=1,G2A # =G2B # =0。 工作原理: 将复合的输入信号变为枚举的输出信号。
74LS138真值表 输 入 输 出 G1G2A#G2B# C B A Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 X X X X X 1 1 1 1 1 1 1 1 X 1 X X X 1
软件上和信号上如何区别访问I/O还是MEMORY? 74LS138在PC机系统板端口译码的应用: 15 1 A5 A Y0# DMACS#(8237) 14 2 A6 INTRCS#(8259) B 74LS138 13 3 A7 T/C CS#(8253) C 12 PPICS#(8255) 5 11 A8 G2B# WRTDMAPG# ≥1 4 10 A9 G2A# WRTNMIREG# 6 9 ≥1 G1 AEN’# 7 Y7# IOW# 软件上和信号上如何区别访问I/O还是MEMORY? 为何中断控制1端口地址为0020H-003FH? 转PC例子
CPU MEM 8259 8253 DMA 00H : 8259 1FH 20H 数据总线 8253 地址总线 3FH 控制总线 40H 8255 系统… 空闲 00H 20H 40H 60H 3FFH 1FH 3FH 5FH 7FH : CPU MEM D7-D0 数据总线 A15-A0 地址总线 控制总线 IOR# IOW# IOR# IOW# D7-D0 D7-D0 A5 15 Y0 A 设 备 侧 信 号 A6 14 设 备 侧 信 号 B A7 74LS138 13 WR# WR# C 12 RD# RD# A8 G2B# 11 A9 10 CS# CS# G2A# 8259 9 A0 A0 AEN# G1 Y7 7 A1 A0 A1 A0 8253
5.3.3 可选式端口地址译码 (1)使用比较器+地址开关方法 比较器和地址开关产生一个信号参与片选。 74LS688比较器: 当P0~7≠Q0~7时, P=1,输出高电平。 当P0~7=Q0~7时, P=0,输出低电平。 系统时钟频率很高的时候,IOR’#H和IOW#会很窄,译码电路延迟太大的话,等到译码结果出来,IOW#和IOR#可能已经撤销。 注意:当系统时钟频率很高的时候,译码电路的延迟不能太大
(2)使用异或门+地址开关方法 用异或门代替比较器和地址开关比较。 如用2片74LS136代替74LS688。 74LS136: 逻辑: 3=1⊕2;6=4⊕5; 8=9⊕10;11=12⊕13; =1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 VCC GND 74LS136 连线: 异或门的输入端分别接地址线和开关线。 片选:各异或门的输出“或”的结果。
思考题1 ?
思考题1 的答案 300H 301H 302H 303H 304H 305H 306H 307H
__ 00~1FH 40~5FH __ 80~9FH _________ __ 100~11FH __ __ 思考题2 15 1 __ Y0 00~1FH 40~5FH 80~9FH _________ 100~11FH A 14 2 __ B 74LS138 13 3 __ C 12 5 11 __ G2B 4 10 __ G2A 6 9 G1 AEN# 7 Y7 A9~A0共10根线参与地址译码,请将上图的空填对。
A6 00~1FH 40~5FH A7 80~9FH A8 100~11FH C0~DFH A5 A9 140~15HH AEN# 思考题2的答案 A9A8A7A6A5A4A3A2A1A0 第一步 ? ? ? ? ? ×× ××× 第二步 0 ? ? ? 0 ×× ××× 第三步 0 C B A 0 × × ××× Y0 Y7 A B C G2B G2A G1 15 14 13 12 11 10 9 7 1 2 3 4 5 6 74LS138 AEN# # A6 A7 A8 A5 A9 00~1FH 40~5FH 80~9FH 100~11FH C0~DFH 140~15HH 180~19FH 1C0~1DFH
思考题3 Y6 A B C 74LS138 G1 G2A # G2B # A0 A1 CS# A2 某接口芯片 & IOR# IOW# 要求接口芯片的端口地址范围为260H,262H,264H,266H,268H,26AH,26CH,26EH,请问A0~A9这10根线需要怎么连。
思考题3答案 0000 0010 0100 0110 1000 1010 1100 1110 × × × 0 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 260H 262H 264H 266H 268H 26AH 26CH 26EH 1 0 0 1 1 0 A A6 A5 A4 B 74LS138 某接口芯片 C G1 ≥1 A9 A0 A7 A8 Y6 CS# G2A # A1 A2 A3 A2 A1 IOR# A0 & G2B # IOW#
按图上的连接方法,该接口芯片一共有几个端口?每个端口的地址分别是多少? 思考题4 Y2 A B C 74LS138 A3 A4 A5 G1 & A6 A7 G2B # IOR# IOW# 某接口片 CS# A0 A1 G2A # A8 A9 ≥1 按图上的连接方法,该接口芯片一共有几个端口?每个端口的地址分别是多少?
思考题4答案 A9A8A7A6A5A4A3A2A1A0 D0H D4H 0 0 1 1 0 1 0 × 0 0 共4个端口 0 0 1 1 0 1 0 × 0 0 0 1 1 0 1 1 D0H D4H D1H 或 D5H D2H D6H D3H D7H 共4个端口 地址是: Y2 A B C 74LS138 A3 A4 A5 G1 & A6 A7 G2B # IOR IOW 某接口片 CS# A0 A1 G2A # A8 A9 ≥1
现在希望一个地址译码能够译码出以下地址: Y0#地址为000~00FH/100~10FH/200~20FH/300~30FH 思考题5 现在希望一个地址译码能够译码出以下地址: Y0#地址为000~00FH/100~10FH/200~20FH/300~30FH Y1#地址为010~01FH/110~11FH/210~21FH/310~31FH …… …… Y7#地址为070~07FH/170~17FH/270~27FH/370~37FH 请设计这个译码电路。 用138和688组合