摘 要: 利用FPGA芯片設計PCI總線接口的多通道DMA控制器的基本原理及實現方法。
關鍵詞: FPGA PCI DMA BD
在現代測控系統和通信領域,對數據傳輸速率要求越來越高。對于一般的多通道通信應用,為了減輕CPU負擔實現數據的高速傳輸,采用多路DMA控制器進行DMA方式傳輸尤其重要。此外,總線性能也是制約通信能力的重要因素,ISA、EISA和MCA等擴展總線已無法適應高速數據傳輸的要求,而PCI局部總線以其優異的性價比和適應性已成為大多數系統的主流總線。多通道DMA控制器提供PCI和Local 2種總線接口,實現了CPU和通信控制器之間數據的DMA方式傳輸控制;支持burst傳輸和BD操作,完成二總線上多通道之間的總線仲裁和狀態轉換。因此,利用FPGA芯片設計實現PCI界面的多通道DMA控制器成為多通道高速通信的首選解決方案。
1 芯片選擇和設計應用
本設計選用Quicklogic公司的QL5232-208 FPGA芯片來滿足設計要求。QL5232-208可提供32位/33MHz PCI Master/Target ESP(硬核),支持3.3V/5V PCI接口應用環境,符合PCI2.2規范。QL5232 有12萬門、1 302個邏輯單元,25 344位的RAM可用于構建FIFO。目前的設計可實現4通道雙向DMA控制器。內部控制器和接口邏輯用VHDL語言實現,移植方便,可以加快開發進程。
本多通道DMA控制器設計已經應用于路由器中多通道高速同步串行接口模塊,其硬件框圖如圖1所示。它與CPU接口采用標準的32位PCI總線,可以接多至5個高速串口模塊,每個模塊可提供8個同/異步串行接口(V35/V28接口),同步串口速率可達2Mbps。最大傳輸速率可達132MBps,與后端控制器采用Local Bus接口。CPU采用Motorola 公司的MPC8240,串口通信控制器采用SIEMENS公司的SAB82538(8串口同/異步串口通信控制器)。
2 多通道DMA控制器功能模塊
多通道DMA控制器與CPU接口采用32位/33MHz PCI2.2局部總線,接口線包括CLK、FRAME#、TRDY#、IRDY#、STOP#、DEVSEL#、IDSEL、AD[31:0]、C/BE[3:0]、PERR#、SERR#、REQ#、GNT#、RST#。與串口通信控制器采用Local Bus,接口信號線包括LCLK、LHOLD、LHOLDA、ADS#、LW/R#、BLAST#、LA[31:2]、LD[31:0]。
FPGA芯片包括ESP(PCI內核)和可編程邏輯。ESP與CPU接口提供標準的PCI總線,與內部邏輯提供主/從控制器接口線;可編程邏輯部分包括內部寄存器、配置空間、Slave直接寫模式、DMA讀、DMA寫等功能模塊。其內部結構框圖如圖2所示。
ESP是FPGA芯片內含的硬核PCI 控制器,符合32位/33MHz PCI 2.2規范的主/從(Master/Target)控制器。ESP作為Master時,支持0插入等待周期的PCI burst傳輸;作為Target時,讀操作插入3個等待周期,寫操作自動插入2個等待周期。PCI Master接口提供Mst_Burst_Req(Input)信號,由用戶控制請求使用PCI總線。PCI Target接口提供Usr_Select、Usr_Rdy(Input)信號由用戶控制設備地址是否譯碼選中及Target設備是否準備好,可用于插入等待周期;提供Usr_Adr_Valid(Output)信號則通知設備地址期開始,地址和命令信息有效;提供Usr_Adr_Inc(Output)信號則指示前一個數據傳輸結束,地址應該增加。此外,與用戶可編程的接口還提供讀寫信號、地址數據線、命令/字節使能線、系統出錯報告等信號線。
內部寄存器包括DMA命令狀態寄存器、中斷結果寄存器、BD list首址寄存器、PCI通道訪問地址寄存器、Local Bus通道訪問地址寄存器、DMA長度計數器(包括PCI總線DWORD計數器和Local Bus字節計數器)。為節省資源,用RAM實現這些寄存器功能。配置空間實現標準的256字節寄存器空間配置?;芳拇嫫饔玫?0位要求210字節的PCI空間。配置空間模塊還實現地址和讀寫譯碼功能。
多通道DMA控制器模塊是設計的核心,主要完成對內部寄存器Target的讀寫及對后端接口芯片直接存取模式和DMA傳輸功能。DMA傳輸時,DMA控制器在PCI總線和Local總線上都作為Master。配置空間操作結束后,通過Target操作讀寫內部寄存器和后端芯片片內寄存器。DMA讀寫使能后,控制器自動完成傳輸全過程:包括二總線上請求、總線仲裁、讀寫傳輸。
FIFO用于實現總線速率匹配。PCI總線為32位/33MHz,而Local總線僅為16位/10MHz。因而為提高總線利用率,每個DMA通道需要一個32位的FIFO用于數據暫存,以實現PCI總線和Local 總線間的速率匹配,支持多通道同時通信傳輸。
3 功能實現
DMA控制器內部訪問操作可分為Direct Slave mode 模式和DMA mode模式。
3.1 Direct Slave mode模式直接訪問操作
CPU訪問DMA控制器內部寄存器、后端通信控制器SAB82538內部寄存器或SAB82538 I/O口(中斷方式)的操作都屬于Direct Slave mode模式。CPU對配置空間寄存器訪問操作完全遵循標準的PCI總線配置讀寫操作時序,對DMA控制器內其他寄存器的讀寫操作符合PCI Target訪問時序。完整的訪問周期包括:地址期Usr_Adr_Valid信號有效時,配置空間實現地址和讀寫命令譯碼,若設備選中則Usr_Select信號有效并通知內核響應DEVSEL#、TRDY#信號有效;IRDY#信號有效時則完成一次數據傳輸,同時Usr_Adr_Inc信號有效地址自動增加。
CPU對后端通信控制器進行訪問時,包括PCI總線和Local總線上的讀寫操作。PCI總線仍需符合PCI Target訪問時序。由于數據要通過FIFO實現二總線速率匹配,且FIFO僅暫存數據而不保留地址等其他信息,故要求CPU連續發起對后端的訪問時,必須確定前次的Local總線訪問已經結束,才能響應新的數據傳輸。尤其是寫操作時會出現Local總線滯后于PCI總線操作的情況,故必須在PCI訪問時序中插入等待周期,否則會造成數據丟失錯誤。此問題可以通過判斷上次Local訪問是否結束來決定Usr-Rdy狀態,控制TRDY#信號是否響應來解決。
3.2 DMA mode模式DMA訪問操作
DMA傳輸時需要CPU初始化DMA控制器內部相關寄存器,之后,DMA作為PCI master和Local master自動完成多通道總線仲裁和數據傳輸。Direct Slave mode比DMA mode優先級高,即Local總線DMA數據傳輸可能被CPU訪問后端控制器操作而中止。
完整的DMA操作過程可分為PCI總線和Local總線操作。發送時數據通過PCI總線從系統Memory到DMA內部發送FIFO,再從DMA FIFO通過Local總線到SAB82538 XFIFO。接收時數據通過Local總線將數據從SAB82538 RFIFO傳到DMA內部接收FIFO,然后再通過PCI總線操作將數據寫入系統Memory。DMA 控制器在2種總線上均為Master,其內部FIFO起二總線速率匹配作用。數據在二總線上的操作并沒有直接的關系,僅通過DMA內部FIFO狀態實現控制。
(1)Local Bus DMA訪問操作。該訪問操作即是后端通信控制器SAB82538和DMA控制器之間的數據傳輸。SAB82538工作在Demand mode和非Demand mode模式。非Demand mode時,Local總線傳輸僅由DMA決定是否結束控制,不考慮后端通信控制器狀態。在Demand mode時,Local總線傳輸過程由SAB82538控制DRT/DRR信號是否有效來決定請求或撤消讀寫控制。SAB82538內部有DRT0~7、DRR0~7共16個信號分別用于8個通道的DMA讀、寫請求。
設計中Local總線的發送采用Demand mode模式。CPU寫SAB82538內部發送長度計數器并使能相關通道發送后,SAB82538發DRT請求,經仲裁獲得Local總線且DMA對應通道的發送FIFO非空,則數據從16位Local總線發送到SAB82538 XFIFO;若DRT撤消或DMA FIFO空,則Local傳輸暫停;如果DMA未完成,則等下一次DRT請求時仍按上述操作進行,直到傳輸結束。一次發送DMA過程可能會有多次暫停,因為SAB82538 XFIFO限制每次DRT請求最多可接收32字節,需要多次DRT請求才能完成一個幀發送。若Local總線發送采用非Demand mode模式,則不管DRT的狀態如何,只要DMA內部發送FIFO非空,即請求Local總線傳輸,不適于與SAB82538接口。
設計中Local總線接收操作采用非Demand mode模式。SAB82538驅動DRR信號請求接收,通過DMA控制器產生中斷通知CPU,CPU讀相應中斷結果寄存器并初始化DMA相應通道接收寄存器,啟動一次DMA傳輸。初始化后通道請求Local總線傳輸,獲得總線后數據從SAB82538 RFIFO傳送到DMA對應通道接收FIFO,直到DMA 接收FIFO滿或DMA傳輸完成,Local總線操作即停止。采用Demand mode模式時不需要初始化接收長度寄存器。當DRR請求并獲得Local總線后即開始數據傳輸,直到DRR撤消請求,但在與SAB82538接口時不適用。
Local總線共有4個雙向通道,在總線空閑時根據4個通道請求按輪流優先級原則實現總線仲裁。在每個通道內部,發送和接收操作按固定優先級仲裁,二者結合最終決定獲得總線權的通道操作。在總線有效的通道DMA操作過程中,可以被更高優先級的直接存取模式操作中止,但不能被其他通道DMA操作中斷,必須在DMA自動撤消請求從而使總線進入空閑狀態時才能進行新的總線仲裁,進入下一次通道操作。
(2)PCI總線DMA訪問操作。該操作共有27種狀態:總線空閑、最后周期讀/寫操作、DMA發送/接收操作時讀BD、DMA讀/寫傳輸、發送或接收結束回寫BD標志,如圖3所示。idle代表總線空閑狀態;rd_wt/wr_wt分別代表總線進入最后讀寫周期狀態;Rdn/Wrn分別代表DMA讀/寫傳輸狀態;rd_rd_bdn/rd_wr_bdn分別代表DMA發送/接收時讀BD狀態, wb_rd_bdn/wb_wr_bdn分別代表DMA發送/接收結束時回寫BD標志狀態(n=0~3,表示通道號)。
發送/接收時請求讀BD的條件為DMA讀/寫使能、DMA長度計數器為0、不是最后一個BD,請求有效后總線為進入rd_rd_bdn/rd_wr_bdn狀態;請求DMA讀寫傳輸的條件為DMA長度計數器非0,讀時FIFO空,寫時FIFO非空,請求有效后總線為進入Rdn/ Wrn狀態;回寫發送/接收BD標志的請求條件為DMA長度計數器為0,此請求在通道內部具有最高優先級。
在圖3中,左半邊為DMA寫操作,右半邊為DMA讀操作??偩€空閑時根據各通道請求進行總線仲裁,進入讀/寫BD或DMA發送/接收狀態。在讀/寫傳輸結束前請求進入最后讀/寫周期狀態??偩€在完成最后數據的傳輸后回到空閑狀態,才能開始再次的總線仲裁進入新的工作狀態。在各個工作狀態數據傳輸過程中出現系統錯誤或校驗錯誤時,總線也會返回空閑狀態。
每個通道有多個狀態請求,但只有1個總線請求信號。整個仲裁過程分為通道請求仲裁和通道內部狀態請求仲裁2個過程,占用2個時鐘周期完成。系統空閑狀態時,先按輪流優先級原則對4個通道請求仲裁,判斷下一個總線占用的通道狀態,并在緊接的下個周期內,對已獲得總線的通道6種狀態(讀、寫、讀BD、寫BD、最后讀周期、最后寫周期)請求按固定優先級原則仲裁,最終確定獲得總線的通道及其操作。整個DMA傳輸過程是:初始化DMA寄存器(BD首址、DMA使能、狀態命令初始化)——讀BD狀態——DMA傳輸——回寫BD標志位。
BD既能有效用來對數據進行封包用于收發通信,又要能夠控制DMA的傳輸,其基本結構包括幀狀態、SIZE、NEXT BD POINTER、DATA BUFFER POINTER等。這些信息由CPU來填寫,而DMA控制器讀取這些信息來控制DMA的傳輸。CPU只需寫BD鏈首址到DMA控制器內部寄存器,而DMA控制器使能后可以自動讀取BD的信息,并以這些信息來控制DMA的自動傳輸。DMA傳輸完了BD 所指BUFFER后,需要回寫結束標志給BD。讀BD狀態操作共讀取3DWORD,包括DMA地址、DMA長度及下一個BD地址,且數據暫存在寄存器中,只有整個burst傳輸正確完成后,各暫存值才會更新相應寄存器,否則,仍要重新請求等待仲裁后再去讀BD狀態。
多通道DMA支持burst傳輸操作,每次burst長度最大設為8DWORD。當DMA長度大于最大burst長度時,DMA傳輸要分多次完成,要求在仲裁的第2個周期更新burst長度計數器和DMA地址計數器。在DMA傳輸過程中,地址和長度計數器隨數據傳輸而改變。但總線的這2個寄存器只表示正在傳輸的通道狀態,因此每個通道的各個狀態還需要有各自的地址寄存器和長度計數器,以保存在沒有獲得總線權時的信息。在PCI總線仲裁后,要根據獲得總線的通道寄存器狀態更新總線的地址寄存器和burst長度計數器,并要在DMA傳輸過程中保持總線寄存器與正在進行操作的通道相應寄存器結果一致。
本文介紹了利用FPGA芯片設計PCI界面的多通道DMA控制器的實現方法,經過功能仿真和時序仿真,可完全實現多通道的DMA控制功能,在實際應用中取得了良好效果。
參考文獻
1 侯伯亨.VHDL硬件描述語音與數字邏輯電路設計.西安:西安電子科技大學出版社,1999
2 李貴山.PCI局部總線.西安:西安電子科技大學出版社,1997
3 裘宗燕譯.程序設計實踐.北京:機械工業出版社,2000
4 吳靖譯.IP交換技術協議與體系結構.北京:機械工業出版社,1999