PCI總線從設(shè)備控制器的設(shè)計(jì)與實(shí)現(xiàn)
0 引言
隨著星載電子系統(tǒng)復(fù)雜度、小型化需求的提高,片上系統(tǒng)(System on Chip SoC)已 經(jīng)成為應(yīng)對(duì)未來(lái)星載電子系統(tǒng)設(shè)計(jì)需求的解決途徑。為了簡(jiǎn)化設(shè)計(jì)流程并且提高部件的可重 用性,在目前的SoC 設(shè)計(jì)中引入了稱之為平臺(tái)的體系結(jié)構(gòu)模板,用它來(lái)描述采用已有的標(biāo)準(zhǔn) 核來(lái)開發(fā)SoC 的方法。本文所作的工作主要是按照建立SoC 集成設(shè)計(jì)平臺(tái)的需求,根據(jù)當(dāng)前 國(guó)際航天領(lǐng)域的技術(shù)現(xiàn)狀,選擇PCI(Peripheral Component Interconnect)總線作為SoC 集成設(shè)計(jì)平臺(tái)所能提供的一種總線模塊,根據(jù)可重用的IP(Intellectual Property)設(shè)計(jì) 思想對(duì)PCI 總線從設(shè)備控制器進(jìn)行設(shè)計(jì)實(shí)現(xiàn)。
1 PCI 總線從設(shè)備控制器的設(shè)計(jì)
1.1 控制器的基本功能[1-2]
?。?)數(shù)據(jù)傳輸功能:PCI 總線的傳輸包括PCI 與I/O 之間的傳輸(I/O 讀和I/O 寫)和 PCI 與存儲(chǔ)器之間的傳輸(存儲(chǔ)器讀和存儲(chǔ)器寫)。
?。?)錯(cuò)誤檢測(cè)與處理功能:在交易的地址段和數(shù)據(jù)段中,PCI 總線是被奇偶校驗(yàn)保護(hù) 的。在交易的地址段和數(shù)據(jù)段中,驅(qū)動(dòng)AD 總線的設(shè)備負(fù)責(zé)為本階段計(jì)算和提供奇偶校驗(yàn)位, 接收AD 總線數(shù)據(jù)的設(shè)備負(fù)責(zé)進(jìn)行奇偶校驗(yàn)的檢測(cè)、處理并給出相應(yīng)的信息。
?。?)命令/地址譯碼功能:根據(jù)一些控制信號(hào)將地址/數(shù)據(jù)和命令/字節(jié)使能線上的地址 和命令信號(hào)分離出來(lái),得到相應(yīng)的命令信號(hào)和讀寫操作的地址。
?。?)配置功能:當(dāng)機(jī)器第一次上電時(shí),配置軟件必須掃描在系統(tǒng)中的不同總線(PCI 和 其它),確定什么設(shè)備存在和它們有什么配置要求。為了實(shí)現(xiàn)這個(gè)過(guò)程,每個(gè)PCI 設(shè)備必須 實(shí)現(xiàn)由PCI 規(guī)范定義的一組配置寄存器。依賴其操作特性、功能還可以實(shí)現(xiàn)由PCI 規(guī)范定義 的其它要求的或可選的配置寄存器。另外,還應(yīng)保留許多附加的配置單元,以實(shí)現(xiàn)指定功能 的配置寄存器。
1.2 控制器的設(shè)計(jì)
在用Verilog HDL 語(yǔ)言進(jìn)行PCI 總線從設(shè)備控制器設(shè)計(jì)之前, 首先要對(duì)PCI 總線從設(shè)備控制器的功能進(jìn)行頂層設(shè)計(jì)[3], 將總線接口控制器按照功能分為有限狀態(tài)機(jī)模塊、奇偶校驗(yàn) 模塊、配置空間配置模塊、基地址檢查模塊、計(jì)數(shù)器模塊、地址鎖存模塊和頂層模塊這7 個(gè)模塊[4], 控制器頂層模塊設(shè)計(jì)中有pci_clk、pci_cbe_l 、bkend_abort_l、bkend_ad、 bkend_int_l、data_STop_l、data_read_l、pci_frame_l、data_write_l、pci_idsel、pci_devsel、 pci_irdy_l、pci_inta_l、pci_rst_l、pci_par、ready_l、pci_ad 等信號(hào), 其中_ L 表示信號(hào)低電 平有效。
各個(gè)模塊完成功能如下:
配置空間模塊:PCI總線支持即插即用,從硬件的角度來(lái)看,其技術(shù)手段是為每一個(gè)PCI 設(shè)備提供一個(gè)配置空間,操作系統(tǒng)在自檢(POST Power-On-Self Test)的過(guò)程中檢測(cè)所有 PCI設(shè)備,讀取設(shè)備的配置信息,并給每一個(gè)設(shè)備分配系統(tǒng)資源,如中斷、I/O空間、存儲(chǔ)器 空間等。配置空間包括一系列配置寄存器, 一般占用256個(gè)I/O地址,直接影響PCI 設(shè)備特性 的是PCI空間的前16個(gè)雙字節(jié)的配置, 該區(qū)域稱為PCI 配置頭,一般PCI設(shè)備都要進(jìn)行“類型 0”配置[1]。
配置空間是PCI地址空間中重要的一部分,主要有設(shè)備標(biāo)識(shí)、設(shè)備控制、設(shè)備狀態(tài)、基 地址定位及其它一些由特定設(shè)備所描述的功能這五部分。
這個(gè)模塊中售主ID 用語(yǔ)句DEVICE_ID= 16’h0120 來(lái)定義,其它設(shè)備標(biāo)識(shí)類似,命令寄 存器提供了產(chǎn)生和響應(yīng)PCI 周期、粗略控制設(shè)備的能力。當(dāng)idsel_reg, pci_irdy_l 有效, 且 pci_addr[7:2] == 6’h04 時(shí),信號(hào)stat_com_en 有效,表示可以在配置寫周期內(nèi)對(duì)設(shè)備狀 態(tài)及命令寄存器進(jìn)行配置。將pci_dat[1:0]的值賦給com,由端口com 來(lái)控制一個(gè)設(shè)備響應(yīng) I/O 或是內(nèi)存的訪問(wèn)。用輸出信號(hào)ba0_size[31:4]、ba1_size[31:4]表示定義的I/O、內(nèi)存 空間的大小。pci_dat_out[31:0] 在配置讀時(shí)表示輸出的設(shè)備配置信息,在其它情況下將從 設(shè)備產(chǎn)生的數(shù)據(jù)輸出。ba0_en、ba1_en 分別表示在配置寫時(shí)I/O、內(nèi)存基地址寄存器的有效 性。ba0_en 或ba1_en 有效是在配置寫期間對(duì)從設(shè)備進(jìn)行配置的一個(gè)必要條件,int_line_en 是中斷線寄存器有效位。
在所有的基地址寄存器中,第0 位均為只讀位并且用來(lái)決定是存儲(chǔ)器空間還是I/O 空間。 如果該位為0 則是映射到存儲(chǔ)器空間,否則,若為1 表示映射到I/O 空間。
映射到I/O 空間的基地址寄存器寬度總是32 位,其中0 位恒為1(用硬件實(shí)現(xiàn)),1 位 為保留位并且其讀出值必須為0,其余位用來(lái)把設(shè)備映射到I/O 空間。映射到存儲(chǔ)器空間的 基地址寄存器可以是32 位或64 位。對(duì)于存儲(chǔ)器基地址寄存器,在0 位上設(shè)置為0,位2 和 位1 將其設(shè)為00,表示基地址寄存器為32 位寬。將位3 設(shè)為1,表示數(shù)據(jù)可預(yù)取。在設(shè)計(jì) 中將內(nèi)存空間定義為1M 大小,1M 地址空間的設(shè)備應(yīng)構(gòu)造地址寄存器的高12 位為1(使用 32 位基址寄存器),其它位置為0。對(duì)于I/O 基地址寄存器為了簡(jiǎn)便將其配置為與內(nèi)存基地 址寄存器一樣的狀態(tài)。
基地址檢查模塊:如果PCI 設(shè)備要占用一定的I/O 空間或存儲(chǔ)器空間, 就必須實(shí)現(xiàn)基址 寄存器, 以便系統(tǒng)設(shè)置軟件在對(duì)系統(tǒng)進(jìn)行自動(dòng)設(shè)置時(shí), 對(duì)其地址譯碼器進(jìn)行編程,使設(shè)備能 獲得所要求的空間,在利用Verilog HDL進(jìn)行PCI 總線接口設(shè)計(jì)時(shí), 必須對(duì)基址寄存器的每 一位都能正確譯碼, 這樣才能確定PCI 設(shè)備是申請(qǐng)I/O 空間, 還是申請(qǐng)存儲(chǔ)器空間, 申請(qǐng) 空間的大小及其在系統(tǒng)中占據(jù)的位置, 是否可預(yù)取等。
在基地址檢查模塊中首先判斷系統(tǒng)是否要求復(fù)位,若要求復(fù)位則需對(duì)存儲(chǔ)交易地址的寄 存器(ba0、ba1)清0;反之則說(shuō)明需要對(duì)給定的基地址進(jìn)行判斷,當(dāng)I/O 基地址寄存器有 效時(shí),將總線上的數(shù)據(jù)pci_ad[31:4]的值賦給寄存器ba0;同樣的當(dāng)內(nèi)存基地址寄存器有效 時(shí)將pci_ad[31:4]的值賦給寄存器ba1。這時(shí)ba0 和ba1 中的值就是系統(tǒng)配置的I/O 和內(nèi)存 在系統(tǒng)中具體的位置。接下來(lái)當(dāng)設(shè)備要選擇申請(qǐng)的空間時(shí),通過(guò)判斷式pci_addr ba0_size的值是否與ba0 或ba1 相等,來(lái)判斷是否選中I/O 或內(nèi)存空間。
奇偶生成模塊: PCI總線的奇偶校驗(yàn)提供了一種檢驗(yàn)數(shù)據(jù)傳輸正確與否的機(jī)制, 在任何 給定的總線周期內(nèi),哪個(gè)設(shè)備驅(qū)動(dòng)了pci_ad[31::00]線,它就必須驅(qū)動(dòng)PAR線,而且在時(shí)間 上要比相應(yīng)的地址或數(shù)據(jù)推遲一個(gè)時(shí)鐘周期。奇偶校驗(yàn)主要用來(lái)確定主設(shè)備是否成功地尋址 到它所希望的從設(shè)備,以及數(shù)據(jù)傳輸?shù)恼_與否。因此,PCI總線進(jìn)行奇偶校驗(yàn)的檢測(cè)是必 需的。而奇偶校驗(yàn)生成就是解決以上問(wèn)題的一個(gè)必要的步驟,從而使PCI總線設(shè)備控制器能 夠?yàn)镻CI總線提供正確的與奇偶校驗(yàn)有關(guān)的信息。
在交易中,從設(shè)備驅(qū)動(dòng)數(shù)據(jù)到pci_dat_out 端口上,并通過(guò)par_out 信號(hào)向主設(shè)備提供 正確的奇偶效驗(yàn)信息。PCI 總線奇偶校驗(yàn)位的產(chǎn)生是采用偶校驗(yàn),參與奇偶校驗(yàn)的位包括 pci_ad[31::00]及pci_cbe_l[3:0],檢驗(yàn)pci_ad[31::00] 及pci_cbe_l[3:0] 上‘1’的 個(gè)數(shù)是否為偶數(shù)。如果為偶數(shù)則為par_out 端口賦‘0’,如果為奇數(shù)則為par_out 端口賦‘1’, 再將這個(gè)值傳回主設(shè)備,在主設(shè)備中與主設(shè)備產(chǎn)生的奇偶校驗(yàn)值做比較,這樣做的目的是為 保證總線命令的正常執(zhí)行和數(shù)據(jù)傳輸?shù)恼_性。如果兩個(gè)值相等說(shuō)明尋址及數(shù)據(jù)的傳輸是正 確的,如果不相等,則說(shuō)明尋址或數(shù)據(jù)的傳輸過(guò)程中發(fā)生了問(wèn)題,此次交易的數(shù)據(jù)必須重新 傳送。而對(duì)于那些實(shí)際并不傳送數(shù)據(jù)的字節(jié)所對(duì)應(yīng)的線,必須被驅(qū)動(dòng)到穩(wěn)定狀態(tài),也要包含 于奇偶計(jì)算之中。
有限狀態(tài)機(jī)模塊:PCI 總線接口芯片是多功能和時(shí)序復(fù)雜的時(shí)序邏輯電路,它的復(fù)雜性 由PCI 總線操作的多樣性決定。為了便于利用硬件描述語(yǔ)言進(jìn)行設(shè)計(jì),將這一復(fù)雜的時(shí)序邏 輯抽象成有限狀態(tài)機(jī),并利用有限狀態(tài)機(jī)實(shí)現(xiàn)復(fù)雜的總線操作。存儲(chǔ)器讀寫操作、I/O 讀寫 操作、配置空間讀寫操作和中斷操作都要通過(guò)一種設(shè)計(jì)合理的有限狀態(tài)機(jī)實(shí)現(xiàn),根據(jù)PCI 總 線操作的時(shí)序關(guān)系給出了一種簡(jiǎn)捷明了的有限狀態(tài)機(jī), 實(shí)現(xiàn)了存儲(chǔ)器的讀寫、I/O 讀寫等各 種操作。如圖1 所示為有限狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖。
空閑狀態(tài)(Idle):根據(jù)當(dāng)前命令為配置命令或讀寫命令而進(jìn)入配置讀寫等待狀態(tài)或存 儲(chǔ)器、I/O 讀寫等待狀態(tài)、其它情況則繼續(xù)在空閑狀態(tài)等待。
配置讀寫等待(con_wait)狀態(tài):系統(tǒng)進(jìn)入配置讀寫等待狀態(tài)后根據(jù)pci_irdy_l 的值 判斷直接進(jìn)入配置讀寫(con)狀態(tài),還是繼續(xù)在配置讀寫等待(con_wait)狀態(tài)循環(huán),如 果pci_irdy_l=0,則進(jìn)入配置讀寫(con)狀態(tài),否則繼續(xù)在配置讀寫等待(con_wait)狀 態(tài)循環(huán)。
配置讀寫(con)狀態(tài):在這一狀態(tài)中將par_oe 設(shè)為有效,開始奇偶校驗(yàn)生成;并將 trdy_l 設(shè)為有效表示從設(shè)備準(zhǔn)備好。下來(lái)判斷pci_irdy_l 信號(hào)是否有效,即主設(shè)備是否準(zhǔn)備好,如果該信號(hào)有效則傳輸配置信息,在下一時(shí)鐘延到來(lái)時(shí)轉(zhuǎn)入backoff 狀態(tài),準(zhǔn)備返回 空閑狀態(tài);否則進(jìn)行等待,直到pci_irdy_l 有效為止。
存儲(chǔ)器或I/O 讀寫等待(rw_wait)狀態(tài):在進(jìn)入這一狀態(tài)前首先應(yīng)判斷是要進(jìn)行讀操 作還是寫操作,下一步控制器要根據(jù)基地址譯碼模塊的譯碼結(jié)果決定控制器是對(duì)存儲(chǔ)器還是 I/O 讀寫,若譯碼結(jié)果顯示存儲(chǔ)器或I/O 都未選中,則進(jìn)入傳輸中止?fàn)顟B(tài)。
存儲(chǔ)器或I/O 讀寫等待2(rw_wait2)狀態(tài):進(jìn)入該狀態(tài)的同時(shí)開始計(jì)數(shù),根據(jù)read_flag 的值,決定進(jìn)行讀操作還是寫操作。
存儲(chǔ)器或I/O 讀等待(read_wait)狀態(tài):在存儲(chǔ)器或I/O 讀寫等待2(rw_wait2)狀 態(tài)時(shí)判斷若為讀操作,則狀態(tài)機(jī)轉(zhuǎn)入存儲(chǔ)器或I/O 讀等待(read_wait)狀態(tài),存儲(chǔ)器或I/O 讀等待(read_wait)狀態(tài)是在從設(shè)備trdy_l 有效之前讀取從設(shè)備的第一個(gè)數(shù)據(jù)段,也就是 地址段。
存儲(chǔ)器或I/O 讀寫(rw)狀態(tài): 在這一狀態(tài)中進(jìn)行存儲(chǔ)器或I/O 讀寫。
傳輸中止(abort)狀態(tài):使從設(shè)備停止響應(yīng),傳輸中止。
存儲(chǔ)器或I/O 讀寫停止等待(last_rw)狀態(tài):這是數(shù)據(jù)傳輸結(jié)束的前一個(gè)周期,表示即將停止數(shù)據(jù)傳輸。
重試(retry)狀態(tài):當(dāng)信息未準(zhǔn)備好時(shí),系統(tǒng)進(jìn)入重試狀態(tài)。
結(jié)束狀態(tài):結(jié)束此次交易。
計(jì)數(shù)器模塊:在DEVSEL確定以后,必須在16個(gè)總線周期內(nèi)提供或者接收數(shù)據(jù),這一模塊 用來(lái)實(shí)現(xiàn)一個(gè)周期計(jì)數(shù)功能,當(dāng)在第12個(gè)周期時(shí)數(shù)據(jù)仍然未就緒時(shí)提供一個(gè)“retry”信號(hào) 來(lái)要求數(shù)據(jù),同時(shí)在16個(gè)周期到來(lái)時(shí)通知終端設(shè)備此次交易結(jié)束。
地址鎖存模塊:在總線交易的地址段對(duì)PCI總線的地址、C/BE信號(hào)、IDSEL信號(hào)實(shí)現(xiàn)鎖存, 提供了這些信號(hào)的寄存器。
2 PCI總線從設(shè)備控制器的FPGA實(shí)現(xiàn)
FPGA 是當(dāng)前復(fù)雜數(shù)字硬件電路設(shè)計(jì)的理想首選。設(shè)計(jì)選用Xilinx 公司生產(chǎn)的Sparten —Ⅱ 200 PCI 驗(yàn)證板。集成軟件環(huán)境為Xilinx ISE6.1i。
設(shè)計(jì)中有源代碼輸入、綜合、實(shí)現(xiàn)等3 個(gè)比較大的階段,而電路仿真的切入點(diǎn)也基本與 這些階段吻合 。選用XST(Xilinx Synthesis Technology)作為綜合工具。PCI 驗(yàn)證板電 源、管教電壓、晶振分別選為5V、 2.5V、50MHz,下載模式選擇為JTAG 模式,并通過(guò)ISP PROM 配置FPGA。
3 PCI總線設(shè)備控制器的驗(yàn)證
硬件系統(tǒng)通常是通過(guò)信號(hào)來(lái)驅(qū)動(dòng)的,在不同的輸入信號(hào)下其行為表現(xiàn)是產(chǎn)生不同的輸出 結(jié)果,因此,仿真輸入信息的產(chǎn)生是對(duì)系統(tǒng)進(jìn)行仿真的重要前提和必須進(jìn)行的步驟,PCI 總線控制器的仿真是由一段Verilog HDL 語(yǔ)言程序直接產(chǎn)生仿真的輸入信息,將此外部激勵(lì)信 號(hào)施加于PCI 總線控制器模型,通過(guò)觀察其在外部激勵(lì)信號(hào)作用下的反應(yīng)來(lái)判斷PCI 總線控 制器是否能實(shí)現(xiàn)預(yù)期的功能。對(duì)PCI 總線控制器的仿真,主要是按照PCI 總線操作命令來(lái)進(jìn) 行的,對(duì)于正常的總線操作結(jié)束和由主設(shè)備及從設(shè)備提出的操作終止都作了測(cè)試,其仿真結(jié) 果實(shí)現(xiàn)了預(yù)期的要求。由于仿真項(xiàng)目比較多,我們選取其中具有代表性的一個(gè)項(xiàng)目來(lái)舉例說(shuō) 明。圖2 是存儲(chǔ)器空間沒有等待周期的突發(fā)數(shù)據(jù)段寫這一過(guò)程的仿真結(jié)果。
4 結(jié)論
PCI 總線從設(shè)備控制器的設(shè)計(jì)按照自頂向下的設(shè)計(jì)流程,實(shí)現(xiàn)了PCI 從設(shè)備控制器的設(shè) 計(jì)目標(biāo),完成了PCI 總線協(xié)議所要求的基本功能,目前已是一個(gè)完整可用的PCI 總線從設(shè)備 控制器IP 核,有很高的工程價(jià)值。
本文的創(chuàng)新點(diǎn):該設(shè)計(jì)方案將PCI 從設(shè)備控制器作為IP 核來(lái)設(shè)計(jì),將總線接口控制器 按照功能分為有限狀態(tài)機(jī)模塊、奇偶校驗(yàn)?zāi)K、配置空間配置模塊、基地址檢查模塊、計(jì)數(shù) 器模塊、地址鎖存模塊和頂層模塊這7 個(gè)模塊,編寫了測(cè)試文件,測(cè)試表明,設(shè)計(jì)完全符合 功能要求。
評(píng)論