基于FPGA的PCI接口控制器的設(shè)計(jì)與實(shí)現(xiàn)
引言
pci總線是高速同步總線,采用高度綜合優(yōu)化的總線結(jié)構(gòu),目前廣泛應(yīng)用于各種計(jì)算機(jī)系統(tǒng)中,總線以32位(或64位)數(shù)據(jù)總線、33mhz(或66mhz)的時(shí)鐘頻率操作,具有很高的數(shù)據(jù)傳輸速率。
目前開(kāi)發(fā)pci接口大體有兩種方案,一種是采用專(zhuān)用的pci接口芯片,實(shí)現(xiàn)完整的pci主控模塊和目標(biāo)模塊接口功能,將復(fù)雜的pci總線接口轉(zhuǎn)換為相對(duì)簡(jiǎn)單的用戶(hù)接口。采用這種方案,用戶(hù)只要設(shè)計(jì)轉(zhuǎn)換后的總線接口即可,其優(yōu)點(diǎn)是縮短了開(kāi)發(fā)周期,缺點(diǎn)是用戶(hù)可能只用到pci接口的部分功能,因此而造成邏輯資源浪費(fèi),缺乏靈活性。一種是使用可編程器件,采用fpga進(jìn)行pci接口設(shè)計(jì),這樣可以依據(jù)插卡功能進(jìn)行最優(yōu)化。這種方案設(shè)計(jì)靈活,不必實(shí)現(xiàn)所有pci功能,節(jié)約系統(tǒng)的邏輯資源。
本文所述設(shè)計(jì)方案是采用xilinx公司的virtex2系列xc2v6000芯片來(lái)實(shí)現(xiàn)pci主/從設(shè)備接口控制器。通過(guò)pci總線使得計(jì)算機(jī)上的視頻碼流傳送到解碼器中。對(duì)fpga的設(shè)計(jì)全部采用verilog hdl語(yǔ)言作為設(shè)計(jì)輸入,并且為解碼部分功能的實(shí)現(xiàn)預(yù)留了足夠的空間。
系統(tǒng)結(jié)構(gòu)設(shè)計(jì)
為了對(duì)視頻流進(jìn)行解碼,需要快速而大量的數(shù)據(jù)傳輸。本設(shè)計(jì)簡(jiǎn)述了一種通過(guò)pci總線通信的解決方案。通過(guò)host主機(jī)對(duì)目標(biāo)設(shè)備的控制,實(shí)驗(yàn)板即可以做目標(biāo)設(shè)備,也可以做主設(shè)備。圖1是本設(shè)計(jì)的系統(tǒng)框圖。
在默認(rèn)情況下,實(shí)驗(yàn)板目標(biāo)設(shè)備處于工作狀態(tài)為主設(shè)備為空閑狀態(tài),主控host通過(guò)i/o方式進(jìn)行寄存器的讀寫(xiě)控制操作。當(dāng)需要傳輸大量數(shù)據(jù)時(shí),host通過(guò)寫(xiě)i/o方式通過(guò)實(shí)驗(yàn)板申請(qǐng)pci總線的使用權(quán),pci總線申請(qǐng)成功后,實(shí)驗(yàn)板主設(shè)備開(kāi)始工作,通過(guò)dma方式與主控host進(jìn)行通信。
pci總線配置空間的實(shí)現(xiàn)
當(dāng)實(shí)驗(yàn)板的目標(biāo)設(shè)備工作時(shí),需要對(duì)其配置空間進(jìn)行配置。pci總線定義了3種物理地址空間:存儲(chǔ)器地址空間、i/o地址空間和配置地址空間。前兩者是普通的計(jì)算機(jī)系統(tǒng)地址空間,而配置空間是pci所特有的。根據(jù)pci總線規(guī)范[1],所有的pci設(shè)備都必須提供配置空間。pci總線仲裁器首先訪問(wèn)一個(gè)目標(biāo)設(shè)備的配置空間,以確定總線上存在的設(shè)備,主機(jī)host才能繼續(xù)對(duì)這個(gè)目標(biāo)設(shè)備進(jìn)行其他類(lèi)型的訪問(wèn),如內(nèi)存訪問(wèn)、i/o訪問(wèn)。配置空間是長(zhǎng)度為256字節(jié)并且有特定記錄結(jié)構(gòu)或模型的地址空間,可以在系統(tǒng)自舉時(shí)訪問(wèn),也可在其他時(shí)間訪問(wèn)。配置空間訪問(wèn)時(shí),對(duì)配置空間讀令名為“1010”;對(duì)配置空間寫(xiě)命令為“1011”。依據(jù)pci規(guī)范[1],可設(shè)定配置空間中的各寄存器值如下:
供應(yīng)商id:9918h;設(shè)備id:2003h;修訂id:01h,分類(lèi)代碼:078000h。這是一個(gè)非標(biāo)準(zhǔn)pci設(shè)備,所以任意使用了一個(gè)保留值。
命令字:0001h。表示只支持i/o讀寫(xiě)控制。
基地址寄存器:目標(biāo)設(shè)備只用到一個(gè)基地址寄存器,在此基礎(chǔ)上實(shí)現(xiàn)多個(gè)寄存器,定義控制寄存器地址為:基地址+2ch;數(shù)據(jù)傳輸寄存器地址為:基地址+18h。
其他沒(méi)有用到的配置寄存器在讀時(shí)全返回0。
主設(shè)備工作機(jī)制
主控host首先分配兩個(gè)內(nèi)存空間,一個(gè)用于存放地址信息,一個(gè)用于存放真正的數(shù)據(jù)。當(dāng)實(shí)驗(yàn)板做主設(shè)備時(shí),數(shù)據(jù)傳輸使用dma方式對(duì)存儲(chǔ)器空間直接進(jìn)行讀寫(xiě)操作,數(shù)據(jù)傳輸結(jié)構(gòu)如圖2所示。
主設(shè)備先進(jìn)行存儲(chǔ)器讀操作,以從內(nèi)存空間1中讀取主控host分配的pageaddr和pagecnt。主設(shè)備得知內(nèi)存空間2的地址后,即可在傳輸數(shù)據(jù)時(shí),讀取或者寫(xiě)入到這些真正的數(shù)據(jù)存儲(chǔ)區(qū)。實(shí)驗(yàn)板做主設(shè)備時(shí),為了不和主控host上的其他主設(shè)備沖突,設(shè)定突發(fā)長(zhǎng)度為8,傳輸8個(gè)32位數(shù)據(jù)后釋放pci總線,然后開(kāi)始申請(qǐng)總線使用權(quán),以便繼續(xù)傳輸數(shù)據(jù)。上述操作均由時(shí)序狀態(tài)機(jī)進(jìn)行控制。
主設(shè)備時(shí)序狀態(tài)機(jī)
時(shí)序狀態(tài)機(jī)是pci接口控制器的核心,各種令名、數(shù)據(jù)交換、控制均在狀態(tài)機(jī)的管理下進(jìn)行工作。圖3是實(shí)驗(yàn)板做主設(shè)備時(shí),pci總線接口控制器時(shí)序狀態(tài)機(jī)。實(shí)驗(yàn)板做目標(biāo)設(shè)備的狀態(tài)機(jī)就不在這里介紹了。
這一狀態(tài)機(jī)共有8個(gè)狀態(tài),分別是:mstate_idle、mstate_req、mstate_addr、mstate_data、mstate_last、mstate_addr_p、mstate_data_p、mstate_last_p。他們代表總線作業(yè)時(shí)的不同階段,意義如下:
mstate_idle:主設(shè)備空閑狀態(tài)。實(shí)驗(yàn)板目標(biāo)設(shè)備工作,當(dāng)host通過(guò)寫(xiě)i/o方式通知目標(biāo)設(shè)備需要開(kāi)始以dma方式傳輸大量數(shù)據(jù)時(shí),start信號(hào)有效,主設(shè)備開(kāi)始申請(qǐng)總線使用權(quán),狀態(tài)跳轉(zhuǎn)到mstate_req。
mstate_req:主設(shè)備開(kāi)始申請(qǐng)總線使用權(quán)狀態(tài)。主設(shè)備開(kāi)始申請(qǐng)總線使用權(quán),使連接到仲裁器上的req_o_信號(hào)有效,通知仲裁器實(shí)驗(yàn)板的主設(shè)備需要使用pci總線,等待仲裁器的裁決。實(shí)驗(yàn)板主設(shè)備得到可以使用總線的通知時(shí),必須等到前一個(gè)正在占用總線的主設(shè)備完成其傳輸,并且釋放總線后,才能真正使用pci總線,即實(shí)驗(yàn)板主設(shè)備需要采集到frame_i_無(wú)效并且irdy_i無(wú)效。當(dāng)pagecnt=0表示一頁(yè)數(shù)據(jù)已經(jīng)傳輸完畢,于是開(kāi)始讀取下一頁(yè)數(shù)據(jù)的存放地址,狀態(tài)跳轉(zhuǎn)到mstate_addr。當(dāng)pagecnt?。?表示一頁(yè)數(shù)據(jù)還未傳完,狀態(tài)跳轉(zhuǎn)到mstate_addr_p,繼續(xù)這一頁(yè)數(shù)據(jù)的傳輸。
mstate_addr:主設(shè)備頁(yè)地址狀態(tài)。這個(gè)狀態(tài)frame_o_信號(hào)有效,開(kāi)始地址周期,ad上出現(xiàn)的是32位頁(yè)地址信息,cbe_o_上出現(xiàn)的是存儲(chǔ)器讀命令,這個(gè)狀態(tài)是準(zhǔn)備做存儲(chǔ)器讀操作,在總線上送出地址后,跳轉(zhuǎn)到mstate_data。
mstate_addr_p:主設(shè)備數(shù)據(jù)地址狀態(tài)。這個(gè)狀態(tài)同mstate_addr狀態(tài)一樣的是,開(kāi)始地址周期。所不同的是ad上出現(xiàn)的是在mstate_data狀態(tài)下讀到的32位數(shù)據(jù)地址信息。根據(jù)需要,可以進(jìn)行讀/寫(xiě)存儲(chǔ)器操作。
mstate_data:主設(shè)備讀頁(yè)信息狀態(tài)。這個(gè)狀態(tài)是讀存儲(chǔ)器,irdy_o_信號(hào)有效。數(shù)據(jù)真正的傳輸是在trdy_i_信號(hào)和irdy_o_信號(hào)同時(shí)有效時(shí),可以讀取到數(shù)據(jù)是頁(yè)信息,代表存放數(shù)據(jù)的地址信息和存放數(shù)據(jù)的長(zhǎng)度。數(shù)據(jù)傳輸?shù)耐话l(fā)長(zhǎng)度是2,所以一次pci訪問(wèn)讀取兩個(gè)32位數(shù)據(jù),讀完一個(gè)數(shù)據(jù)后狀態(tài)立即跳轉(zhuǎn)到mstate_last去讀取最后一個(gè)數(shù)據(jù)。當(dāng)host主機(jī)要求停止數(shù)據(jù)傳輸時(shí),通過(guò)使stop_i_信息有效告訴主設(shè)備,主設(shè)備必須放棄這次數(shù)據(jù)的傳輸,狀態(tài)跳轉(zhuǎn)到mstate_last。
mstate_data_p:主設(shè)備讀/寫(xiě)數(shù)據(jù)狀態(tài)。這個(gè)狀態(tài)是數(shù)據(jù)的傳輸,突發(fā)長(zhǎng)度是8,一次pci訪問(wèn)可以讀取8個(gè)32位數(shù)據(jù),當(dāng)cnt=2時(shí),表示讀完7個(gè)數(shù)據(jù),狀態(tài)跳轉(zhuǎn)到mstate_last_p。與狀態(tài)mstate_data一樣,如果host主機(jī)要求停止數(shù)據(jù)傳輸時(shí),主設(shè)備必須放棄這次數(shù)據(jù)的傳輸,狀態(tài)馬上跳轉(zhuǎn)到mstate_last_p。
mstate_last:主設(shè)備讀取最后一個(gè)頁(yè)信息狀態(tài)。該狀態(tài)下frame_o_信號(hào)無(wú)效,irdy_o_信號(hào)有效,表示這是最后一個(gè)讀取數(shù)據(jù)周期,數(shù)據(jù)傳輸和mstate_data狀態(tài)一樣,是在trdy_i_信號(hào)和irdy_o_信號(hào)同時(shí)有效時(shí)。當(dāng)host主機(jī)要停止數(shù)據(jù)傳輸時(shí),stop_i_有效,主設(shè)備釋放總線并回到mstate_idle狀態(tài),準(zhǔn)備開(kāi)始申請(qǐng)下一次總線使用權(quán),以進(jìn)行數(shù)據(jù)傳輸。
mstate_last_p:主設(shè)備讀取最后一個(gè)數(shù)據(jù)狀態(tài)。這個(gè)狀態(tài)同mstate_last一樣,讀取的是這次pci訪問(wèn)的最后一個(gè)數(shù)據(jù)。
下面是用verilog hdl描述的狀態(tài)機(jī)的核心代碼:
結(jié)束語(yǔ)
本文介紹了在fpga上實(shí)現(xiàn)pci接口控制器的設(shè)計(jì)方案,通過(guò)實(shí)驗(yàn)板做主設(shè)備進(jìn)行大量數(shù)據(jù)的高速傳輸。采用對(duì)主控host內(nèi)存的直接讀/寫(xiě)進(jìn)行數(shù)據(jù)傳輸,用突發(fā)方式使用背靠背單數(shù)據(jù)傳送,在時(shí)鐘頻率33mhz下,數(shù)據(jù)流量接近每秒33百萬(wàn)次傳送,實(shí)驗(yàn)中數(shù)據(jù)傳輸效果很好,完全符合pci總線的要求,這種設(shè)計(jì)提供了靈活的接口控制,為后續(xù)的視頻解碼ip核提供了良好的接口。
評(píng)論