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