1.IO端口定義
1.1 I/O端口
端口(Port)是接口電路中能被CPU直接訪問的寄存器(端口是寄存器,寄存器是存儲器,容量小速度快)。CPU通過這些地址即端口向接口電路中的寄存器發送命令,讀取狀態和傳送數據,因此,一個接口可以有幾個端口,如狀態口、數據口和命令口,分別對應於狀態寄存器、數據寄存器和命令寄存器。
● 狀態端口
狀態端口(State Port)主要用來指示外部設備的當前狀態。每種狀態用一個二進制位表示,每個外部設備可以有幾個狀態位,它們可被CPU讀取,以測試或檢查外部設備的狀態,決定程序的流程。一般接口電路中常見的狀態位有准備就緒位(Ready)、外部設備忙位(Busy)、錯誤位(Error)等。
● 數據端口
數據端口(Data Port)用以存放外部設備送往CPU的數據以及CPU輸出到外部設備去的數據。這些數據是主機和外部設備之間交換的最基本信息,長度一般為1-4字節。數據端口主要起數據緩沖作用。
● 命令端口
命令端口(Command Port)也稱控制端口(Control Port),用來存放CPU向接口發出的各種命令和控制字,以便控制接口或設備的動作。接口功能不同,接口芯片的結構也就不同,控制字的格式和內容自然各不相同。一般可編程接口芯片往往具有工作方式命令字、操作命令字等。
1.2 I/O操作
通常所說的I/O操作是指對I/0端口的操作,而不是對I/O設備的操作,即CPU所訪問的是與I/O設備相關的端口,而不是I/O設備本身。而I/O操作也就是CPU對端口寄存器的讀寫操作。CPU對數據端口進行一次讀或寫操作也就是與該接口連接的外部設備進行一次數據傳送;CPU對狀態端口進行一次讀操作,就可以獲得外部設備或接口自身的狀態代碼;CPU把若干位控制代碼寫入控制端口,則意味着對該接口或外部設備發出一個控制命令,要求該接口或外部設備按規定的要求工作。
2.編址方式
I/O端口的編址方式主要有兩種:內存與I/O端口統一編址和I/O端口單獨編址。
(1)統一編址
統一編址是指在整個存儲空間中划分出一部分地址空間給外設端口使用,即把每一個I/O端口看作一個存儲單元,與存儲單元一樣編址,訪問存儲器的所有指令均可用來訪問I/O端口,不用設置專門的I/O指令,所以稱為存儲器映射I/O編址方式,地址空間分布情況如圖1-9所示 。 摩托羅拉公司的MC6800及68HC05等處理器就采用了這種方式訪問I/O設備。
這種方式的優點:
- 在於I/O端口的地址空間較大,
- 對端口進行操作的指令功能較強,
- 使用時靈活方便。
這種方式的缺點是
- 端口占用了存儲器的地址空間,
- 使存儲器容量減小,
- 另外指令長度比專門I/O指令要長,因而執行速度較慢。
(2)獨立編址
獨立編址是指對系統中的I/O端口單獨編址,與內存單元的地址空間相互分開,各自獨立,采用專門的I/O指令來訪問具有獨立空間的I/O端口,地址空間分布情況如圖1-10所示 。8086/8088系統中就采用這種編址方式。
優點:
- 不占用內存單元的有效地址空間,
- 地址譯碼器較簡單,
- 端口操作指令長度較短,
- 執行速度較快。
以上這兩種I/O編址方式各有利弊,不同類型的CPU可根據外部設備特點采用不同的編制方式。
3. I/O端口地址分配與地址譯碼技術
項目名:
設計一個有6組I/O端口地址的譯碼電路
項目要求與目的:
(1)項目要求:通過項目了解74LS138譯碼器進行地址譯碼的方法和工作原理。
(2)項目目的:
●了解74LS138譯碼器的真值表。
●了解用譯碼器設計I/O端口地址的方法。
項目說明:
74LS138譯碼器有8個輸出,本項目只用其中6個。而地址線的高5位A5~A9經過74LS138譯碼器,分別產生DMA控制器8237A、中斷控制器8259A、定時/計數器8254、並行接口8255A等接口芯片的片選信號,而地址線的低5位A0~A4作為接口芯片內部寄存器的訪問地址。由74LS138譯碼器真值表可知,當地址為000~01XH時,使輸出為低,選中8237A,由於低位地址線A0~A3已接8237A,故8237A的端口地址為000H~01FH。其他端口與此同理,如8259A的片選地址是02X~03XH,端口地址為020~03FH。
項目電路圖:
一個有6組I/O端口地址的譯碼電路如圖1-9所示。電路由地址總線、控制總線、74LS138譯碼器和門電路等組成。
3.1 地址分配
I/O端口地址分配
不同類型的微機系統采用不同的I/O地址編排方式,I/O地址空間的划分也各不相同。對80x86而言,采用獨立編排方式,I/O端口地址的16位,最大尋址范圍為64K個地址。但是,在IBM-PC機及其兼容機的設計中,主板上只用了10位I/O端口地址線,因此支持的I/O端口數位1024個,地址空間為0000H~03FFH,並且把前512個端口分配給了主板,后512個端口分配給了擴展槽上的常規外設。后來在PC/AT系統中,作了一些調整,其中前256個端口(000~0FFH)供系統板上的I/O接口芯片使用,如表1-2所示。后768(100~3FFH)供擴展槽上的I/O接口控制卡使用,如表1-2所示。按照I/O設備的配置情況,I/O接口的硬件分為如下兩類。
(1) 系統板上的I/O接口
系統板上的I/O接口也稱為板內接口,尋址到的都是可編程大規模集成電路,完成相應的板內接口操作。如定時/計數器、中斷控制器、DMA控制器、並行接口等。隨着大規模集成電路的發展,所以I/O接口芯片或控制器都已經集成在一片或幾片大規模集成電路芯片中,形成了主板芯片組,並命名為南/北橋、MCH/ICH等。表1-2所示的各種接口芯片,雖然在主板上不能看見,但是仍然完整地存在於主板芯片組中(一般都在南橋中),其板內地址也保持不變。
(2)擴展卡上的I/O接口
擴展卡主要是指插接在主板插槽上的接口卡,通過系統總線與CPU系統相連。這些擴展卡一般由若干個集成電路按一定得邏輯組成一個部件,如軟驅卡、硬驅卡、圖形卡、聲卡、打印卡、串行通信卡等,如表1-3所示。
3.2 譯碼
I/O端口地址譯碼
微機系統中有多個接口存在,接口內部往往包含多個端口,CPU是通過地址對不同的端口加以區分的。把CPU送出的地址轉變為芯片選擇和端口區分依據的就是地址譯碼電路。每當CPU執行輸入輸出指令時,就進入I/O端口讀寫周期,此時首先是端口地址有效,然后是I/O讀寫控制信號TOR或有效,這樣就可以很好的把端口地址譯碼產生的譯碼信號同或結合起來,一同控制對I/O端口讀或者寫。接口地址譯碼方法很多,下面主要介紹兩種。
(1)用門電路進行I/O端口地址譯碼
門電路譯碼就是采用與門、與非門、反相器及或非門等簡單邏輯門器件,如74LS20、74LS30、74LS32、74LS08、74LS04等,構成譯碼電路。這是一種最基本的I/O端口地址譯碼方法,下面通過舉例來說明設計方法。
【例1-5】 使用74LS20/30/32和74LS04設計I/O端口地址為2F8H的只讀譯碼電路。
分析:若要產生2F8H端口地址,則譯碼電路的輸入地址就應具有如表1-4所示的值。
設計:按照表1-4中地址表的值,采用門電路就可以設計出譯碼電路,如圖1-10(a)所示。
圖1-10(a)中AEN信號必須參加譯碼,因為AEN為高電平時,I/O處於DMA方式,或信號由DMA控制器發出;AEN為低電平時,I/O處於正常方式,或信號由CPU發出。因為該接口電路中I/O處於正常方式,AEN必須為低電平,故用AEN信號參加譯碼來區分這兩種方式。
同理可設計出能執行讀/寫操作的2E2H端口地址的譯碼電路,如圖1-10(b)所示。
(2)譯碼器進行I/O端口地址譯碼
若接口電路中需要使用多個端口地址,則可采用譯碼器來進行譯碼。譯碼器的型號有很多,常用的譯碼器有3-8譯碼器74LS138;4-16譯碼器74LS154;雙2-4譯碼器74LS139、74LS155等。下面通過舉例來說明設計方法。
【例1-6】 使用74LS138設計一個系統板是上接口芯片的I/O端口地址譯碼電路,並且讓每個接口芯片內部的端口數目為32個。
分析:由於系統板上的I/O端口地址分配在000~0FFH范圍內,故只使用低8位地址線,這意味着A9和A8兩位應賦0值。為了讓每個被選中的芯片內部擁有32個端口,只要留出5根低地址線不參加譯碼,其余的高位地址線作為74LS138的輸入線,參加譯碼,或作為74LS138的控制線與AEN一起,控制74LS138的譯碼是否有效。由上述分析,可以得到譯碼電路輸入地址線的值,如表1-5所示。
對於譯碼器74LS138的分析有兩點:一是它的控制信號線G1、和。只有當滿足控制信號線G1為高電平, ==0時,74LS138才能進行譯碼。二是譯碼的邏輯關系,即輸入(C,B,A)與輸入(Y0~Y7)的對應關系。74LS138輸入/輸出的邏輯關系,如表1-6所示。
從表1-6可知,若滿足控制條件,即G1為高電平, ==0,則由輸入端C、B、A的編碼來決定輸出:CBA=000,則為低電平,其他輸出端為高電平;CBA=001,為低電平,其他輸出端為高電平;…;CBA=111,為低電平,其他輸出端為高電平。由此可分別產生8個譯碼輸出信號(低電平)。若控制條件不滿足,則輸出全“1”,不產生譯碼輸出信號,即譯碼無效。