利用PCI局部總線實(shí)現(xiàn)BIade Server的數(shù)據(jù)交換
3 基于FPGA的PCI數(shù)據(jù)交換實(shí)現(xiàn)
通常PC都是采用本地硬盤來引導(dǎo)操作系統(tǒng),完成設(shè)備的驅(qū)動,Blade則通過網(wǎng)絡(luò)啟動系統(tǒng),所以網(wǎng)絡(luò)配置要先于操作系統(tǒng)引導(dǎo),并完成初始化和驅(qū)動裝載。為了解決這個難點(diǎn),我們采用“PCI+FPGA+Flash”結(jié)構(gòu),在Flash中燒錄雙端口千兆網(wǎng)卡PCI設(shè)備的初始化和驅(qū)動裝載程序,由CPU在系統(tǒng)上電時加載Flash中的程序到系統(tǒng)內(nèi)存。由于數(shù)據(jù)傳輸是PCI總線,而Flash是標(biāo)準(zhǔn)的數(shù)據(jù)總線,這就存在數(shù)據(jù)總線轉(zhuǎn)換的
問題,問題解決的方案是通過FPGA完成PCI設(shè)備與Flash之間的通信,下面將詳細(xì)介紹如何利用FPGA來完成PCI接口和Flash之間的通信。
3.1 FPGA系統(tǒng)邏輯與實(shí)現(xiàn)
整個FPGA系統(tǒng)設(shè)計(jì)基于PCI2.2從設(shè)備設(shè)計(jì)思想,PCI主設(shè)備為PCI橋芯片,用FPGA來完成PCI從設(shè)備功能,終端為Flash芯片。在FPGA系統(tǒng)中,PCI總線接口部分的設(shè)計(jì)參數(shù)為:PCI時鐘為33 MHz(CLK),32位I/O接口(AD[31..0]),終端接口可以提供20位或32位數(shù)據(jù)線。PCI主設(shè)備與終端Flash間的通信采用PCI從設(shè)備(FPGA)來實(shí)現(xiàn)的。在FPGA的邏輯設(shè)計(jì)中,終端是兼有Memory空間和I/O空間的抽象設(shè)備,在實(shí)際的設(shè)計(jì)中終端Flash,只有對應(yīng)的Memory空間。
根據(jù)FPGA的模塊設(shè)計(jì)思想,采用Verilog語言將整個系統(tǒng)按功能進(jìn)行分塊設(shè)計(jì),每個模塊的輸出可以為其他功能模塊提供輸入,各模塊功能和設(shè)計(jì)思想如下:
“PCI頂層模塊”是系統(tǒng)頂層模塊,完成系統(tǒng)端口各使能開關(guān)的定義和調(diào)用其他5個功能模塊。
“配置模塊”完成PCI從設(shè)備配置寄存器的設(shè)置。
“基址模塊”實(shí)現(xiàn)兩個功能:1)配置I/O空間和存儲空間(memory空間)的基地址;2)告知PCI從設(shè)備狀態(tài)機(jī)(The State Machine)。
“狀態(tài)機(jī)模塊”是整個設(shè)計(jì)的核心,控制PCI主設(shè)備到終端的所有數(shù)據(jù)傳輸。在PCI地址傳送階段,通過采樣C/BE[3..0]和IDSEL來決定是配置讀寫、存儲空間讀寫還是I/O空間讀寫。
“校驗(yàn)?zāi)K”對AD[31..0]和C/BE[3..0]#信號作奇偶校驗(yàn),以保證數(shù)據(jù)的有效性。
“重入模塊”若PCI從設(shè)備進(jìn)行一個讀寫操作,則必須在6個時鐘周期內(nèi)(定義PCI從設(shè)備為slow=10 b,慢速設(shè)備)使能DEVSEL。若PCI從設(shè)備進(jìn)行數(shù)據(jù)傳送(已經(jīng)使能DEVSEL),終端在9個時鐘周期內(nèi)沒有使能READY#,則將告知:“The State Machine模塊”,終端暫時中止當(dāng)前的數(shù)據(jù)傳送,直到傳送條件滿足后,才重新啟動數(shù)據(jù)傳送。
3.2 FPGA系統(tǒng)邏輯功能仿真與結(jié)論
完成了各功能模塊程序的編輯和編譯過程,即可采用xilinx ISE11.2自帶的HDL Bencher來生成測試激勵文件,而后就可以調(diào)用Model Sim進(jìn)行仿真了,該仿真也叫前仿真(邏輯功能仿真),布線后的仿真稱為后仿真,也叫延時仿真,布線后的仿真包含門延時和線延時。
下面給出memory寫操作功能仿真的詳細(xì)步驟,并對結(jié)果進(jìn)行分析。
I/O、memory空間讀寫過程非常相似,現(xiàn)對memory空間猝發(fā)方式寫操作進(jìn)行詳細(xì)的說明。在圖4中,通過測試文件生成pci_rst#=1,不產(chǎn)生復(fù)位動作,地址節(jié)拍pci_ad=0x2000_0000,表示PCI主設(shè)備從系統(tǒng)地址0x2000_0000地址開始寫到終端0x00000地址開始的數(shù)據(jù)空間,可在“PCI頂層模塊”定義(bkend_ad[19..0]=pci_ad[19..0]),終端只取系統(tǒng)地址的低20位地址。pci_cbe#[3..0]=0111,表示是memory空間寫操作,在idle狀態(tài)pci_frame#使能,irdy#、devsel#、stop#先不使能,PCI主設(shè)備將地址送到終端地址線上,data_stop#=1,表示終端支持猝發(fā)方式數(shù)據(jù)寫操作。在下個時鐘周期,進(jìn)入到rw_wait狀態(tài),base_regionl#(memory片選)使能,告訴終端準(zhǔn)備執(zhí)行memory寫操作,同時打開I/O、memory空間寫操作使能。在下個時鐘周期,進(jìn)入到rw_wait2狀態(tài),如果終端使能ready#,表示終端準(zhǔn)備好接收數(shù)據(jù),使能devsel#、tr dy#、date_write#,其中date_write#使能,是讓終端產(chǎn)生寫使能信號。irdy#、trdy#使能。表示PCI主設(shè)備和終端數(shù)據(jù)可以有效傳輸,通過測試文件在PCI主設(shè)備的對應(yīng)地址(0x2000_0000)下產(chǎn)生數(shù)據(jù)cdef0000,在該狀態(tài),寫入終端第一個數(shù)據(jù)cdef0000。在下個時鐘周期,進(jìn)入到rw狀態(tài),如果在該狀態(tài)下pci_frame#=0還使能,表示PCI主設(shè)備想支持猝發(fā)寫,繼續(xù)使能devsel#、trdy#信號,stop#不能使能,因?yàn)镻CI主設(shè)備準(zhǔn)備猝發(fā)寫操作,在該狀態(tài)下,只要pci_frame#=0(使能),循環(huán)寫入數(shù)據(jù)cdef0001、cdef0002、cdef0003、cdef0004,上文已經(jīng)介紹,下一個數(shù)據(jù)對應(yīng)的地址自動加一,地址都是線性增加的。圖4中,PCI主設(shè)備準(zhǔn)備發(fā)送cdef0005數(shù)據(jù)時,irdy#=1(不使能),表示PCI主設(shè)備正在取數(shù)據(jù),data_write#(終端寫使能)不使能,告訴終端等待PCI主設(shè)備取數(shù)據(jù),插入等待周期。在下個時鐘周期,irdy#重新使能,date_wri te#也重新使能,繼續(xù)寫數(shù)據(jù)cdef0005,這樣可以一直寫數(shù)據(jù)。pci_frame#=1,表示進(jìn)入最后一個周期的寫數(shù)據(jù)操作,關(guān)閉irdy#、devsel#、base_regionl#使能。在下個時鐘周期,進(jìn)入到backoff狀態(tài),在下個時鐘周期進(jìn)入到idel狀態(tài),一個完整的memory猝發(fā)寫就完成了。
伺服電機(jī)相關(guān)文章:伺服電機(jī)工作原理
評論