DMA直接內存存取原理


  DMADMA直接內存存取原理是指外部設備不通過CPU而直接與系統內存交換數據的接口技術。

  要把外設的數據讀入內存或把內存的數據傳送到外設,一般都要通過CPU控制完成,如CPU程序查詢或中斷方式。利用中斷進行數據傳送,可以大大提高CPU的利用率

    但是采用中斷傳送有它的缺點,對於一個高速I/O設備,以及批量交換數據的情況,只能采用DMA方式,才能解決效率和速度問題。DMA在外設與內存間直接進行數據交換,而不通過CPU,這樣數據傳送的速度就取決於存儲器和外設的工作速度。

  通常系統的總線是由CPU管理的。在DMA方式時,就希望CPU把這些總線讓出來,即CPU連到這些總線上的線處於第三態--高阻狀態,而由DMA控制器接管,控制傳送的字節數,判斷DMA是否結束,以及發出DMA結束信號。DMA控制器必須有以下功能:

  1. 能向CPU發出系統保持(HOLD)信號,提出總線接管請求;

  2. 當CPU發出允許接管信號后,負責對總線的控制,進入DMA方式;

  3. 能對存儲器尋址及能修改地址指針,實現對內存的讀寫操作;

  4. 能決定本次DMA傳送的字節數,判斷DMA傳送是否結束

  5. 發出DMA結束信號,使CPU恢復正常工作狀態。

 

如圖是DMA控制器硬件結構示意圖。DMA直接內存存取原理

  DMA的可能引腳說明:

  數據總線:用於傳送數據。

  地址總線:用於選擇存儲器地址。

  數據傳送信號:MEMR為存儲器讀操作信號,MEMW為存儲器寫操作信號,IOR為外設讀操作信號,IOW為外設寫操作信號。

  DRQ:DMA請求信號。是外設向DMA控制器提出要求DMA操作的申請信號。

  DACK:DMA響應信號。是DMA控制器向提出DMA請求的外設表示已收到請求和正進行處理的信號。

  HOLD:總線請求信號。是DMA控制器向CPU要求讓出總線的請求信號。

  HLDA:總線響應信號,是CPU向DMA控制器表示允許總線請求的應答信號。


5.2   DMA工作方式   

  隨着大規模集成電路技術的發展,DMA傳送已不局DMA直接內存存取原理限於存儲器與外設間的信息交換,而可以擴展為在存儲器的兩個區域之間,或兩種高速的外設之間進行DMA傳送,如所示。

  DMAC是控制存儲器和外部設備之間直接高速地傳送數據的硬件電路,它應能取代CPU,用硬件完成數據傳送的各項功能。

  各種DMAC一般都有兩種基本的DMA傳送方式:

1. 單字節方式:每次DMA請求只傳送一個字節數據,每傳送完一個字節,都撤除DMA請求信號,釋放總線。

2. 多字節方式:每次DMA請求連續傳送一個數據塊,待規定長度的數據塊傳送完以后,才撤除DMA請求,釋放總線。

  在DMA傳送中,為了使源和目的間的數據傳送取得同步,不同的DMAC在操作時都受到外設的請求信號或准備就緒信號--Ready信號的限制。

 

5.3 DMA控制器8237

DMA直接內存存取原理Intel 8237/8237-2是一種高功能的可編程的DMA控制器,采用5MHz的8237-2傳送,速度可達到1.6M字節/秒。

8237的主要功能

8237的DMA傳送有以下四種方式:

1. 單字節傳送方式

2. 數據塊傳送方式

3. 請求傳送方式

4. 級連方式

有一個結束處理的輸入信號EOP,允許外界用此輸入端結束DMA傳送或重新初始化。

8237可以級連,任意擴展通道數。

 

 
 


8237的系統結構圖如所示。DMA直接內存存取原理

圖中的通道部分只畫出了一個通道的情況(其實每個通道都有一個一個基地址寄存器(16位)、基字節數計數器(16位)、現行地址寄存器(16位)和現行字節計數器(16位),每一個通道都有一個6位的模式寄存器以控制不同的工作模式)。

8237的內部寄存器類型和數量如所示

8237的結構中包含了三個基本的控制邏輯塊:

1. 時序控制邏輯塊(根據編程規定的DMAC的工作模式,產生包括DMA請求、DMA傳送以及DMA結束所需要的內部時序和外部信號)
2. 程序命令控制塊;(對在DMA請求服務之前,CPU編程時給定的命令字和模式控制字進行譯碼,以確定DMA服務類型)
3. 優先權編碼邏輯。(對同時有請求的通道進行優先編碼,確定哪個通道的優先權最高。在8237中通道的優先權可能是固定的,也可以是旋轉的)

另外,緩沖器、8237的數據引線、地址引線都有三態緩沖器,因而可以接管也可以釋放總線。

 

 
 

5.3
 DMA控制器8237

8237在設計時規定它有兩種主要的工作周期,即空閑周期和有效周期,每一個周期又是由若干個時鍾周期所組成的。

1. 空閑周期(IDLE CYCLE)

   當8237的任一通道都無請求時,就進入空閑周期,在空閑周期8237始終執行SI狀態,在每一個時鍾周期都采樣通道的請求輸入線DREQ。只要無請求就始終停留在SI狀態。

   在SI狀態可由CPU對8237編程,或從8237讀取狀態(8237在SI狀態也始終采樣選片信號#CS,只要#CS信號變為有效,則為CPU要對8237進行讀/寫操作。當8237采樣到#CS為低(有效)而HRQ也為低(無效),則進入程序狀態CPU就可以寫入8237的內部寄存器,實現對8237的編程或改變工作狀態。在這種情況下,由控制信號#IOR和#IOW,地址信號A3-A0來選擇8237的內部的不同寄存器)。 由於8237內部的地址寄存器和字節數計數器都是16位的,而數據線是8位的,所以,在8237的內部有一個觸發器,稱為高/低觸發器,由它來控制寫入 16位寄存器的高8位還是低8位。8237還具有一些軟件命令,這些命令是通過對地址(A3-A0)和#IOW,#CS信號的譯碼決定的,不使用數據總 線。

2. 有效周期(Active Cycle)

   當8237在SI狀態采樣到外設有請求時,就脫離SI而進入S0狀態。當接收到HLDA,就使8237進入工作狀態,開始DMA傳送。工作狀態由S1、S2、S3、S4組成,以完成數據傳達,若外設的數據傳送速度較慢,不能在S4之前完成,則可由Ready線在S2或S3與S4之間插入SW狀態。

   在存儲器與存儲器之間的傳達,需要完成從存儲器讀和存儲器寫的操作,所以每一次傳達需要8個時鍾周期,在前四個周期S11、S12、S13、S14完成從存儲器讀,另外四個周期S21、S22、S23、S24完成存儲器寫。

 

 
 

5.3
 DMA控制器8237

8237在DMA傳送時有四種工作方式。

1. 單字節傳送方式

這種方式一次只傳送一個字節。數據傳送后字節計數器減量,地址要相應修改(增量或減量取決於編程)。HRO變為無效,釋放系統總線。若傳送使字節數減為0,TC發生或者終結DMA傳送,或重新初始化。

2.多字節傳送方式

這種傳送方式下,8237由DREQ啟動后就連續地傳送數據,直至字節數計數器減到零產生TC(Terminal Count),或者由外部輸入有效的EOP信號來終結DMA傳送。

3.請求傳送方式

在這種工作方式下,8237可以進行連續的數據傳送。當出現以下三種情況之一時停止傳送。

   1) 字節數計數器減到0,發生TC;

   2) 由外界送來一個有效的EOP信號;

   3) 外界的DREQ信號變為無效

   當由於第三種情況使傳送停下來時,8237釋放總線,CPU可以繼續操作。而8237的地址和字節數的中間值,可以保持在相應通道的現行地址和字節數寄存器中。只要外設准備好了要傳送的新的數據,由DREQ再次有效就可以使傳送繼續下去。

 

4. 級連方式

DMA直接內存存取原理  這種方式用於通過級連以擴展通道的情況。第二級的HRQ和HLDA信號連到第一級的DREQ和DACK上,如圖所示。

  第二級各個芯片的有限權等級與所連的通道相對應。在這種工作情況下,第一級只起優先權網絡的作用,除了由某一個二級的請求向CPU輸出HRQ信號外,並不輸出任何其他信號。實際的操作是由第二級的芯片完成。若有需要還可由第二級擴展到第三級等等。

 

 

 

 8237共有9類寄存器,分別是現行地址寄存器、現行字節數寄存器、基地址和基字節數寄存器、命令寄存器模式寄存器、請求寄存器、屏蔽寄存器、狀態寄存器、臨時寄存器。

  1. 現行地址寄存器

   每一個通道有一個16位的現行地址寄存器。在這個寄存器中保存着用於DMA傳送的地址值,在每次傳送后,這個寄存器的值自動增量或減量。這個寄存器的值 可由CPU寫入或讀出(分兩次連續操作)。若編程為自動初始化,則在每次EOP后,將其初始值(即保持在基地址寄存器中的值)轉入寄存器。

  2. 現行字節數寄存器

  每個通道有一個16位的現行字節數寄存器。它保持着要傳送的字節數,在每次傳送后此寄存器減量。當這個寄存器的值減為零時,TC將產生。這個寄存器的值在編程狀態可由CPU讀出和寫入。在自動初始化情況下當EOP產生時,它的值可初始化到其始狀態。

  3. 基地址和基字節數寄存器

  每個通道有一對16位的基地址和基字節數寄存器。它們存放着與現行寄存器相聯系的初始值。在自動初始化情況下。這兩個寄存器中的值,用來恢復相應的現行寄存器中的初始值。在編程狀態,基寄存器與它們相應的現行寄存器是同時由CPU寫入的。這些寄存器的內容不能讀出。

 

4. 命令寄存器DMA直接內存存取原理

  這是一個8位的寄存器,用以控制8237的工作命令字的格式如所示。

  D0位用來規定是否工作在存儲器到存儲器傳送方式。

  D4位用來選擇是固定優先權還是優先旋轉。8237有兩種優先權方式可供選擇,一種是固定優先權,在這種方式下通道的優先權是固定的,通道0的優先權最高,通道3的優先權最低;另一種方式是優先權旋轉,在這種方式下剛服務過的通道的優先權變為最低,其他通道的優先權DMA直接內存存取原理也作相應的旋轉,如下圖所示。

  命令寄存器可由CPU寫入進行編程,復位信號使其清零。

 

5. 模式寄存器DMA直接內存存取原理

   每個通道有一對8位的模式寄存器以規定通道的工作模式,如所示。

   在編程時用最低兩位來選擇寫入哪個通道的模式寄存器。

   最高兩位(D7、D6)規定了四種工作模式中的某一種,D3、D2兩位規定是DM讀還是DMA寫或是校驗操作。

   D5位用於規定地址是增量修改還是減量修改。

   D4位規定是否允許自動初始化。若工作在自動初始化方式,則每當產生EOP信號時(不論是由內部的TC產生或是由外界產生)都是基地址寄存器和基字節數寄 存器的內容,使相應的現行寄存器恢復初始值。而現行寄存器和基寄存器的內容,是由CPU編程時同時寫入的,但在DMA傳送過程中,現行寄存器的內容是不斷 修改的,而基寄存器的內容則維持不變(除非重新編程)。在自動初始化以后通道就做好了進行另一次DMA傳送的准備。

 

6. 請求寄存器DMA直接內存存取原理

8237的每個通道有一條硬件的DREQ請求線,當工作在數據塊傳送方式時,也可以由軟件發出DREQ請求。所以,在8237中有一種請求寄存器,如圖5-10所示。

每個通道的軟件請求可以分別設置。軟件請求是非屏蔽的,它們的優先權同樣受優先權邏輯的控制。

軟件請求位由TC或外部的EOP復位。Reset信號使整個寄存器清除。

只有在數據塊傳送方式,才允許使用軟件請求,若用於儲存器到儲存器傳送,則0通道必須用軟件請求,以啟動傳送過程。

 

7. 屏蔽寄存器

  每個通道外設通過DREQ發出的請求,可以單獨地屏蔽或允許,所以在8237中有一個屏蔽寄存器,如圖所示。

  在Reset信號作用后,四個通道全置於屏蔽狀態,所以,必須在編程時,根據需要復位屏蔽位。當某一個通道進行DMA傳送后,產生EOP信號,如果不是工作在自動初始化方式,則這一通道的屏蔽位置位,必須再次編程為允許,才能進行下一次的DMA傳送。

  也可以用如圖(b)所示的格式,在一個命令字中對4個通道的屏蔽情況進行編程。

 

8. 狀態寄存器DMA直接內存存取原理

  8237中有一個可由CPU讀取的狀態寄存器,如圖所示。

  狀態寄存器中的低4位,反映了在讀命令這個瞬間,每個通道的字節數是否已減到零。高4位反映每個通道的請求情況。

 

9. 臨時寄存器

    在存儲器到存儲器的傳送方式下,臨時寄存器保存從源單元讀出的數據,又由它寫入至目的單元。在傳送完成時,它保留傳送的最后一個字節,此字節可由CPU讀出。Ready信號使其復位。

  如上所術,8237內部存寄存器可以分成兩大類,一類是通道寄存器,即每個通道都有的現行地址寄存器,現行字節數寄存器和基地址及基字節數寄存器;另一類是控制和狀態寄存器。這些寄存器是由最低4位地址A3-A0以及讀寫命令來區分的。

  通道寄存器的尋址格式

  控制和狀態寄存器的尋址如下表所示。

寄存器
操作
信號
#CS #IOR #IOW A3 A2 A1 A0
命令
0   1  0  1 0 0 0
模式
0   1  0  1 0 1 1
請求
0   1  0  1 0 0 1
屏蔽
置位/復位
0   1  0  1 0 1 0
屏蔽
0   1  0  1 1 1 1
臨時
0   0  1  1 1 0 1
狀態
0   0  1  1 0 0 0

1. 軟件命令

  8237在編程狀態還有兩種軟件命令,軟件命令不需要通過數據總線寫入控制字,而由8237直接對地址和控制信號進行譯碼。命令的格式如下所示。

  1) 清除高/低觸發器

  2)  主清除命令
信號
A3  A2  A1 A0 #IOR #IOW
操作
1  0  0  0  0   1
讀狀態寄存器
1  0  0  0  1   0
寫命令寄存器
1  0  0  1  0   1
非法
1  0  0  1  1   0
寫請求寄存器
1  0  1  0  0   1
非法
1  0  1  0  1   0
寫單屏蔽寄存器位
1  0  1  1  0   1
非法
1  0  1  1  1   0
寫模式寄存器
1  1  0  0  0   1
非法
1  1  0  0  1   0
清高/低觸發器命令
1  1  0  1  0   1
讀臨時寄存器
1  1  0  1  1   0
主清除命令
1  1  1  0  0   1
非法
1  1  1  0  1   0
非法
1  1  1  1  0   1
非法
1  1  1  1  1   0
寫所有屏蔽位

2. 8237的編程步驟

  1) 輸出主清除命令

  2) 寫入基與現行地址寄存器

  3) 寫入基與現行字節數寄存器

  4) 寫入模式寄存器

  5) 寫入屏蔽寄存器

  6) 寫入命令寄存器

  7) 寫入請求寄存器。若有軟件請求,就寫入指定通道,可以開始DMA傳送的過程。若無軟件請求,則在完成了(1)--(6)的請求后,由通道的DREQ啟動DMA傳送過程。

 

3. 編程舉例

  若要利用通道0,由外設(磁盤)輸入32K字節的一個數據塊,傳送至內存8000H開始的區域(增量傳送),采用塊連續傳送的方式,傳送完不自動初始化,外設的DREQ和DACK都為高電平有效。

  要編程首先要確定端口地址。地址的低4位用以區分8237的內部寄存器,高4位地址A7--A4經譯碼后,連至選片端#CS,假定選中時高4位為5。

  初始化程序如下:

OUT 5DH, AL ;輸出主清除命令
MOV AL, 00H
OUT 50H, AL ;輸出基和現行地址的低8位
MOV AL, 80H
OUT 50H, AL ;輸出基和現行地址的高8位
MOV AL, 00H
OUT 51H, AL
MOV AL, 80H
OUT 51H, AL ;給基和現行字節數賦值
MOV AL, 84H
OUT 5BH, AL ;輸出模式字
MOV AL, 00H
OUT 5AH, AL ;輸出屏蔽字
MOV AL, 0A0H
OUT 58H, AL ;輸出命令字


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM