文章目錄
9.1 8237A 的組成與工作原理
9.1.1 DMA傳送
用 DMA
方式傳送數據時,傳送過程完全由 DMA
控制器(DMAC
)控制。其基本功能:
DMAC
能向CPU的HOLD
腳發出DMA
請求信號。- CPU響應
DMA
請求後,DMAC
獲得總線控制權,由它控制數據的傳送,CPU則暫停工作。 - 能提供讀/寫存儲器或I/O設備的各種控制命令。
- 確定數據傳輸的始址和數據長度(CPU配置的),每傳送1個數據便自動修改地址(
+1
或-1
),數據長度-1
。 - 傳送完畢,能發出結束
DMA
傳送的信號。 - CPU在每個非鎖定時鐘週期結束後,都會檢測
HOLD
腳上有無DMA
請求?若有,便轉入DMA
傳送週期。
8237A
是高性能可編程 DMA
控制器,主要特點:
- 含
4
個通道,每通道有64K
地址(16位)和字節計數能力(16位)。 - 有
4
種傳送方式:單字節傳送、數據塊傳送、請求傳送、級聯傳送。 - 每個通道的
DMA
請求可被允許或禁止。4
個通道的DMA
請求有不同優先級,優先級可以是固定的,也可以是循環的。 - 任一通道完成數據傳送後,會自動產生過程結束信號
EOP
(End of Process
,不常用),結束DMA
傳送;還可從外界輸入EOP
信號,中止正執行的DMA
傳送。
8237A
的兩種工作狀態
1)從態方式
開始 DMA
傳送前,8237A
是系統總線的從屬設備,由CPU對它進行編程,如指定通道、傳送方式和類型、內存單元起始地址、地址是遞增還是遞減以及要傳送的總字節數等等;CPU也可讀取 DMAC
的狀態。
2)主態方式
當 8237A
取得總線控制權後,它就完全控制了系統,使I/O設備和存儲器之間或者存儲器與存儲器之間進行直接的數據傳送。
8237A
芯片的內部結構和外部連接與這兩種工作狀態密切相關。
9.1.2 8237A的內部結構
-
時序與控制邏輯
從態時,接收系統時鐘、復位、片選和讀/寫等信號,完成相應控制操作;主態時, 向系統發控制信號。
其中與設備相連的是 ,其他的要麼和CPU相連,要麼和系統總線相連。
是主態時進行內存讀寫的命令。 -
優先級編碼電路
對同時提出DMA
請求HRQ(Hold Request)
的多個通道進行排隊判優,決定哪個通道優先級最高,然後進行響應HLDA(Hold Acknowledge)
。
可選固定或循環優先級。某個優先級高的設備服務時,禁止其它通道請求。 -
數據和地址緩衝器組
8237A的A7~A4
(單向輸出)、A3~A0
(雙向:從態時A3-A0
輸入有4根線,說明佔了16
個端口地址;主態時:A3-A0
、A7-A4
、DB7-DB0
共16根地址線往內存輸出,讀或寫數據) 爲地址線;
DB7~DB0
在從態時傳輸(CPU配置或讀取DMA的)數據,主態時傳送地址。它們都與三態緩衝器相連,便於接管或釋放。 -
命令控制邏輯
從態時接收CPU送來的寄存器選擇信號(A3~A0
),選擇寄存器;主態時譯碼方式字的D1D0
,以確定操作類型。A3~A0
與 、 配合組成各種操作命令。 -
內部寄存器組
每通道有16
位基址寄存器、基字計數器、當前地址寄存器、當前字計數器以及6
位工作方式寄存器。
片內還有命令寄存器、屏蔽寄存器、請求寄存器、狀態寄存器和暫存寄存器。
不可編程的字數暫存器和地址暫存器。
9.1.3 8237A的引腳功能
8237A
爲 40
引腳 DIP
封裝, 引腳排列:
CLK
時鐘信號,輸入
8237A
時鐘頻率3MHz
,8237A-5
爲5MHz
。- 片選信號,輸入,低電平有效。
從態方式下選中8237A
,接受CPU對它的編程等。 READY
準備好,輸入,高電平有效
慢速I/O
設備或存儲器參與DMA
傳送時,可使READY
變低,讓8237A
在DMA
週期中插入等待週期TW
;當它們準備就緒時READY
變高。A3~A0
低4
位地址線
從態爲輸入,尋址8237A
內部寄存器,實現編程;主態時輸出要訪問內存的低4
位地址。A7-A4
高4
位地址線
始終是輸出或浮空,主態時輸出4
位地址信息A7-A4
。DB7-DB0
8
位數據線,與系統數據總線相連。- 從態時,CPU經過數據線讀取各有關寄存器內容,並對各寄存器編程。
- 主態時,由它們輸出高
8
位地址A15-A8
,並由ADSTB
信號將它們鎖存到外部的高8
位地址寄存器中,與A7-A0
輸出的低8
位地址構成16
位地址。 - 存儲器-存儲器傳送方式下,源存儲器讀出的數據,經它們送暫存寄存器,暫存器中數據再經它們寫到目的存儲單元中。
AEN
地址允許信號,輸出,高電平有效
送出鎖存的高8
位地址,與芯片輸出的低8
位地址一起構成16
位內存偏址。同時使連到CPU的地址鎖存器無效,保證地址線上的信號來自DMAC
。ADSTB
地址選通信號,輸出,高電平有效
選通外部地址鎖存器,將DB7~DB0
上的高8
位地址送到外部的地址鎖存器。-
I/O
讀信號,雙向。
從態時,控制CPU讀取8237A
內部寄存器。
主態時,與 配合,控制數據由外設傳到存儲器中。 DREQ3~DREQ0
通道3~0
的DMA
請求信號,輸入
外設請求DMA
服務時,向這些引腳發請求信號,有效極性由編程確定。固定優先級時,DREQ0
的優先級最高,編程可改變優先級。HRQ
保持請求信號,輸出,高電平有效
向CPU的HOLD
端發出的DMA
請求信號,可從8237A
任一個未被屏蔽的通道發出。HLDA
保持響應信號,輸入,高電平有效
與CPU的HLDA
相連,CPU收到HRQ
信號後,至少經過1個時鐘週期後,使HLDA
變高,表示已讓出總線控制權,8237A
收到HLDA
信號後,便開始DMA
傳送。DACK3~DACK0
通道3~0
的DMA
響應信號,輸出
其有效電平極性由編程確定。相應通道開始DMA
傳送後,DACKi
有效,通知外部電路現已進入DMA
週期。- 傳輸過程結束信號,雙向,低電平有效
DMA
傳送中,任一通道的字計數器減爲0
,再由0
減爲FFFFH
而終止計數時,會在 引腳上輸出低電平信號,表示DMA
傳輸結束。
也可在 腳上輸入低電平信號來終止DMA
傳送。
若通道設置成自動預置狀態,該通道完成一次DMA
傳送,出現 信號後,又能自動恢復有關寄存器的初值,繼續執行另一次DMA
傳送。
9.1.4 8237A的內部寄存器
8237A的內部可編程寄存器主要有 10
種:
-
當前地址寄存器
16
位,每通道1
個,存放DMA
傳送的存儲器地址值。每傳送1
個數據,地址值自動+1
或-1
,指向下個單元。
編程時可寫入初值,也可被讀出,但每次只能讀/寫8
位,所以讀/寫要兩次完成。
自動預置操作方式,在 有效時,會重裝入基地址值。 -
當前字計數寄存器
16
位,每通道1
個,編程時置其初值爲實際傳送字節數少1。每傳送1
字節,自動-1
。由0~FFFFH
時,將產生終止計數信號TC
。
自動預置操作方式,在 有效時,會重裝入基字計數寄存器的內容。 -
基地址寄存器
16
位,每通道1
個,存放通道當前地址寄存器初值,與當前地址寄存器地址一樣,編程時寫入相同值。
其內容不能讀出和修改。用在自動預置操作時,使當前地址寄存器恢復到初值。 -
基字計數寄存器
16
位,每通道1
個,存放通道當前字計數器初值,該值也是編程時與當前字計數器一起寫入的。
其內容不能讀出和修改,用於自動預置操作時,使當前字計數器恢復到初值。 -
命令寄存器
全局,8
位,控制8237A
的操作。由CPU編程來設置8327A
操作方式, 復位時清除。
D0
位:能否進行存儲器到存儲器傳送,D0=1
允許。並規定先用通道0
從源單元讀入1
字節放入暫存器,然後由通道1
把該字節寫到目的單元,接着兩通道的地址分別+1
或-1
,通道1
的字計數器-1
,它減爲0
時產生終止計數信號TC
,並輸出 信號,終止DMA
服務。D1
位:存儲器到存儲器傳送時,通道0
地址能否保持不變。D1=1
,通道0
在傳送中保持同一地址,從而可把該單元中的數寫入一組存儲單元。D1=0
禁止。當D0=0
時這種方法無效。D2
位:允許或禁止8237A
工作,D2=0
允許,D2=1
則禁止。D4
位 優先權控制。D4=0
爲固定優先權,通道0
優先級最高;D4=1
爲循環優先權,剛服務過的通道i
優先權最低,而通道i+1
優先權最高。隨着DMA
操作不斷進行優先權不斷循環,防止某通道長時間佔用總線。D6
位:決定DREQ
的有效電平,0
高電平有效,1
則低電平有效。D7
位:決定DAC
K的有效電平,1
高電平有效,0
則低電平有效。D3
位和D5
位:有關時序的操作,見後面時序討論。
-
工作方式寄存器
6
位,每通道1
個,選擇DMA
的傳送方式和類型等,格式:
-
D1D0
位:選擇通道,並進一步由D2-D7
指定選定通道的工作方式。這樣4
個通道可合用1
個方式寄存器。 -
D3D2
位:決定所選通道的DMA
操作類型。從3
種DMA
傳送類型中選定一種:
10
:讀傳送,存儲器->I/O設備, 發 ,
01
:寫傳送,存儲器<-I/O設備, 發 ,
00
:校驗傳送,僞傳送,8237A
會產生地址信息和
信號,不會發出讀寫控制信號,用於測試。 -
D4
位:所選通道是否進行自動預置操作。如果D4=1
,則選擇自動預置。 -
D5
位:方向控制位。D5=0
數據傳送由低址向高址方向進行,每傳送1
字節,地址+1
。D5=1
時傳送方向相反。 -
D7D6
位:定義所選通道操作方式。有4
種傳送方式:
1) 單字節傳送方式(常用於軟盤)
每次DMA操作只傳送1
字節。之後字計數器-1
,地址寄存器+1
或-1
,HRQ
無效,釋放系統總線。當字計數器由0
減爲FFFFH
時,產生終止信號TC
。
此後即使DREQ
繼續有效,8237A
的HRQ
輸出仍進入無效狀態並讓出總線,由CPU控制至少一個總線週期。2) 數據塊傳輸方式
進入DMA
服務後,可連續傳輸一批數據,直到字計數器由0
減爲FFFFH
產生TC
信號,或從外部送來 信號時,才釋放總線,結束DMA
傳輸。3)請求傳送方式
也連續傳送數據,直到字計數器由0
減爲FFFFH
產生TC
,或外界送來 信號。但每傳送1
字節後,都要測試DREQ
端,一旦發現此信號無效,馬上停止。
地址和字計數器的中間值會被保存在通道的現行地址和字計數器中,外設準備好新數據時,可使DREQ
再變爲有效,又從斷點處繼續進行傳輸。4)級聯傳送方式
連接多個8237A
以擴充DMA
通道,連線見圖11.5。
主片DREQ
—從片HRQ
,主片DACK
—從片HLDA
,主片HRQ
和HLDA
與CPU的HOLD
和HLDA
相連。1
塊主片可連4
塊從片。主片置爲級聯傳送,從片設成其它三種方式。主片不輸出地址和讀寫信號。
-
-
請求寄存器
相應請求位置1
時,對應通道可產生DMA
請求。相應位可由DREQ
信號置1,也可寫入通道請求字來置1
或清0
。
D1D0
位選通道號,D2
位爲請求位。請求位不能屏蔽,其優先權受優先權邏輯控制,TC
或外部的 信號能將相應的請求位清0
,RESET
信號則使整個請求寄存器清0
。
-
屏蔽寄存器
4
位,1
個/通道。禁止/允許對應通道的DREQ
請求進入請求寄存器。有兩種屏蔽字,端口地址不同。
1)通道屏蔽字
可對該寄存器寫入通道屏蔽字來對單個屏蔽位置1
/復位。通道屏蔽字格式與通道請求字格式類似:
2)主屏蔽字
還允許用主屏蔽命令設置通道的屏蔽觸發器。D3~D0
位對應通道3~0
的屏蔽位,1
屏蔽,0
清除屏蔽。可寫入主屏蔽字,一次完成4
個通道的屏蔽位設置。可用軟件同時清除4
個通道的屏蔽位。
-
狀態寄存器
8
位狀態寄存器存放狀態信息,供CPU讀出。如D3~D0
中置1
的通道,已達計數終點TC
或外部送來了 信號。D7-D4
中置1
的通道,DMA
請求還未處理。復位或被讀出後,相應狀態位被清除。狀態字格式:
-
暫存寄存器
在存儲器->存儲器傳送時,保存所傳送的數據。其中始終保存着最後1
個傳送的字節,RESET
信號會將其清除。編程狀態下,可由CPU讀出這個字節。 -
軟件命令
編程狀態下,8237A
可執行3
個附加的特殊軟件命令,只要對特定端口進行一次寫操作,命令就會生效。
1)清除先/後觸發器
8237A
僅8
根數據線,而地址寄存器和字計數器均爲16
位,CPU要分兩次讀寫。先/後觸發器控制高低字節讀寫次序。清0
讀寫低8
位,隨後自動置1
,讀寫高8
位。接着又清0
,… 。對該觸發器所在的寄存器執行一次寫操作便清0
,復位和 信號有效也將它清爲0
。
2)主清命令
主清命令也稱爲復位命令,功能與RESET
信號同,它可使命令寄存器、狀態寄存器、請求寄存器、暫存寄存器和內部先/後觸發器均清0
,而把屏蔽寄存器置1
。復位後,8237A
進入空閒狀態。
3)清除屏蔽寄存器
該命令能清除4
個通道的全部屏蔽位,允許各通道接受DMA
請求。 -
各寄存器的端口地址
對8237A
內部寄存器讀寫時, 端必須爲低電平,該信號由高位地址經I/O譯碼後產生。
A3~A0
線選擇不同寄存器,共佔16
個I/O端口地址。常將它們與地址總線低4
位A3~A0
相連,選擇各寄存器。
例如,PC/XT
機中,地址A9~A4=000000
時,經I/O譯碼電路選中8237A
,使其有效。 地址A3~A0
與8237A
的A3~A
0腳連接實現片內尋址。因此基地址=00H
,記爲DMA=00H
。由此可得其他寄存器的地址,如DMA+00H
爲通道0
基地址與當前地址寄存器地址,DMA+08H
爲狀態寄存器地址等:
9.2 8237A的時序
空閒週期 SI
:未發生 DMA
請求時
- 檢測
CS
:CPU是否對其操作 - 檢測
DREQ
:外設是否有請求
過渡狀態 S0
:DMAC
發出 HRQ
之後,收到 HLDA
之前。
有效週期:DMAC
收到 HLDA
之後,接管總線:
包括 4
個狀態週期(S1、S2、S3、S4
),慢速I/O或M還可通過令 READY=0
申請插入 SW
,8237A-5
在 S3
中檢測 READY
,SW
中的操作同 S3
:
S1
:更新高8位地址,AEN
、ADSTB
有效,DMAC
將M
的A8~15
放到DB0~7
上;只有當A8~15
有變化時纔出現S2
:選中兩個介質,輸出16
位地址選中M
:低8
位由A0~7
直接輸出;高8
位由DB0~7
經外部鎖存器(由ADSTB
下降沿鎖存)輸出;發出有效的DACK
選中I/OS3
:讀週期。發出IOR
(DMA寫)或MEMR
(DMA讀),從源讀數據到DB0~7
,等待寫週期。S4
:寫週期。發出MEMW
(DMA寫)或IOW
(DMA讀),將DB0~7
上的數據寫到目標中。
擴展寫:寫提前到與讀同時開始(S3
),與讀一樣擴展到 2
個時鐘週期。
壓縮時序:去掉 S3
,讀與寫同爲 1
個時鐘週期。
SW
:慢速I/O或M傳送時,在 S3
和 S4
間插入 SW
。
9.3 8237A的編程和應用舉例
9.3.1 DMA系統組成
PC機的DMA系統:
- 8237A-5
- 頁面地址寄存器
- 總線裁決邏輯
9.3.2 DMA系統有效地址的生成
第一代PC機中的地址是 20
位的,而 8237A
是 16
位的。爲此需要一個 74LS670
擴展地址。
1. 74LS670工作原理
74LS670
的 RA,RB
和 DACK2,DACK3
連接,內有 4
個 4
位寄存器。讀寫分開控制:
- 寫:;
WA、WB
:寫入寄存器選擇;D1~4
:數據輸入 - 讀:;
RA、RB
:讀出寄存器選擇;Q1~4
:數據輸出
2. DMA系統有效地址的生成
如何提供存儲器的地址:
A16~19
:由74LS670
提供;A8~15
:由8237A-5
的DB0~7
經74LS373
提供;A0~7
:由8237A-5
的A0~7
直接提供;
如何對I/O設備尋址,用 DACK
信號取代芯片選擇和片內端口選擇:
3. IBM-PC微機的DMA系統
單片 DMAC
的 DMA
系統:4
個通道;8
位傳送;1MB
尋址;64KB
計數
雙片DMAC的DMA系統:
7
個通道;16MB
尋址;64KB
計數- 片(0):
8
位傳送 - 片(1):使用偶地址;
16
位傳送
如果我們打開設備管理器,可以在直接內存訪問控制器中看到上圖雙片DMAC結構中,出現的端口地址。
4. DMA系統的初始化
注意事項:
- 初始化前要對芯片檢測
- 初始化前禁止工作或屏蔽通道
- 所有通道的方式寄存器均加載
- 要初始化頁面地址寄存器
初始化編程:
① PC機檢測芯片(8
個 16
位寄存器全 1
、全 0
的讀寫)及加載校驗方式:
MOV AL, 04H ;0000_0100:前4位默認配置,正常時序,禁止工作,CR0地址不保持,禁止內存到內存
OUT DMA+08H, AL ;寫入命令寄存器
OUT DMA+OCH, AL ;清先後觸發器
MOV AL, 0FFH ;1111_1111:全1的讀寫測試
C16: MOV BL, AL ;全1或全0
MOV BH, AL ;全1或全0
...
...
MOV CX, 8 ;對8個寄存器做讀寫測試
MOV DX, DMA ;從DMA開始測試
C17: OUT DX, AL ;全1或全0寫入DX
OUT DX, AL ;再寫一次,16位寫兩次,先寫低八位,再寫高八位
IN AL, DX ;讀出低八位
MOV AH, AL ;
IN AL, DX ;讀出高八位,放入AX中
CMP BX, AX ;和之前保存的AL對比
JE C18 ;如果相同,證明該寄存器沒有出錯
HLT ;不相同則停機
C18: INC DX ;DX端口號+1
LOOP C17 ;再重複循環
...
INC AL ;AL+1=全0
JE C16 ;爲0,跳轉回C16,做全0測試
...
...
...
...
...
...
SUB AL, AL ;AL清0
OUT DMA+08H, AL ;寫入命令寄存器,高4位按照默認配置,低4位正常時序,允許工作,其他位默認;啓用芯片
;下面將40H,41H,42H,43H先後寫入工作方式寄存器,,即對全部的通道寫入同樣的工作方式
MOV AL, 40H ;0100_0000針對0號通道
OUT DMA+0BH, AL ;單字節方式,地址遞增,禁止地址預置,校驗方式
MOV AL, 41H ;0100_0001針對1號通道
OUT DMA+0BH, AL ;單字節方式,地址遞增,禁止地址預置,校驗方式
MOV AL, 42H ;0100_0010針對2號通道
OUT DMA+0BH, AL ;單字節方式,地址遞增,禁止地址預置,校驗方式
MOV AL, 43H ;0100_0011針對3號通道
OUT DMA+0BH, AL ;單字節方式,地址遞增,禁止地址預置,校驗方式
5. DMA傳送的應用
例:利用級聯的 IBM PC/AT
的 8237
主片通道 5
,將內存其始地址爲 80000H
的280H
字節的內容直接輸出到外部設備。
MOV AL, 04H ;命令字, 禁止82C37工作
OUT 0D0H, AL ;寫命令寄存器
MOV AL, 0
OUT 0D8H, AL ;清除先/後觸發器
OUT 0C4H, AL ;寫低位地址
OUT 0C4H, AL ;寫高位地址
MOV AL,04H ;頁面地址爲8
OUT 08BH, AL ;寫頁面寄存器
MOV AX, 280H ;傳輸字節數
DEC AX
OUT 0C6H, AL ;寫字節數低位
MOV AL, AH
OUT 0C6H, AL ;寫字節數高位
MOV AL, 89H ;方式字: 單字節讀, 地址加1
OUT 0D6H, AL
MOV AL, 05H ;寫請求寄存器
OUT 0D2H, AL
DMA控制器與I/O設備的連接:DMAEN
是 DMA
申請允許信號;軟盤接口中的數據輸出寄存器(3F2H
)的 D3
位控制,高有效
ROM-BIOS
中軟盤 DMA_SETUP
:
AL
——方式字(CH2
,單一傳送,非自動預置,地址增量)42H:DMA
校驗(軟盤校驗)46H:DMA
寫(讀軟盤)4AH:DMA
讀(寫軟盤)ES:BX
——內存首址DH
——要傳送的扇段數
字節數/扇段在磁盤基址區 DISK_BASE
的 3
號單元
0
:128
字節/扇段1
:256
字節/扇段2
:512
字節/扇段3
:1024
字節/扇段
DMA_SETUP PROC
PUSH CX ;保護現場
CLI
OUT DMA+12, AL ;清先/後觸發器
OUT DMA+11, AL ;設置方式
;形成物理地址
MOV AX, ES
MOV CL, 4
ROL AX, CL
MOV CH, AL
AND AL, 0F0H
ADD AX, BX
JNC J33
INC CH
J33: PUSH AX ;低16位地址入棧
...
;設置地址寄存器及頁面地址
OUT DMA+4, AL ;寫低16位地址
MOV AL, AH
OUT DMA+4, AL
MOV AL, CH
AND AL, 0FH ;寫高4位地址
OUT 81H, AL
;設置字節計數器
MOV BX, 6
CALL GET_PAM ;取DISK_BASE的3號單元作爲移位次數
MOV CL, AH
MOV AH, DH
SUB AL, AL
SHR AX, 1
SHL AX, CL
DEC AX
PUSH AX ;N-1入棧保護
...
OUT DMA+5, AL
MOV AL, AH
OUT DMA+5, AL
STI
;判DMA是否超界
POP CX ;用低16位地址與N-1相加設置CF
POP AX
ADD AX, CX
POP CX ;恢復現場
MOV AL, 02H
OUT DMA+10, AL
RET
DMA_SETUP ENDP