?
13.3??PCI接口芯片PCI9054與FPGA的接口設(shè)計
13.3.1??PCI9054的特性
PCI接口芯片猶如一個硬核一樣,完成了PCI局部總線端的總線交互,避免了用戶直接對PCI局部總線進(jìn)行復(fù)雜的操作。同時它為可編程邏輯器件提供了完備的本地總線接口,使用戶可以較為方便地實現(xiàn)總線交互的功能,節(jié)省了開發(fā)的周期。
PCI9054是由美國PLX公司生產(chǎn)的先進(jìn)的PCI橋接芯片。它采用了先進(jìn)的PLX數(shù)據(jù)流水線結(jié)構(gòu)技術(shù),支持突發(fā)傳輸速率132MB/s。PCI9054具有如下一些特性。
·??兼容PCI?協(xié)議v2.2。
·??具有電源管理功能。
·??本地總線具有兩個獨立的DMA通道。
·??具有6個可編程FIFO用于無等待突發(fā)傳送。
·??支持3.3V、5V芯片和接口電平標(biāo)準(zhǔn)。
·??本地時鐘支持最高50MHz。
如圖13.7所示為PCI9054的內(nèi)部結(jié)構(gòu)圖。
圖13.7??PCI9054內(nèi)部結(jié)構(gòu)圖
13.3.2??PCI9054工作模式
PCI9054的本地總線時鐘可與PCI總線時鐘異步,本地總線有3種工作模式:M模式、C模式和J模式,可通過模式選擇控制引腳MODE[1:0]進(jìn)行控制,如表13.1所示。
表13.1 PCI9054工作模式
模????式 |
說????明 |
M |
32位地址/32位數(shù)據(jù),非復(fù)用方式,用于直接連接MPC850或MPC860 |
C |
32位地址/32位數(shù)據(jù),非復(fù)用方式 |
J |
32位地址/32位數(shù)據(jù),復(fù)用方式 |
本系統(tǒng)采用的是C模式(MODE[1:0]=?00)。事實上,C模式能夠滿足絕大多數(shù)的應(yīng)用需求,而且C模式的本地總線操作時序最簡單,邏輯控制相對容易,其開發(fā)難度相對較低,因此,如無特殊需求,建議采用C模式。
要實現(xiàn)PCI9054?C模式與FPGA的接口設(shè)計,首先要明確PCI信號采集設(shè)備對于主機(jī)來說是主控設(shè)備(MASTER)還是目標(biāo)設(shè)備(TARGET),還要明確是memory操作還是I/O操作。主控設(shè)備可以控制總線驅(qū)動地址、數(shù)據(jù)及控制信號;目標(biāo)設(shè)備不能啟動總線操作,只能通過主控設(shè)備來發(fā)起并驅(qū)動相應(yīng)的信號。
在本系統(tǒng)設(shè)計中,PCI本地總線端使用的是FPGA而不是上位機(jī),因此PCI9054對于PCI局部總線來講是目標(biāo)設(shè)備,由主機(jī)上其他設(shè)備作為主控設(shè)備進(jìn)行PCI總線的操作。對于PCI本地總線來講是PCI9054又是主控設(shè)備,通過PCI9054提供的本地接口啟動本地端地址、數(shù)據(jù)及控制總線的操作。
?
首先作為PCI局部總線的目標(biāo)設(shè)備,PCI局部總線通過控制C/BE[3:0]#來發(fā)起不同的操作。如表13.2所示為作為目標(biāo)設(shè)備的PCI9054局部總線命令編碼表。
表13.2 PCI目標(biāo)設(shè)備命令編碼表
命?令?類?型 |
C/BE[3:0]碼型 |
I/O讀 |
0010 |
I/O寫 |
0011 |
存儲器讀 |
0110 |
存儲器寫 |
0111 |
配置讀 |
1010 |
配置寫 |
1011 |
存儲器重復(fù)讀 |
1100 |
PCI雙地址周期 |
1101 |
存儲器按行讀 |
1110 |
存儲器寫無效 |
1111 |
在實際的操作中,用戶通過應(yīng)用程序對PCI設(shè)備進(jìn)行操作時,PCI9054完成了將命令類型從PCI局部總線向本地總線的傳遞,并且這個過程對于用戶來說是不可見的。用戶只需要在本地總線端,即FPGA上實現(xiàn)對應(yīng)命令類型的邏輯設(shè)計即可。因此,在FPGA內(nèi)部需要對所有的命令操作進(jìn)行相應(yīng)的設(shè)計。
在本系統(tǒng)的PCI操作中,包含了I/O讀、寫,存儲器讀、寫,配置讀、寫等操作,其中的存儲器讀、寫操作使用的是Scatter/Gather?DMA傳輸方式。在FPGA中通過判斷PCI9054傳遞的地址映射空間類型和大小來區(qū)分主機(jī)需要進(jìn)行的操作類型。
首先來認(rèn)識一下PCI設(shè)備的空間配置情況。
13.3.3??PCI設(shè)備空間配置
通常PCI設(shè)備一般有配置空間、存儲器空間和I/O空間3類資源。配置空間是必須的,根據(jù)設(shè)計需要,后兩種資源可以只包含其中之一。
定義配置空間的目的在于為PCI設(shè)備提供一套適當(dāng)?shù)呐渲么胧?,使之滿足現(xiàn)行的和可預(yù)見的系統(tǒng)配置機(jī)構(gòu)。配置空間是一個容量為256字節(jié)并具有特定記錄結(jié)構(gòu)或模型的地址空間。在實際的系統(tǒng)配置中,PCI9054的配置空間通過燒寫在EEPROM中的內(nèi)容進(jìn)行配置。
PCI9054有Space?0和Space?1兩個地址空間,
兩個地址空間都可以配置成存儲器空間和I/O空間。存儲器空間和I/O空間的配置既有相同之處,也有很大的區(qū)別。其相同點為兩者都以字節(jié)為單位進(jìn)行空間配置。不同之處有以下幾點。
·??存儲器空間支持0~4GB的空間映射,I/O空間只支持0~256字節(jié)的空間映射。
·??存儲器空間支持8/16/32位總線位寬操作,I/O空間只支持32位總線位寬操作。
·??存儲器空間支持單一周期和突發(fā)模式讀寫操作,I/O空間只支持單一周期讀寫操作。
·??編寫驅(qū)動時,存儲器空間用程序指針進(jìn)行訪問,I/O空間則用專用的函數(shù)進(jìn)行訪問。
用戶應(yīng)根據(jù)實際的操作需求選擇合適的空間配置方式和參數(shù),以便獲得正確、高效的總線傳輸性能。例如進(jìn)行數(shù)據(jù)流的傳輸時,最好使用存儲器空間,采用DMA讀寫方式;進(jìn)行參數(shù)配置或寄存器值讀取時,使用I/O空間,采用I/O讀寫方式。
13.3.4??PCI9054與FPGA接口設(shè)計
如上所述,F(xiàn)PGA需要根據(jù)PCI9054傳遞的地址映射空間類型和大小來區(qū)分主機(jī)需要進(jìn)行的操作類型。因此主機(jī)必須與FPGA達(dá)成一個一致的操作類型與地址映射空間協(xié)議,保證各個操作之間不會產(chǎn)生地址空間的重疊。
?
下面介紹一下進(jìn)行I/O操作及DMA操作時,PCI9054與FPGA之間的接口設(shè)計。
1.I/O操作
如圖13.8所示為PCI9054進(jìn)行目標(biāo)設(shè)備I/O讀寫時的結(jié)構(gòu)圖。其中,左圖為讀結(jié)構(gòu)圖,右圖為寫結(jié)構(gòu)圖。每個圖中的左半部分為PCI9054與PCI局部總線的交互,右半部分為PCI9054與FPGA之間的交互。右半部分包含的控制線、地址線及數(shù)據(jù)線就是進(jìn)行I/O操作時需要在FPGA內(nèi)進(jìn)行的接口設(shè)計。
圖13.8??PCI9054目標(biāo)設(shè)備I/O讀寫結(jié)構(gòu)圖
首先,PCI局部總線端的主機(jī)或其他設(shè)備作為主設(shè)備發(fā)起對PCI9054的I/O操作,此時PCI9054的局部總線端是目標(biāo)設(shè)備。同時PCI9054的本地總線端又作為主設(shè)備向FPGA發(fā)起I/O操作,F(xiàn)PGA作為目標(biāo)設(shè)備接受總線控制。
如圖13.9所示為PCI9054目標(biāo)設(shè)備Local總線存取過程圖??梢钥吹?,存取過程主要是進(jìn)行地址的映射過程。首先進(jìn)行Local端和PCI端的寄存器配置,再通過PCI9054內(nèi)部的兩個目標(biāo)設(shè)備FIFO進(jìn)行存取,主機(jī)根據(jù)寄存器的值即可得到映射位置上的數(shù)據(jù)。
圖13.9??PCI9054目標(biāo)設(shè)備Local總線存取過程
?
如圖13.10所示為PCI9054目標(biāo)設(shè)備Local總線I/O典型波形圖。它描述了I/O操作時FPGA內(nèi)的時序,也是用戶需要進(jìn)行設(shè)計的時序。
該波形圖表述了下面幾個交互過程。
·??主設(shè)備(主機(jī)或其他設(shè)備)發(fā)起Local總線占用請求LHOLD信號,F(xiàn)PGA應(yīng)答產(chǎn)生LHOLDA信號允許該請求。
·??主設(shè)備獲得允許后,發(fā)起操作起始信號ADS#,并提供Local總線讀寫方向信號LW/R#以及地址信號LA[31:2]。
·??FPGA獲得起始信號后,發(fā)出總線準(zhǔn)備好信號READY#,并執(zhí)行相應(yīng)的操作。
·??主設(shè)備完成操作后,發(fā)起操作結(jié)束信號BLAST#,F(xiàn)PGA捕獲后,改變READY#的狀態(tài)。
·??主設(shè)備捕獲READY#狀態(tài)改變后,釋放Local總線占用信號LHOLD。
·??FPGA應(yīng)答總線釋放,結(jié)束操作。
圖13.10??PCI9054目標(biāo)設(shè)備Local總線I/O典型波形圖
?
下面是這個交互過程中對應(yīng)的Verilog代碼,其中分配的I/O空間大小為64字節(jié),通過對LA[4]譯碼實現(xiàn)操作類型的區(qū)分。
always?@(posedge?LCLK)
?????LHOLDA?<=?LHOLD;????????????????????????? //總線請求及應(yīng)答
always?@(posedge?LCLK?or?negedge?RESET_)begin
?????if(!RESET_)??????????????????????????????? //PCI9054復(fù)位
?????????READY1_??<=?1'b1;
?????else?if(!ADS_?&?LWR_?&?BLAST_?&?LA[31:4]==28'h0000_001)
?????????READY1_?<=?1'b0;???????????????????? //起始狀態(tài),通過地址線判斷操作類型
?????else?if(ADS_?&?LWR_?&?BLAST_?&?!READY1_)begin
??????????//TODO???????????????????????????????? //中間狀態(tài),可執(zhí)行相應(yīng)的操作
??????????READY1_?<=?1'b0;
??????????end
?????else?if(ADS_?&?LWR_?&?!BLAST_?&?!READY1_)begin
??????????//TODO??????????????????????????????? //結(jié)束狀態(tài),可執(zhí)行相應(yīng)的操作
??????????READY1_?<=?1'b1;
??????????end
?????else
??????????READY1_?<=?1'b1;?????????????????? //無操作狀態(tài)
?????end
2.DMA
如圖13.11所示為PCI9054進(jìn)行目標(biāo)設(shè)備DMA讀寫時的結(jié)構(gòu)圖。其中,左圖為PCI-to-Local結(jié)構(gòu)圖,右圖為寫結(jié)構(gòu)圖。每個圖中左右兩部分完成的交互功能同I/O操作一樣。
不同的是,進(jìn)行DMA操作時,不管是與PCI局部總線還是PCI本地總線交互,PCI9054始終是主設(shè)備。主機(jī)或FPGA只需發(fā)出DMA開始信號后,即可由PCI9054完成DMA的所有操作??梢?,DMA操作可以大幅度減輕主機(jī)端CPU的負(fù)擔(dān)。
PCI9054支持Block(塊)DMA和Scatter/Gather?DMA兩種傳輸模式,前者使用連續(xù)的內(nèi)存塊進(jìn)行地址映射,后者可以通過自動添加的指針鏈,使用不連續(xù)的內(nèi)存塊實現(xiàn)大塊內(nèi)存的地址映射,可提高系統(tǒng)內(nèi)存的使用效率。
如圖13.12所示為Scatter/Gather?DMA模式存取過程圖。可以看到,DMA存取過程同樣也是進(jìn)行地址的映射過程。在這種模式下增加的是描述指針寄存器,通過它實現(xiàn)零散內(nèi)存的連續(xù)化。
圖13.11??PCI9054目標(biāo)設(shè)備DMA讀寫結(jié)構(gòu)圖
圖13.12??Scatter/Gather?DMA模式存取過程
?
如圖13.13所示為PCI9054目標(biāo)設(shè)備Local總線DMA典型波形圖。它描述了DMA操作時FPGA內(nèi)的時序,也是用戶需要進(jìn)行設(shè)計的時序。
圖13.13??PCI9054目標(biāo)設(shè)備Local總線DMA典型波形圖
該波形圖表述了下面幾個交互過程。
·??主設(shè)備(主機(jī)或其他設(shè)備)發(fā)起Local總線占用請求LHOLD信號,F(xiàn)PGA應(yīng)答產(chǎn)生LHOLDA信號允許該請求。
·??主設(shè)備獲得允許后,發(fā)起操作起始信號ADS#,并提供Local總線讀寫方向信號LW/R#以及地址信號LA[31:2]。
·??FPGA獲得起始信號后,發(fā)出總線準(zhǔn)備好信號READY#,并執(zhí)行相應(yīng)的操作;此時LA地址會根據(jù)LBE字節(jié)使能的設(shè)置每讀寫一次(周期)遞增一次,如圖中LA地址所示。
·??主設(shè)備完成操作后,發(fā)起操作結(jié)束信號BLAST#,F(xiàn)PGA捕獲后,改變READY#狀態(tài)。
·??主設(shè)備捕獲READY#狀態(tài)改變后,釋放Local總線占用信號LHOLD。
·??FPGA應(yīng)答總線釋放,結(jié)束操作。
?
下面是這個交互過程中對應(yīng)的Verilog代碼,其中分配的DMA空間大小為1MB,通過對LA[20]譯碼實現(xiàn)操作類型的區(qū)分。
always?@(posedge?LCLK)
?????LHOLDA?<=?LHOLD;??????????????????????? //總線請求及應(yīng)答
always?@(posedge?LCLK?or?negedge?RESET_)begin
?????if(!RESET_)????????????????????????????? //PCI9054復(fù)位
?????????READY2_?<=?1'b1;
?????else?if(!ADS_?&?LWR_?&?BLAST_?&?LA[31:20]==?12'h001)
?????????READY2_?<=?1'b0;??????????????????? //起始狀態(tài),通過地址線判斷操作類型
?????else?if(ADS_?&?LWR_?&?BLAST_?&?!READY2_)begin
??????????//TODO???????????????????????????????//中間狀態(tài),可執(zhí)行相應(yīng)操作
??????????READY2_?<=?1'b0;??????????
??????????end
?????else?if(ADS_?&?LWR_?&?!BLAST_?&?!READY2_)begin
??????????//TODO?????????????????????????????? //結(jié)束狀態(tài),可執(zhí)行相應(yīng)操作
??????????READY2_?<=?1'b1;
??????????end
?????else
??????????READY2_?<=?1'b1;?????????????????? //無操作狀態(tài)
?????End