《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 基于FPGA的PCI總線接口多通道DMA控制器的設(shè)計與實(shí)現(xiàn)
基于FPGA的PCI總線接口多通道DMA控制器的設(shè)計與實(shí)現(xiàn)
吳 杰 張保平
摘要: 利用FPGA芯片設(shè)計PCI總線接口的多通道DMA控制器的基本原理及實(shí)現(xiàn)方法。
關(guān)鍵詞: FPGA PCI總線 DMA控制器 QuickLogic
Abstract:
Key words :

  摘  要: 利用FPGA芯片設(shè)計PCI總線接口的多通道DMA控制器的基本原理及實(shí)現(xiàn)方法。
  關(guān)鍵詞: FPGA  PCI  DMA  BD

   在現(xiàn)代測控系統(tǒng)和通信領(lǐng)域,對數(shù)據(jù)傳輸速率要求越來越高。對于一般的多通道通信應(yīng)用,為了減輕CPU負(fù)擔(dān)實(shí)現(xiàn)數(shù)據(jù)的高速傳輸,采用多路DMA控制器進(jìn)行DMA方式傳輸尤其重要。此外,總線性能也是制約通信能力的重要因素,ISA、EISA和MCA等擴(kuò)展總線已無法適應(yīng)高速數(shù)據(jù)傳輸?shù)囊?,而PCI局部總線以其優(yōu)異的性價比和適應(yīng)性已成為大多數(shù)系統(tǒng)的主流總線。多通道DMA控制器提供PCI和Local 2種總線接口,實(shí)現(xiàn)了CPU和通信控制器之間數(shù)據(jù)的DMA方式傳輸控制;支持burst傳輸和BD操作,完成二總線上多通道之間的總線仲裁和狀態(tài)轉(zhuǎn)換。因此,利用FPGA芯片設(shè)計實(shí)現(xiàn)PCI界面的多通道DMA控制器成為多通道高速通信的首選解決方案。
1  芯片選擇和設(shè)計應(yīng)用
  本設(shè)計選用Quicklogic公司的QL5232-208  FPGA芯片來滿足設(shè)計要求。QL5232-208可提供32位/33MHz PCI Master/Target ESP(硬核),支持3.3V/5V PCI接口應(yīng)用環(huán)境,符合PCI2.2規(guī)范。QL5232 有12萬門、1 302個邏輯單元,25 344位的RAM可用于構(gòu)建FIFO。目前的設(shè)計可實(shí)現(xiàn)4通道雙向DMA控制器。內(nèi)部控制器和接口邏輯用VHDL語言實(shí)現(xiàn),移植方便,可以加快開發(fā)進(jìn)程。
  本多通道DMA控制器設(shè)計已經(jīng)應(yīng)用于路由器中多通道高速同步串行接口模塊,其硬件框圖如圖1所示。它與CPU接口采用標(biāo)準(zhǔn)的32位PCI總線,可以接多至5個高速串口模塊,每個模塊可提供8個同/異步串行接口(V35/V28接口),同步串口速率可達(dá)2Mbps。最大傳輸速率可達(dá)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內(nèi)核)和可編程邏輯。ESP與CPU接口提供標(biāo)準(zhǔn)的PCI總線,與內(nèi)部邏輯提供主/從控制器接口線;可編程邏輯部分包括內(nèi)部寄存器、配置空間、Slave直接寫模式、DMA讀、DMA寫等功能模塊。其內(nèi)部結(jié)構(gòu)框圖如圖2所示。

 


  ESP是FPGA芯片內(nèi)含的硬核PCI 控制器,符合32位/33MHz PCI 2.2規(guī)范的主/從(Master/Target)控制器。ESP作為Master時,支持0插入等待周期的PCI burst傳輸;作為Target時,讀操作插入3個等待周期,寫操作自動插入2個等待周期。PCI Master接口提供Mst_Burst_Req(Input)信號,由用戶控制請求使用PCI總線。PCI Target接口提供Usr_Select、Usr_Rdy(Input)信號由用戶控制設(shè)備地址是否譯碼選中及Target設(shè)備是否準(zhǔn)備好,可用于插入等待周期;提供Usr_Adr_Valid(Output)信號則通知設(shè)備地址期開始,地址和命令信息有效;提供Usr_Adr_Inc(Output)信號則指示前一個數(shù)據(jù)傳輸結(jié)束,地址應(yīng)該增加。此外,與用戶可編程的接口還提供讀寫信號、地址數(shù)據(jù)線、命令/字節(jié)使能線、系統(tǒng)出錯報告等信號線。
  內(nèi)部寄存器包括DMA命令狀態(tài)寄存器、中斷結(jié)果寄存器、BD list首址寄存器、PCI通道訪問地址寄存器、Local Bus通道訪問地址寄存器、DMA長度計數(shù)器(包括PCI總線DWORD計數(shù)器和Local Bus字節(jié)計數(shù)器)。為節(jié)省資源,用RAM實(shí)現(xiàn)這些寄存器功能。配置空間實(shí)現(xiàn)標(biāo)準(zhǔn)的256字節(jié)寄存器空間配置?;芳拇嫫饔玫?0位要求210字節(jié)的PCI空間。配置空間模塊還實(shí)現(xiàn)地址和讀寫譯碼功能。
  多通道DMA控制器模塊是設(shè)計的核心,主要完成對內(nèi)部寄存器Target的讀寫及對后端接口芯片直接存取模式和DMA傳輸功能。DMA傳輸時,DMA控制器在PCI總線和Local總線上都作為Master。配置空間操作結(jié)束后,通過Target操作讀寫內(nèi)部寄存器和后端芯片片內(nèi)寄存器。DMA讀寫使能后,控制器自動完成傳輸全過程:包括二總線上請求、總線仲裁、讀寫傳輸。
  FIFO用于實(shí)現(xiàn)總線速率匹配。PCI總線為32位/33MHz,而Local總線僅為16位/10MHz。因而為提高總線利用率,每個DMA通道需要一個32位的FIFO用于數(shù)據(jù)暫存,以實(shí)現(xiàn)PCI總線和Local 總線間的速率匹配,支持多通道同時通信傳輸。
3  功能實(shí)現(xiàn)
  DMA控制器內(nèi)部訪問操作可分為Direct Slave mode 模式和DMA mode模式。
3.1 Direct Slave mode模式直接訪問操作
  CPU訪問DMA控制器內(nèi)部寄存器、后端通信控制器SAB82538內(nèi)部寄存器或SAB82538 I/O口(中斷方式)的操作都屬于Direct Slave mode模式。CPU對配置空間寄存器訪問操作完全遵循標(biāo)準(zhǔn)的PCI總線配置讀寫操作時序,對DMA控制器內(nèi)其他寄存器的讀寫操作符合PCI Target訪問時序。完整的訪問周期包括:地址期Usr_Adr_Valid信號有效時,配置空間實(shí)現(xiàn)地址和讀寫命令譯碼,若設(shè)備選中則Usr_Select信號有效并通知內(nèi)核響應(yīng)DEVSEL#、TRDY#信號有效;IRDY#信號有效時則完成一次數(shù)據(jù)傳輸,同時Usr_Adr_Inc信號有效地址自動增加。
CPU對后端通信控制器進(jìn)行訪問時,包括PCI總線和Local總線上的讀寫操作。PCI總線仍需符合PCI Target訪問時序。由于數(shù)據(jù)要通過FIFO實(shí)現(xiàn)二總線速率匹配,且FIFO僅暫存數(shù)據(jù)而不保留地址等其他信息,故要求CPU連續(xù)發(fā)起對后端的訪問時,必須確定前次的Local總線訪問已經(jīng)結(jié)束,才能響應(yīng)新的數(shù)據(jù)傳輸。尤其是寫操作時會出現(xiàn)Local總線滯后于PCI總線操作的情況,故必須在PCI訪問時序中插入等待周期,否則會造成數(shù)據(jù)丟失錯誤。此問題可以通過判斷上次Local訪問是否結(jié)束來決定Usr-Rdy狀態(tài),控制TRDY#信號是否響應(yīng)來解決。
3.2 DMA mode模式DMA訪問操作
  DMA傳輸時需要CPU初始化DMA控制器內(nèi)部相關(guān)寄存器,之后,DMA作為PCI master和Local master自動完成多通道總線仲裁和數(shù)據(jù)傳輸。Direct Slave mode比DMA mode優(yōu)先級高,即Local總線DMA數(shù)據(jù)傳輸可能被CPU訪問后端控制器操作而中止。
  完整的DMA操作過程可分為PCI總線和Local總線操作。發(fā)送時數(shù)據(jù)通過PCI總線從系統(tǒng)Memory到DMA內(nèi)部發(fā)送FIFO,再從DMA FIFO通過Local總線到SAB82538 XFIFO。接收時數(shù)據(jù)通過Local總線將數(shù)據(jù)從SAB82538 RFIFO傳到DMA內(nèi)部接收FIFO,然后再通過PCI總線操作將數(shù)據(jù)寫入系統(tǒng)Memory。DMA 控制器在2種總線上均為Master,其內(nèi)部FIFO起二總線速率匹配作用。數(shù)據(jù)在二總線上的操作并沒有直接的關(guān)系,僅通過DMA內(nèi)部FIFO狀態(tài)實(shí)現(xiàn)控制。
  (1)Local Bus DMA訪問操作。該訪問操作即是后端通信控制器SAB82538和DMA控制器之間的數(shù)據(jù)傳輸。SAB82538工作在Demand mode和非Demand mode模式。非Demand mode時,Local總線傳輸僅由DMA決定是否結(jié)束控制,不考慮后端通信控制器狀態(tài)。在Demand mode時,Local總線傳輸過程由SAB82538控制DRT/DRR信號是否有效來決定請求或撤消讀寫控制。SAB82538內(nèi)部有DRT0~7、DRR0~7共16個信號分別用于8個通道的DMA讀、寫請求。
  設(shè)計中Local總線的發(fā)送采用Demand mode模式。CPU寫SAB82538內(nèi)部發(fā)送長度計數(shù)器并使能相關(guān)通道發(fā)送后,SAB82538發(fā)DRT請求,經(jīng)仲裁獲得Local總線且DMA對應(yīng)通道的發(fā)送FIFO非空,則數(shù)據(jù)從16位Local總線發(fā)送到SAB82538 XFIFO;若DRT撤消或DMA FIFO空,則Local傳輸暫停;如果DMA未完成,則等下一次DRT請求時仍按上述操作進(jìn)行,直到傳輸結(jié)束。一次發(fā)送DMA過程可能會有多次暫停,因?yàn)镾AB82538 XFIFO限制每次DRT請求最多可接收32字節(jié),需要多次DRT請求才能完成一個幀發(fā)送。若Local總線發(fā)送采用非Demand mode模式,則不管DRT的狀態(tài)如何,只要DMA內(nèi)部發(fā)送FIFO非空,即請求Local總線傳輸,不適于與SAB82538接口。
  設(shè)計中Local總線接收操作采用非Demand mode模式。SAB82538驅(qū)動DRR信號請求接收,通過DMA控制器產(chǎn)生中斷通知CPU,CPU讀相應(yīng)中斷結(jié)果寄存器并初始化DMA相應(yīng)通道接收寄存器,啟動一次DMA傳輸。初始化后通道請求Local總線傳輸,獲得總線后數(shù)據(jù)從SAB82538 RFIFO傳送到DMA對應(yīng)通道接收FIFO,直到DMA 接收FIFO滿或DMA傳輸完成,Local總線操作即停止。采用Demand mode模式時不需要初始化接收長度寄存器。當(dāng)DRR請求并獲得Local總線后即開始數(shù)據(jù)傳輸,直到DRR撤消請求,但在與SAB82538接口時不適用。
  Local總線共有4個雙向通道,在總線空閑時根據(jù)4個通道請求按輪流優(yōu)先級原則實(shí)現(xiàn)總線仲裁。在每個通道內(nèi)部,發(fā)送和接收操作按固定優(yōu)先級仲裁,二者結(jié)合最終決定獲得總線權(quán)的通道操作。在總線有效的通道DMA操作過程中,可以被更高優(yōu)先級的直接存取模式操作中止,但不能被其他通道DMA操作中斷,必須在DMA自動撤消請求從而使總線進(jìn)入空閑狀態(tài)時才能進(jìn)行新的總線仲裁,進(jìn)入下一次通道操作。
  (2)PCI總線DMA訪問操作。該操作共有27種狀態(tài):總線空閑、最后周期讀/寫操作、DMA發(fā)送/接收操作時讀BD、DMA讀/寫傳輸、發(fā)送或接收結(jié)束回寫B(tài)D標(biāo)志,如圖3所示。idle代表總線空閑狀態(tài);rd_wt/wr_wt分別代表總線進(jìn)入最后讀寫周期狀態(tài);Rdn/Wrn分別代表DMA讀/寫傳輸狀態(tài);rd_rd_bdn/rd_wr_bdn分別代表DMA發(fā)送/接收時讀BD狀態(tài), wb_rd_bdn/wb_wr_bdn分別代表DMA發(fā)送/接收結(jié)束時回寫B(tài)D標(biāo)志狀態(tài)(n=0~3,表示通道號)。

 


  發(fā)送/接收時請求讀BD的條件為DMA讀/寫使能、DMA長度計數(shù)器為0、不是最后一個BD,請求有效后總線為進(jìn)入rd_rd_bdn/rd_wr_bdn狀態(tài);請求DMA讀寫傳輸?shù)臈l件為DMA長度計數(shù)器非0,讀時FIFO空,寫時FIFO非空,請求有效后總線為進(jìn)入Rdn/ Wrn狀態(tài);回寫發(fā)送/接收BD標(biāo)志的請求條件為DMA長度計數(shù)器為0,此請求在通道內(nèi)部具有最高優(yōu)先級。
  在圖3中,左半邊為DMA寫操作,右半邊為DMA讀操作。總線空閑時根據(jù)各通道請求進(jìn)行總線仲裁,進(jìn)入讀/寫B(tài)D或DMA發(fā)送/接收狀態(tài)。在讀/寫傳輸結(jié)束前請求進(jìn)入最后讀/寫周期狀態(tài)??偩€在完成最后數(shù)據(jù)的傳輸后回到空閑狀態(tài),才能開始再次的總線仲裁進(jìn)入新的工作狀態(tài)。在各個工作狀態(tài)數(shù)據(jù)傳輸過程中出現(xiàn)系統(tǒng)錯誤或校驗(yàn)錯誤時,總線也會返回空閑狀態(tài)。
  每個通道有多個狀態(tài)請求,但只有1個總線請求信號。整個仲裁過程分為通道請求仲裁和通道內(nèi)部狀態(tài)請求仲裁2個過程,占用2個時鐘周期完成。系統(tǒng)空閑狀態(tài)時,先按輪流優(yōu)先級原則對4個通道請求仲裁,判斷下一個總線占用的通道狀態(tài),并在緊接的下個周期內(nèi),對已獲得總線的通道6種狀態(tài)(讀、寫、讀BD、寫B(tài)D、最后讀周期、最后寫周期)請求按固定優(yōu)先級原則仲裁,最終確定獲得總線的通道及其操作。整個DMA傳輸過程是:初始化DMA寄存器(BD首址、DMA使能、狀態(tài)命令初始化)——讀BD狀態(tài)——DMA傳輸——回寫B(tài)D標(biāo)志位。
  BD既能有效用來對數(shù)據(jù)進(jìn)行封包用于收發(fā)通信,又要能夠控制DMA的傳輸,其基本結(jié)構(gòu)包括幀狀態(tài)、SIZE、NEXT BD POINTER、DATA BUFFER POINTER等。這些信息由CPU來填寫,而DMA控制器讀取這些信息來控制DMA的傳輸。CPU只需寫B(tài)D鏈?zhǔn)字返紻MA控制器內(nèi)部寄存器,而DMA控制器使能后可以自動讀取BD的信息,并以這些信息來控制DMA的自動傳輸。DMA傳輸完了BD 所指BUFFER后,需要回寫結(jié)束標(biāo)志給BD。讀BD狀態(tài)操作共讀取3DWORD,包括DMA地址、DMA長度及下一個BD地址,且數(shù)據(jù)暫存在寄存器中,只有整個burst傳輸正確完成后,各暫存值才會更新相應(yīng)寄存器,否則,仍要重新請求等待仲裁后再去讀BD狀態(tài)。
  多通道DMA支持burst傳輸操作,每次burst長度最大設(shè)為8DWORD。當(dāng)DMA長度大于最大burst長度時,DMA傳輸要分多次完成,要求在仲裁的第2個周期更新burst長度計數(shù)器和DMA地址計數(shù)器。在DMA傳輸過程中,地址和長度計數(shù)器隨數(shù)據(jù)傳輸而改變。但總線的這2個寄存器只表示正在傳輸?shù)耐ǖ罓顟B(tài),因此每個通道的各個狀態(tài)還需要有各自的地址寄存器和長度計數(shù)器,以保存在沒有獲得總線權(quán)時的信息。在PCI總線仲裁后,要根據(jù)獲得總線的通道寄存器狀態(tài)更新總線的地址寄存器和burst長度計數(shù)器,并要在DMA傳輸過程中保持總線寄存器與正在進(jìn)行操作的通道相應(yīng)寄存器結(jié)果一致。
  本文介紹了利用FPGA芯片設(shè)計PCI界面的多通道DMA控制器的實(shí)現(xiàn)方法,經(jīng)過功能仿真和時序仿真,可完全實(shí)現(xiàn)多通道的DMA控制功能,在實(shí)際應(yīng)用中取得了良好效果。
參考文獻(xiàn)
1   侯伯亨.VHDL硬件描述語音與數(shù)字邏輯電路設(shè)計.西安:西安電子科技大學(xué)出版社,1999
2   李貴山.PCI局部總線.西安:西安電子科技大學(xué)出版社,1997
3   裘宗燕譯.程序設(shè)計實(shí)踐.北京:機(jī)械工業(yè)出版社,2000
4   吳靖譯.IP交換技術(shù)協(xié)議與體系結(jié)構(gòu).北京:機(jī)械工業(yè)出版社,1999
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。