6.1 IO端口编址方式


6.1 IO 端口编址方式

本节摘要:外设接口里的每个寄存器都是一个端口,端口要有门牌号——统一编址把它请进内存空间,独立编址给它单开一套空间;本节讲清两种门牌制度的分野,并亲手设计一片端口译码电路。

本章主线的三种取货路径都停在同个地点:接口芯片里的端口寄存器。本站先解决"这个地点在哪"的问题——编址方式是接口技术的门牌系统,也是理解一切芯片编程的前置知识。

CPU怎么找到外设

接口电路里至少住着三类寄存器:数据口收发内容,状态口汇报外设情况,控制口接收命令。每个寄存器占一个端口地址,CPU 用地址总线选中它们,就像投递员按门牌送信。门牌制度有两种流派。

统一编址(内存映射):把一段内存地址划给端口,端口与内存共用一套地址线、一套读写指令。访问端口就是一次普通的访存——第 2 章的所有寻址方式全部适用,C 语言里一个指针就能操作端口。代价是端口啃食了内存地址空间,且访存指令动辄四五拍,端口操作的天花板被指令长度压着。ARM 与多数 RISC 架构采用此制:一张完整的内存地图上,既有 RAM 也有外设寄存器。

独立编址(端口映射):端口单开一套地址空间,用专门的 IN/OUT 指令访问,控制总线上另有专门的端口读、端口写信号与访存信号区分开。8086 的端口空间 64K:八位指令形式用立即数寻址前 256 个端口,十六位形式用 DX 间址覆盖全部空间。好处是端口空间独立增长、IN/OUT 指令短而快、访存与访问端口在总线信号上泾渭分明——译码电路因此能拿到更干净的判据。代价是专门的指令、专门的控制信号,以及"端口不能享用丰富寻址方式"的遗憾。

维度 统一编址 独立编址
地址空间 与内存共享 独立(8086 为 64K)
访问指令 全部访存指令与寻址方式 专用 IN、OUT,仅两种寻址
控制信号 与访存共用 另有端口读写信号
C 语言姿态 指针直达 需封装或内联汇编
代表阵营 ARM、RISC-V x86 家族

译码电路:门牌的检查站

CPU 抛出的地址是一整条总线,接口芯片怎么知道"这单是我的"?靠译码电路比对地址。设计一片译码电路的本质是解一道组合逻辑题:输入地址线的若干高位,输出一根片选信号。

图 6-1:一片 74LS138 完成的端口译码

图 6-1:一片 74LS138 完成的端口译码

电路设计的算法很直接。第一步分配基址:在系统的端口地图上找一块未占用的对齐区间(PC 系列的惯例是避开系统板占用的低端,取 A00H 起的用户区,示例取 360H)。第二步切分地址线:低两位给芯片内部选寄存器,中间三位接 138 的编码输入(一片 138 出八个片选),其余高位经与门、非门组合出使能条件。第三步与控制信号合闸:片选再分别与端口读、端口写信号相与,读门与写门分开。AEN 参与译码是 PC 兼容设计的铁律——DMA 抢总线期间地址总线上跑的是内存地址,若端口译码不设防,内存地址撞上端口基址就会误触发外设。这个坑在教学实验板上摔过的人不计其数。

案例展开:给实验板分一片端口

背景:综合演练(6.4 节)要在 ISA 总线实验板上挂一片 8255,需要为它分配四个端口地址。操作:查系统端口地图,确认 360H 到 367H 未被占用且对齐;低位 A1、A0 接 8255 的寄存器选择脚,A2 到 A4 接 138 编码输入,A5 到 A9 连同 AEN 组合出使能;写出真值表,化简后确认 360H、361H、362H、363H 四个地址分别选中口 A、口 B、口 C 与控制口。结果:上电后向 363H 写方式字、向口 A 写数据,万用表与逻辑笔逐一验证片选脉冲只在预期地址出现。解读:译码电路的正确性可被"逐地址扫描"穷举验证——写一段程序遍历 256 个候选地址读端口,逻辑笔上只该有一次片选脉冲,多一拍都说明使能条件写松了。变式:设备多了以后,开关式可选译码(比较器配拨码开关)让同一块板卡能改地址避让冲突——产品化的接口卡几乎都留这手。

端口地图的规矩与对齐的细节

每个成熟平台都有一张官方端口地图,新设备必须"落在空地上"。PC 系列的惯例值得参考:低段被系统板与标准设备占满——中断控制器、定时器、键盘控制器、串并口各安其位;用户扩展一般在三、四百号的区段里找对齐的空档。分配的纪律是先查地图再动焊台,两个设备撞号的症状(互相干扰、读写串线)排查起来极费时间,而撞号本可在地图阶段杜绝。

十六位端口的访问还有一道对齐的细节:用 DX 间址做十六位传送时,数据总线一次跑十六位,端口天然按偶地址对齐最顺;若把十六位端口安排在奇地址,硬件要么拆成两次访问(慢一倍),要么干脆出错。八位接口芯片挂十六位系统时,还要注明挂在低八位还是高八位——片选电路要配合 BHE 信号一起译码。这些规矩在老系统的图纸上处处可见,看懂了就知道:端口不只是编号,还带着宽度与位置的属性

译码电路还有一派"懒人方案":用地址比较器把完整基址一次性比对,拨码开关决定基址值。它的元件数比 138 方案多,胜在基址可调——批量装机时撞号了,改个拨码就化解。两派并存在市场里:板卡厂量产后用固定译码省成本,工程样机与现场可配置设备偏爱比较器方案的灵活。与 6.4 的自检思路合起来看,你会得到接口工程的完整方法论:图纸上留后路,上电时给证据。

高频追问两则

问:统一编址的平台里,为什么还要专门的操作函数而不是直接用指针? 直接用指针的风险有两层:编译器可能把访存重排或合并,打乱外设要求的寄存器访问次序;缓存可能把端口地址当内存缓存住,读到陈旧副本。所以规范平台提供专门的端口读写原语,内置"不缓存、不重排"的约束——方便与正确之间,接口工程永远先选正确。

问:端口地址会耗尽吗? 独立编址的六十四K空间在 PC 上确实紧张过,新设备纷纷迁往内存映射的 PCI 配置;嵌入式平台的端口反而宽裕。地址空间是每种编址制度的天花板,架构师在制度诞生那天就要为几十年后的租户留房。

本节要点回顾

  • 端口是接口寄存器的门牌:数据、状态、控制三类口是接口的标准配置。
  • 两制分野:统一编址省指令用空间,独立编址快而专——阵营由架构传统决定。
  • 译码三步:切地址线、定使能、分读写门,一片 138 管八个外设。
  • AEN 必须设防:DMA 期间的地址总线不属于端口,译码不禁止就是埋雷。

门牌挂好了,下一站回答"取货方式怎么选"——查询、中断、DMA 三条路径的完整对账。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U