Zynq SoC架構(gòu)的主要優(yōu)勢(shì)之一就是能夠通過(guò)在器件的可編程邏輯內(nèi)構(gòu)建外設(shè)來(lái)加快處理速度。
這是Adam Taylor 計(jì)劃編寫(xiě)的Zynq-7000 All Programmable SoC實(shí)際操作教程系列的第三部分。前兩部分教程分別刊登在《賽靈思中國(guó)通訊》第47期和48期。Adam 經(jīng)常為《賽靈思中國(guó)通訊》撰稿,同時(shí)他還為All Programmable 星球社區(qū)撰寫(xiě)博客 ( www.programmableplanet.com )。
賽靈思 Zynq™- 7000 All Programmable SoC真正的重要優(yōu)勢(shì)之一就是能夠通過(guò)在可編程邏輯(PL)側(cè)構(gòu)建外設(shè)來(lái)提高器件處理系統(tǒng)(PS)側(cè)的性能。最初您可能會(huì)認(rèn)為這將是一項(xiàng)比較復(fù)雜的工作,但是,創(chuàng)建自己的外設(shè)其實(shí)很簡(jiǎn)單。
如果您試圖提高PS的性能或者使用PS來(lái)控制PL側(cè)的設(shè)計(jì)行為,那么在PL內(nèi)添加外設(shè)會(huì)起到很大的幫助。例如,PS可能會(huì)使用一系列存儲(chǔ)器映射寄存器來(lái)控制PL內(nèi)的設(shè)計(jì)運(yùn)行或選項(xiàng)。
我們選擇一種簡(jiǎn)單模塊作為設(shè)計(jì)實(shí)例,該模塊用于打開(kāi)和關(guān)閉ZedBoard上的存儲(chǔ)器映射LED。我們將使用賽靈思PlanAhead™、XPS和軟件開(kāi)發(fā)套件(SDK)工具分三步來(lái)創(chuàng)建該模塊。
1. 在嵌入式開(kāi)發(fā)套件(EDK)環(huán)境中創(chuàng)建模塊。
2. 為模塊編寫(xiě)VHDL程序并構(gòu)建系統(tǒng)。
3. 編寫(xiě)使用最新定制模塊的軟件。
在EDK中創(chuàng)建模塊
要?jiǎng)?chuàng)建自己的外設(shè),首先需要從包含Zynq SoC設(shè)計(jì)的PlanAhead項(xiàng)目中打開(kāi)Xilinx Platform Studio (XPS) ,并選擇菜單選項(xiàng)中的“hardware->create or import peripheral” 。
對(duì)我們的實(shí)例模塊而言,ZedBoard上的7個(gè)LED應(yīng)展示出walking display的效果,除了最重要的那個(gè)LED必須在軟件應(yīng)用控制下點(diǎn)亮以外,其他都可以依次相繼點(diǎn)亮。盡管這并不是最棒的定制模塊應(yīng)用,但對(duì)于流程演示 而言是一種非常有用且簡(jiǎn)單的實(shí)例。一旦掌握了這個(gè)流程,您將掌握實(shí)現(xiàn)更復(fù)雜模塊所需的全部知識(shí)。
創(chuàng)建外設(shè)時(shí)只需相繼打開(kāi)10個(gè)簡(jiǎn)單窗口并選擇所需的選項(xiàng)。
前兩個(gè)截屏(如圖1所示)詢(xún)問(wèn)是否需要?jiǎng)?chuàng)建外設(shè)或?qū)氍F(xiàn)有的外設(shè),如果是,需要將其關(guān)聯(lián)到哪個(gè)項(xiàng)目。下一步,您可在第三個(gè)截屏中對(duì)模塊進(jìn)行命名并高效地定義版本和修訂版本。(注意:可利用外設(shè)流程底部的選項(xiàng)通過(guò)回讀*.cip文件來(lái)重新定制已創(chuàng)建的模塊。)
選定模塊名稱(chēng)后,接下來(lái)要選擇所需AXI總線類(lèi)型,如圖2所示。我們的實(shí)例設(shè)計(jì)需要的是一種簡(jiǎn)單的存儲(chǔ)器映射控制寄存器型接口,因此我們選擇了最上面的AXI4-Lite選項(xiàng)。(如需了解有關(guān)不同AXI總線類(lèi)型的更多信息,敬請(qǐng)?jiān)L問(wèn): http://china.xilinx.com/support/docu- mentation/white_papers/wp379_AXI 4_Plug_and_Play_IP.pdf )。在這個(gè)步驟中將創(chuàng)建眾多簡(jiǎn)單寄存器。我們可利用處理系統(tǒng)通過(guò)AXI總線對(duì)寄存器進(jìn)行讀/寫(xiě)操作。
這些寄存器位于Zynq SoC上的可編程邏輯架構(gòu)中,因此也能通過(guò)用于創(chuàng)建外設(shè)功能的用戶(hù)邏輯應(yīng)用來(lái)訪問(wèn)。
接下來(lái)的六個(gè)截屏為您提供相應(yīng)選項(xiàng),以便對(duì)AXI的主配置或從配置以及您將用于控制用戶(hù)邏輯和支持文件的寄存器的數(shù)量進(jìn)行定制。本例中我們僅使用一 個(gè)寄存器,并將其用作AXI-Lite的從配置。簡(jiǎn)化系統(tǒng)開(kāi)發(fā)的最重要方法是選擇外設(shè)實(shí)現(xiàn)支持標(biāo)簽上的“generate template driver files”選項(xiàng)。這樣就能提供一系列有助于所創(chuàng)外設(shè)內(nèi)部通信的源文件和頭文件。
最后一步,XPS會(huì)生成一系列有助于創(chuàng)建和使用新外設(shè)的文件:
• 以您的外設(shè)命名的頂層VHDL文件
• 可在其中創(chuàng)建用戶(hù)邏輯的VHDL文件
• 微處理器外設(shè)描述文件:用于定義連接模塊的接口,以便將模塊與XPS配合使用
• CIP文件:必要時(shí)可對(duì)外設(shè)進(jìn)行重新定制
• 針對(duì)SDK的驅(qū)動(dòng)程序源文件
• 針對(duì)SDK的實(shí)例源文件
• 微處理器驅(qū)動(dòng)程序定義文件:詳細(xì)描述外設(shè)所需的驅(qū)動(dòng)程序
這些文件將在PlanAhead源目錄(即本例中的zed_blog.srcs\ sources_1\edk\proc_subsystem)下創(chuàng)建。
源目錄的子目錄是包含XPS和PlanAhead所需文件(在與外設(shè)同名的目錄下)的Pcores目錄以及包含SDK所需文件的驅(qū)動(dòng)程序目錄。
創(chuàng)建RTL
在Pcores目錄中您可以看到兩個(gè)文件,其中一個(gè)與您所創(chuàng)建的組件同名(本例中為led_if.vhd),另一個(gè)文件名為
user_logic.vhd。您可在user_logic.vhd這個(gè)文件中進(jìn)行設(shè)計(jì)創(chuàng)建。同時(shí)您將會(huì)發(fā)現(xiàn)向?qū)б呀?jīng)幫您生成了用于通過(guò)AXI總線在此文 件中進(jìn)行通信所需的寄存器和接口。此外,您可在led_if.vhd文件進(jìn)行用戶(hù)邏輯模塊實(shí)例化。因此,對(duì)user_logic.vhd實(shí)體所做的任何修 改都必須傳送到端口映射中。如果要求使用外部端口(例如我們的設(shè)計(jì)實(shí)例就需要外部端口來(lái)點(diǎn)亮LED),還必須傳送對(duì)led_if.vhd實(shí)體所做的修改。
邏輯設(shè)計(jì)創(chuàng)建完成后,您可能希望對(duì)邏輯進(jìn)行仿真以確保達(dá)到預(yù)期效果。在Pcores/devl/bfmsim目錄下為您提供了總線功能模型。
在XPS中使用您的模塊
在創(chuàng)建了VHDL文件或其它文件并確保它們能正常運(yùn)行后,您將期望在XPS項(xiàng)目中能夠應(yīng)用此模塊。要正確地做到這點(diǎn),需要在VHDL設(shè)計(jì)過(guò)程中確保準(zhǔn)備添加的端口使用最新的微處理器外設(shè)描述(MPD)文件。
通過(guò)在XPS中編輯MPD文件可以順利完成這一任務(wù)??稍赑roject Local Pcores->USER->core name目錄下找到您所創(chuàng)建的外設(shè)。右擊文件名就可以查看MPD文件。
您需要添加設(shè)計(jì)中包含的非AXI接口,以便查看并在XPS中正確處理I/O??赏ㄟ^(guò)以下鏈接查看MPD文件的語(yǔ)法: http://china.xilinx.com/support/docu-mentation/sw_manuals/xilinx14_4/psf... ,如圖3所示,語(yǔ)法非常簡(jiǎn)單明了。圖中突出顯示的行(即中間列表底部第59行)就是用于將LED輸出端口連接到模塊的語(yǔ)句。
對(duì)MPD文件進(jìn)行更新后必須點(diǎn)擊“rescan user IP repositories”,以確保將修改內(nèi)容載入XPS。這時(shí)就可將器件導(dǎo)入系統(tǒng),就像來(lái)自IP庫(kù)中的任何其他外設(shè)一樣。一旦將其放入您希望的地址空間 內(nèi)(注意:最小4K)并按要求將輸出連接到外部端口,就可在必要時(shí)運(yùn)行設(shè)計(jì)規(guī)則檢查程序。如果沒(méi)有任何錯(cuò)誤,就可關(guān)閉XPS并返回PlanAhead。
返回PlanAhead環(huán)境后,需要重新生成頂層HDL。為此,右擊您所創(chuàng)建的處理器子系統(tǒng)并選擇“create top HDL”選項(xiàng)(參考《Xcell雜志》第82期,了解有關(guān)創(chuàng)建Zynq SoC PlanAhead項(xiàng)目方面的內(nèi)容)。如果已對(duì)設(shè)計(jì)的I/O管腳進(jìn)行更改,那么在實(shí)現(xiàn)之前的最后一步就是修改PlanAhead中的UCF文件。如果您對(duì) 管腳滿(mǎn)意,就可以執(zhí)行實(shí)現(xiàn)操作,并生成隨時(shí)可在SDK中使用的比特流。
在SDK中使用外設(shè)
到這一步時(shí),我們已經(jīng)做好了在軟件環(huán)境中使用外設(shè)的準(zhǔn)備。與創(chuàng)建和實(shí)現(xiàn)任務(wù)一樣,該流程也非常簡(jiǎn)單直觀。第一步是使用PlanAhead中的 “export hardware for SDK”選項(xiàng)將硬件導(dǎo)出至軟件開(kāi)發(fā)套件。接著打開(kāi)SDK,并檢查MSS文件以確定您所創(chuàng)建的外設(shè)已經(jīng)存在。所列外設(shè)名稱(chēng)應(yīng)與旁邊的驅(qū)動(dòng)程序名稱(chēng)相同;
在第一個(gè)實(shí)例中,驅(qū)動(dòng)程序被命名為“通用”。在SDK中使用外設(shè)時(shí),通用驅(qū)動(dòng)程序便不是問(wèn)題。如果您想使用它,就需要涵蓋頭文件#include "xil_io.h."。這樣就可以調(diào)用函數(shù)Xil_in32(地址)或Xil_out32(地址),以便對(duì)外設(shè)進(jìn)行讀寫(xiě)操作。
采用這種方法時(shí),需要了解外設(shè)的基地址(在xparameters.h中給出)以及寄存器間的偏移地址。在這種情況下,由于本設(shè)計(jì)實(shí)例采用32位尋 址,因此寄存器的間隔為0x04。但是,如果在使用XPS創(chuàng)建外設(shè)時(shí)選擇了“驅(qū)動(dòng)程序-創(chuàng)建”選項(xiàng),那么將為您的外設(shè)專(zhuān)門(mén)構(gòu)建單獨(dú)的驅(qū)動(dòng)程序。且該驅(qū)動(dòng)程 序也將位于PlanAhead源目錄的驅(qū)動(dòng)程序子目錄中。
可用這類(lèi)專(zhuān)門(mén)構(gòu)建的驅(qū)動(dòng)程序來(lái)代替設(shè)計(jì)中的通用驅(qū)動(dòng)程序,但首先您必須設(shè)置軟件庫(kù)指向該目錄,以便查看新生成的驅(qū)動(dòng)程序??筛鶕?jù)“Xilinx Tools ->Repositories menu”菜單定義該軟件庫(kù)(圖4)。
一旦設(shè)定的軟件庫(kù)指向正確的目錄后,就可以對(duì)軟件庫(kù)進(jìn)行重新掃描并關(guān)閉對(duì)話框。緊接著,是選擇新驅(qū)動(dòng)程序以更新板支持包。右擊Project Explorer下的BSP圖標(biāo),打開(kāi)板支持包設(shè)置。點(diǎn)擊驅(qū)動(dòng)程序標(biāo)簽,您將看到包含所有外設(shè)及其驅(qū)動(dòng)程序的列表。從適用于該器件的驅(qū)動(dòng)程序列表中選擇相 應(yīng)的驅(qū)動(dòng)程序,就可以修改選擇的外設(shè)驅(qū)動(dòng)程序(圖5)。
通過(guò)名稱(chēng)為外設(shè)選擇驅(qū)動(dòng)程序并點(diǎn)擊OK。如果您選擇了自動(dòng)編譯選項(xiàng),那么將會(huì)重新編譯項(xiàng)目。一旦代碼被重新構(gòu)建,那么就要做好利用所提供的驅(qū)動(dòng)程序與外設(shè)進(jìn)行通信的準(zhǔn)備。
您需要在源代碼中加入驅(qū)動(dòng)程序頭文件#include "led_if.h",并采用來(lái)自xpara-meters.h的外設(shè)基地址使接口能夠明確外設(shè)在存儲(chǔ)空間中的位置。然后,調(diào)用“include” 文件中驅(qū)動(dòng)程序所提供的命令就比較簡(jiǎn)單了。在我們的設(shè)計(jì)中,調(diào)用示例如下
LED_IF_mWriteSlaveReg0(LED_
ADDR, LED_IF_SLV_REG0_OFF-
SET, 0x01);
寫(xiě)入此命令后,就可以在硬件環(huán)境中對(duì)軟件進(jìn)行測(cè)試并確認(rèn)其是否按預(yù)期正常運(yùn)行。
正如您所看到的,在Zynq SoC 設(shè)計(jì)中創(chuàng)建自己的外設(shè)并非您最初想象的那么復(fù)雜。外設(shè)的創(chuàng)建能為您的Zynq SoCPS乃至最終整個(gè)解決方案帶來(lái)諸多優(yōu)勢(shì)。