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