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

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

   在現(xiàn)代測(cè)控系統(tǒng)和通信領(lǐng)域,對(duì)數(shù)據(jù)傳輸速率要求越來(lái)越高。對(duì)于一般的多通道通信應(yīng)用,為了減輕CPU負(fù)擔(dān)實(shí)現(xiàn)數(shù)據(jù)的高速傳輸,采用多路DMA控制器進(jìn)行DMA方式傳輸尤其重要。此外,總線性能也是制約通信能力的重要因素,ISA、EISA和MCA等擴(kuò)展總線已無(wú)法適應(yīng)高速數(shù)據(jù)傳輸?shù)囊?,而PCI局部總線以其優(yōu)異的性價(jià)比和適應(yīng)性已成為大多數(shù)系統(tǒng)的主流總線。多通道DMA控制器提供PCI和Local 2種總線接口,實(shí)現(xiàn)了CPU和通信控制器之間數(shù)據(jù)的DMA方式傳輸控制;支持burst傳輸和BD操作,完成二總線上多通道之間的總線仲裁和狀態(tài)轉(zhuǎn)換。因此,利用FPGA芯片設(shè)計(jì)實(shí)現(xiàn)PCI界面的多通道DMA控制器成為多通道高速通信的首選解決方案。
1  芯片選擇和設(shè)計(jì)應(yīng)用
  本設(shè)計(jì)選用Quicklogic公司的QL5232-208  FPGA芯片來(lái)滿足設(shè)計(jì)要求。QL5232-208可提供32位/33MHz PCI Master/Target ESP(硬核),支持3.3V/5V PCI接口應(yīng)用環(huán)境,符合PCI2.2規(guī)范。QL5232 有12萬(wàn)門、1 302個(gè)邏輯單元,25 344位的RAM可用于構(gòu)建FIFO。目前的設(shè)計(jì)可實(shí)現(xiàn)4通道雙向DMA控制器。內(nèi)部控制器和接口邏輯用VHDL語(yǔ)言實(shí)現(xiàn),移植方便,可以加快開(kāi)發(fā)進(jìn)程。
  本多通道DMA控制器設(shè)計(jì)已經(jīng)應(yīng)用于路由器中多通道高速同步串行接口模塊,其硬件框圖如圖1所示。它與CPU接口采用標(biāo)準(zhǔn)的32位PCI總線,可以接多至5個(gè)高速串口模塊,每個(gè)模塊可提供8個(gè)同/異步串行接口(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,接口信號(hào)線包括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時(shí),支持0插入等待周期的PCI burst傳輸;作為Target時(shí),讀操作插入3個(gè)等待周期,寫操作自動(dòng)插入2個(gè)等待周期。PCI Master接口提供Mst_Burst_Req(Input)信號(hào),由用戶控制請(qǐng)求使用PCI總線。PCI Target接口提供Usr_Select、Usr_Rdy(Input)信號(hào)由用戶控制設(shè)備地址是否譯碼選中及Target設(shè)備是否準(zhǔn)備好,可用于插入等待周期;提供Usr_Adr_Valid(Output)信號(hào)則通知設(shè)備地址期開(kāi)始,地址和命令信息有效;提供Usr_Adr_Inc(Output)信號(hào)則指示前一個(gè)數(shù)據(jù)傳輸結(jié)束,地址應(yīng)該增加。此外,與用戶可編程的接口還提供讀寫信號(hào)、地址數(shù)據(jù)線、命令/字節(jié)使能線、系統(tǒng)出錯(cuò)報(bào)告等信號(hào)線。
  內(nèi)部寄存器包括DMA命令狀態(tài)寄存器、中斷結(jié)果寄存器、BD list首址寄存器、PCI通道訪問(wèn)地址寄存器、Local Bus通道訪問(wèn)地址寄存器、DMA長(zhǎng)度計(jì)數(shù)器(包括PCI總線DWORD計(jì)數(shù)器和Local Bus字節(jié)計(jì)數(shù)器)。為節(jié)省資源,用RAM實(shí)現(xiàn)這些寄存器功能。配置空間實(shí)現(xiàn)標(biāo)準(zhǔn)的256字節(jié)寄存器空間配置?;芳拇嫫饔玫?0位要求210字節(jié)的PCI空間。配置空間模塊還實(shí)現(xiàn)地址和讀寫譯碼功能。
  多通道DMA控制器模塊是設(shè)計(jì)的核心,主要完成對(duì)內(nèi)部寄存器Target的讀寫及對(duì)后端接口芯片直接存取模式和DMA傳輸功能。DMA傳輸時(shí),DMA控制器在PCI總線和Local總線上都作為Master。配置空間操作結(jié)束后,通過(guò)Target操作讀寫內(nèi)部寄存器和后端芯片片內(nèi)寄存器。DMA讀寫使能后,控制器自動(dòng)完成傳輸全過(guò)程:包括二總線上請(qǐng)求、總線仲裁、讀寫傳輸。
  FIFO用于實(shí)現(xiàn)總線速率匹配。PCI總線為32位/33MHz,而Local總線僅為16位/10MHz。因而為提高總線利用率,每個(gè)DMA通道需要一個(gè)32位的FIFO用于數(shù)據(jù)暫存,以實(shí)現(xiàn)PCI總線和Local 總線間的速率匹配,支持多通道同時(shí)通信傳輸。
3  功能實(shí)現(xiàn)
  DMA控制器內(nèi)部訪問(wèn)操作可分為Direct Slave mode 模式和DMA mode模式。
3.1 Direct Slave mode模式直接訪問(wèn)操作
  CPU訪問(wèn)DMA控制器內(nèi)部寄存器、后端通信控制器SAB82538內(nèi)部寄存器或SAB82538 I/O口(中斷方式)的操作都屬于Direct Slave mode模式。CPU對(duì)配置空間寄存器訪問(wèn)操作完全遵循標(biāo)準(zhǔn)的PCI總線配置讀寫操作時(shí)序,對(duì)DMA控制器內(nèi)其他寄存器的讀寫操作符合PCI Target訪問(wèn)時(shí)序。完整的訪問(wèn)周期包括:地址期Usr_Adr_Valid信號(hào)有效時(shí),配置空間實(shí)現(xiàn)地址和讀寫命令譯碼,若設(shè)備選中則Usr_Select信號(hào)有效并通知內(nèi)核響應(yīng)DEVSEL#、TRDY#信號(hào)有效;IRDY#信號(hào)有效時(shí)則完成一次數(shù)據(jù)傳輸,同時(shí)Usr_Adr_Inc信號(hào)有效地址自動(dòng)增加。
CPU對(duì)后端通信控制器進(jìn)行訪問(wèn)時(shí),包括PCI總線和Local總線上的讀寫操作。PCI總線仍需符合PCI Target訪問(wèn)時(shí)序。由于數(shù)據(jù)要通過(guò)FIFO實(shí)現(xiàn)二總線速率匹配,且FIFO僅暫存數(shù)據(jù)而不保留地址等其他信息,故要求CPU連續(xù)發(fā)起對(duì)后端的訪問(wèn)時(shí),必須確定前次的Local總線訪問(wèn)已經(jīng)結(jié)束,才能響應(yīng)新的數(shù)據(jù)傳輸。尤其是寫操作時(shí)會(huì)出現(xiàn)Local總線滯后于PCI總線操作的情況,故必須在PCI訪問(wèn)時(shí)序中插入等待周期,否則會(huì)造成數(shù)據(jù)丟失錯(cuò)誤。此問(wèn)題可以通過(guò)判斷上次Local訪問(wèn)是否結(jié)束來(lái)決定Usr-Rdy狀態(tài),控制TRDY#信號(hào)是否響應(yīng)來(lái)解決。
3.2 DMA mode模式DMA訪問(wèn)操作
  DMA傳輸時(shí)需要CPU初始化DMA控制器內(nèi)部相關(guān)寄存器,之后,DMA作為PCI master和Local master自動(dòng)完成多通道總線仲裁和數(shù)據(jù)傳輸。Direct Slave mode比DMA mode優(yōu)先級(jí)高,即Local總線DMA數(shù)據(jù)傳輸可能被CPU訪問(wèn)后端控制器操作而中止。
  完整的DMA操作過(guò)程可分為PCI總線和Local總線操作。發(fā)送時(shí)數(shù)據(jù)通過(guò)PCI總線從系統(tǒng)Memory到DMA內(nèi)部發(fā)送FIFO,再?gòu)腄MA FIFO通過(guò)Local總線到SAB82538 XFIFO。接收時(shí)數(shù)據(jù)通過(guò)Local總線將數(shù)據(jù)從SAB82538 RFIFO傳到DMA內(nèi)部接收FIFO,然后再通過(guò)PCI總線操作將數(shù)據(jù)寫入系統(tǒng)Memory。DMA 控制器在2種總線上均為Master,其內(nèi)部FIFO起二總線速率匹配作用。數(shù)據(jù)在二總線上的操作并沒(méi)有直接的關(guān)系,僅通過(guò)DMA內(nèi)部FIFO狀態(tài)實(shí)現(xiàn)控制。
  (1)Local Bus DMA訪問(wèn)操作。該訪問(wèn)操作即是后端通信控制器SAB82538和DMA控制器之間的數(shù)據(jù)傳輸。SAB82538工作在Demand mode和非Demand mode模式。非Demand mode時(shí),Local總線傳輸僅由DMA決定是否結(jié)束控制,不考慮后端通信控制器狀態(tài)。在Demand mode時(shí),Local總線傳輸過(guò)程由SAB82538控制DRT/DRR信號(hào)是否有效來(lái)決定請(qǐng)求或撤消讀寫控制。SAB82538內(nèi)部有DRT0~7、DRR0~7共16個(gè)信號(hào)分別用于8個(gè)通道的DMA讀、寫請(qǐng)求。
  設(shè)計(jì)中Local總線的發(fā)送采用Demand mode模式。CPU寫SAB82538內(nèi)部發(fā)送長(zhǎng)度計(jì)數(shù)器并使能相關(guān)通道發(fā)送后,SAB82538發(fā)DRT請(qǐng)求,經(jīng)仲裁獲得Local總線且DMA對(duì)應(yīng)通道的發(fā)送FIFO非空,則數(shù)據(jù)從16位Local總線發(fā)送到SAB82538 XFIFO;若DRT撤消或DMA FIFO空,則Local傳輸暫停;如果DMA未完成,則等下一次DRT請(qǐng)求時(shí)仍按上述操作進(jìn)行,直到傳輸結(jié)束。一次發(fā)送DMA過(guò)程可能會(huì)有多次暫停,因?yàn)镾AB82538 XFIFO限制每次DRT請(qǐng)求最多可接收32字節(jié),需要多次DRT請(qǐng)求才能完成一個(gè)幀發(fā)送。若Local總線發(fā)送采用非Demand mode模式,則不管DRT的狀態(tài)如何,只要DMA內(nèi)部發(fā)送FIFO非空,即請(qǐng)求Local總線傳輸,不適于與SAB82538接口。
  設(shè)計(jì)中Local總線接收操作采用非Demand mode模式。SAB82538驅(qū)動(dòng)DRR信號(hào)請(qǐng)求接收,通過(guò)DMA控制器產(chǎn)生中斷通知CPU,CPU讀相應(yīng)中斷結(jié)果寄存器并初始化DMA相應(yīng)通道接收寄存器,啟動(dòng)一次DMA傳輸。初始化后通道請(qǐng)求Local總線傳輸,獲得總線后數(shù)據(jù)從SAB82538 RFIFO傳送到DMA對(duì)應(yīng)通道接收FIFO,直到DMA 接收FIFO滿或DMA傳輸完成,Local總線操作即停止。采用Demand mode模式時(shí)不需要初始化接收長(zhǎng)度寄存器。當(dāng)DRR請(qǐng)求并獲得Local總線后即開(kāi)始數(shù)據(jù)傳輸,直到DRR撤消請(qǐng)求,但在與SAB82538接口時(shí)不適用。
  Local總線共有4個(gè)雙向通道,在總線空閑時(shí)根據(jù)4個(gè)通道請(qǐng)求按輪流優(yōu)先級(jí)原則實(shí)現(xiàn)總線仲裁。在每個(gè)通道內(nèi)部,發(fā)送和接收操作按固定優(yōu)先級(jí)仲裁,二者結(jié)合最終決定獲得總線權(quán)的通道操作。在總線有效的通道DMA操作過(guò)程中,可以被更高優(yōu)先級(jí)的直接存取模式操作中止,但不能被其他通道DMA操作中斷,必須在DMA自動(dòng)撤消請(qǐng)求從而使總線進(jìn)入空閑狀態(tài)時(shí)才能進(jìn)行新的總線仲裁,進(jìn)入下一次通道操作。
  (2)PCI總線DMA訪問(wèn)操作。該操作共有27種狀態(tài):總線空閑、最后周期讀/寫操作、DMA發(fā)送/接收操作時(shí)讀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ā)送/接收時(shí)讀BD狀態(tài), wb_rd_bdn/wb_wr_bdn分別代表DMA發(fā)送/接收結(jié)束時(shí)回寫B(tài)D標(biāo)志狀態(tài)(n=0~3,表示通道號(hào))。

 


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