基于FPGA的片上可編程系統(tǒng)(SOPC)設(shè)計之:基于NIOS II的開發(fā)設(shè)計流程
8.3基于NIOSII的開發(fā)設(shè)計流程
NIOSII使用NIOSIIIDE集成開發(fā)環(huán)境來完成整個軟件工程的編輯、編譯、調(diào)試和下載。在采用NIOS處理器設(shè)計嵌入式系統(tǒng)時,通常會按照以下步驟。
(1)分析系統(tǒng)需求說明,包括功能需求和性能約束等。
(2)根據(jù)分析結(jié)果,選擇片外外設(shè)或片內(nèi)IP(知識產(chǎn)權(quán)核)。除此以外,還要對選擇的IP和外設(shè)進(jìn)行初步性能評估,以保證能夠滿足系統(tǒng)需求。
(3)設(shè)定IP和系統(tǒng)參數(shù)。
(4)確定系統(tǒng)互聯(lián)邏輯,分配FPGA的引腳等。
(5)結(jié)合NIOS提供的軟件開發(fā)包進(jìn)行軟件開發(fā)。
8.3.1硬件開發(fā)流程
首先來看一下NIOS的硬件系統(tǒng)組成。
1.NIOS硬件組成
如圖8.2所示為典型NIOSII系統(tǒng)的硬件組成。
圖8.2NIOSII系統(tǒng)的硬件組成
如圖8.3所示為典型NIOSCPU的系統(tǒng)框圖。
圖8.3NIOSCPU系統(tǒng)框圖
我們可以將圖8.3的系統(tǒng)結(jié)構(gòu)劃分如下。
其中,片內(nèi)邏輯是指實現(xiàn)在FPGA內(nèi)部的電路設(shè)計,系統(tǒng)模塊指的是由SOPCBuilder自動生成的設(shè)計。
SOPCBuilder會根據(jù)用戶選擇的IP生成相應(yīng)的HDL描述文件(系統(tǒng)模塊文件),這些文件與用戶邏輯區(qū)域內(nèi)的設(shè)計描述文件一起由Quartus軟件綜合,然后下載到FPGA內(nèi),這樣就構(gòu)成了系統(tǒng)的硬件基礎(chǔ)。
系統(tǒng)模塊包含至少一個Avalon主外設(shè)和整個Avalon總線模塊。系統(tǒng)模塊通常還包含一些Avalon從外設(shè),例如UART、PIO和定時器等。SOPCBuilder可以幫助設(shè)計者從IP庫尋找合適的IP并很快地集成一個系統(tǒng),它采用圖形用戶界面(GUI)顯示和組織IP模塊,能夠自動生成IP模塊互連邏輯以及生成用于綜合和模擬的文件,使得設(shè)計者可以輕松完成系統(tǒng)設(shè)計。
當(dāng)用戶使用SOPCBuilder創(chuàng)建一個新的系統(tǒng)時,SOPCBuilder會為該系統(tǒng)自動生成一個PTF文件,所有的設(shè)計信息都存儲在該P(yáng)TF文件里。當(dāng)使用SOPCBuilder重新打開一個已有的系統(tǒng)時,SOPCBuilder會從并且只從PTF文件中讀取系統(tǒng)具體設(shè)計信息。
用戶邏輯區(qū)內(nèi)可以包含用戶自定義的Avalon外設(shè),以及同系統(tǒng)模塊無關(guān)的其他的用戶自定義邏輯。硬件系統(tǒng)建立起來以后,用戶可以利用Altera公司提供的NIOSIIIDE工具結(jié)合SOPCBuilder生成的與硬件系統(tǒng)對應(yīng)的軟件開發(fā)包來開發(fā)用戶軟件。
下面介紹使用這些設(shè)計工具進(jìn)行NIOSII開發(fā)的流程。
2.NIOSII硬件開發(fā)流程
下面是NIOSII硬件開發(fā)流程的主要步驟。
·用SOPCBuilder來選擇合適的CPU、存儲器及外圍器件,比如片內(nèi)存儲器、PIO、UART和片外存儲器接口。
·使用QuartusII軟件選取具體的器件,并對SOPCBuilder生成HDL設(shè)計文件進(jìn)行布局布線;再根據(jù)開發(fā)板分配I/O管腳;編譯完后生成適合目標(biāo)器件的網(wǎng)表。
·使用下載電纜將配置文件下載到開發(fā)板上。當(dāng)校驗硬件或時鐘完畢后,就可以開始軟件開發(fā)工作了。
下面這個例子將要添加一個NIOSII系統(tǒng)得所有硬件部分,主要包括以下內(nèi)容。
(1)選擇CPU。
選擇NIOSII/e經(jīng)濟(jì)型處理器,其特點(diǎn)是占用邏輯資源少,編譯速度快,不包括緩存,如圖8.4所示。
圖8.4選擇NIOSII處理器
(2)選擇JTAG調(diào)試模塊。
選擇第一層JTAG硬件調(diào)試模塊,如圖8.5所示。
圖8.5選擇JTAG調(diào)試模塊
(3)設(shè)置JTAGUART接口。
它是NIOSII系統(tǒng)嵌入式處理器新添加的接口元件,通過內(nèi)嵌在AlteraFPGA內(nèi)部的聯(lián)合測試行動組(JTAG)電路,在PC主機(jī)和FPGA之間進(jìn)行串行字符流通信。特點(diǎn)是在運(yùn)行時在調(diào)試區(qū)輸入信息可以與FPGA進(jìn)行交互。
如圖8.6所示,使用默認(rèn)選項即可。
(4)設(shè)置定時器。
如圖8.7所示,定時器對于HAL系統(tǒng)庫中的器件驅(qū)動非常有用,比如JTAGUART驅(qū)動使用定時器來實現(xiàn)10s的暫停。選擇Intervaltimer在設(shè)置向?qū)е兄芷谶x擇1msec,預(yù)設(shè)置(PresetConfigurations)中選擇Full-featured。
圖8.6JTAGUART接口 圖8.7Avalon總線定時器
(5)添加外部Flash。
設(shè)置Flash地址寬度為20bits,帶寬為16bits,如圖8.8所示。
圖8.8添加外部Flash
圖8.8添加外部Flash(續(xù))
如果用戶程序和數(shù)據(jù)比較大,超出了EPCS1的容量,則程序和數(shù)據(jù)可以保存在普通Flash中。Flash的燒寫可以采用NIOSIIIDE的“FlashProgrammer”來燒寫,具體操作過程請參考/altera/kits/NIOS2/documents目錄下“ug_NIOS2_flash_programmer.pdf”。
(6)添加外部SDRAM。
通常的系統(tǒng)都需要用戶指定一個內(nèi)存空間,這個內(nèi)存是指RAM,可以是片上的,也可以是片外的SDRAM或SRAM等。如果用戶程序較大,超出了EP1C20所能定制的最大片上RAM容量,則也可以將程序放在SDRAM中運(yùn)行。
將SDRAM進(jìn)行如圖8.9所示的設(shè)置。
圖8.9添加外部SDRAM
(7)設(shè)置Avalon外部總線。
軟件使用Avalon接口來連接片上元件和Avalon主從端口的。在NIOS開發(fā)板上,要實現(xiàn)NIOS系統(tǒng)與FPGA片外存儲器通信,就必須在Avalon總線和連接外部存儲器的總線之間添加一個橋,這個橋就是Avalon三態(tài)總線。
在如圖8.10中選擇為Avalon外部總線添加寄存器。
(8)添加串行通信設(shè)備UART。
通用串行總線RS-232協(xié)議是我們最常用的通信協(xié)議,所以把它也添加到我們的系統(tǒng)里。注意選擇所需的數(shù)據(jù)幀格式,如圖8.11所示。
圖8.10設(shè)置Avalon外部總線 圖8.11添加串行通信設(shè)備UART
(9)添加LCD顯示。
使用標(biāo)準(zhǔn)16027字符型液晶顯示器。
(10)添加片上RAM。
如圖8.12所示,為SOPC系統(tǒng)添加片上RAM資源,并設(shè)置RAM參數(shù)。
(11)添加systemid。
(12)添加8個LED和輸入設(shè)備按鍵開關(guān)。
以上幾個步驟包含了一個標(biāo)準(zhǔn)SOPC一般所需要的設(shè)備,根據(jù)下面信息欄中的提示把RAM的數(shù)據(jù)線連接到總線上。接下來指定Flash地址為基地址,自動分配基地址及中斷。
最后完成的SOPC模塊如圖8.13所示。
接下來就可以在QuartusII中搭建完整的系統(tǒng),加入鎖相環(huán)、定義管腳等,并進(jìn)行編譯。這部分的內(nèi)容詳見本書其他章節(jié)的介紹。
需要注意的是由于Flash與SRAM共用一條數(shù)據(jù)總線,所以要把SRAM的片選關(guān)閉,如圖8.14所示。
至此,整體SOPC硬件系統(tǒng)搭建完畢,其原理圖如圖8.15所示。
這樣一個硬件系統(tǒng)規(guī)模已經(jīng)比較完整了,可以作一些設(shè)計,比如Flash讀寫、液晶顯示、串口傳輸?shù)裙δ堋0堰@些集合起來就可以用C++軟件編寫一個簡單的圖像處理算法。
下面介紹一下SOPC系統(tǒng)的軟件開發(fā)流程。
圖8.13建立的SOPC模塊
圖8.14關(guān)閉SRAM片選
圖8.15SOPC系統(tǒng)原理圖
8.3.2軟件開發(fā)流程
系統(tǒng)軟件設(shè)計具體工作如下。
(1)在用SOPCBuilder系統(tǒng)集成軟件進(jìn)行硬件設(shè)計同時,開始編寫C/C++軟件,比如算法或控制程序。用戶可以使用現(xiàn)成的軟件庫和開放的操作系統(tǒng)內(nèi)核加快開發(fā)進(jìn)程。
(2)在NIOSIIIDE中建立新的軟件工程時,IDE會根據(jù)SOPCBuilder對系統(tǒng)的硬件配置自動定制HAL(硬件抽象層)系統(tǒng)庫。這個系統(tǒng)庫可以為程序和底層硬件的通信提供接口驅(qū)動程序。
(3)使用NIOSIIIDE編譯調(diào)試軟件。
(4)在硬件邏輯已經(jīng)下載到開發(fā)板的基礎(chǔ)上將軟件下載到開發(fā)板上并在硬件上運(yùn)行。
下面主要介紹使用SOPCBuilder來為一個NIOSⅡ嵌入式處理器系統(tǒng)進(jìn)行軟件開發(fā)的過程,具體實現(xiàn)過程如下。
(1)進(jìn)行硬件開發(fā),如8.3.1小節(jié)所示。
(2)啟動NIOSIIIDE。
首先在AlterSOPCBuilder中,單擊RunNIOSIIIDE,啟動NIOSIIIDE,如圖8.16所示。
圖8.16NIOSIIIDE界面
(3)新建軟件工程。
選擇“File”菜單的“New”菜單的“Project”選項,開啟“NewProject”對話框,選擇“C/C++Application”,如圖8.17所示。
(4)選擇軟件模板。
在新建軟件工程對話框中單擊“Next”按鈕,為SOPC系統(tǒng)選擇軟件模板,如圖8.18所示。
圖8.17新建軟件工程 圖8.18選擇軟件模板
(5)獲取SOPC系統(tǒng)信息。
單擊“SOPCBuilderSystem”右邊的“Browse”按鈕打開目錄對話框,從該工程目錄下找到“NIOSII_c.ptf”,因為NIOSIIIDE必須從這個文件獲取該系統(tǒng)的相關(guān)信息。打開該文件后,界面顯示如圖8.19所示。
圖8.19新建的軟件工程
單擊“Finish”按鈕,即可建立一個名為Hello_LED_0的軟件模板工程。
(6)編輯軟件代碼。
(7)設(shè)置工程優(yōu)化級別。
編譯之前我們先對項目進(jìn)行一些設(shè)置,以使編譯器編譯出更高效、占用空間更小的代碼。右鍵單擊工程名稱,在彈出的菜單中選擇“Properties”選項,如圖8.20所示。
圖8.20設(shè)置工程屬性
單擊后打開工程屬性對話框,在“ConfigurationSettings”點(diǎn)擊“General”頁面,在“OptimizationLevel”(優(yōu)化級別)中選擇“Optimizesize(-Os)”,如圖8.21所示。
圖8.21工程優(yōu)化級別
(8)設(shè)置系統(tǒng)庫屬性。
右鍵單擊*_syslib[NIOSII_c]工程名稱,在彈出的菜單中選擇“Properties”選項,如圖8.22所示。
圖8.22設(shè)置系統(tǒng)庫屬性
在系統(tǒng)庫工程屬性對話框中,同樣在“ConfigurationSettings”點(diǎn)擊“General”頁面,在“OptimizationLevel”中選擇“Optimizesize(-Os)”,如圖8.23所示。
圖8.23系統(tǒng)庫工程優(yōu)化級別
然后,單擊該對話框左側(cè)的“SystemLibrary”打開“SystemLibrary”屬性頁面。將“Maxfiledescriptors:”欄改為4,清除“Cleanexit(flushbuffers)”和“Linkwithprofilinglibrary”,選上“Reduceddevicedrivers”和“SmallClibrary”,如圖8.24所示。
單擊“OK”按鈕,完成設(shè)置。以上設(shè)置主要目的是為了優(yōu)化程序,并減少程序占用內(nèi)存空間。
圖8.24設(shè)置系統(tǒng)庫其他屬性
(9)編譯。
右鍵單擊工程,在彈出的菜單中選擇“BuildProject”選項,開始進(jìn)行軟件工程編譯(為使編譯過程更加順利,此時最好關(guān)閉殺毒軟件和其他占用電腦資源較大的軟件)。
如果工程設(shè)計無誤,可以看到以下信息:“Buildcompleted”。如果看到了該條提示,表示軟件編譯成功,可以看到程序占用空間等信息。
(10)調(diào)試。
將ByteBlasterII下載線接到FPGA實驗平臺的JTAG口,接上5V電源。選擇“Run”菜單下的“DebugAs”選項,選擇“NIOSIIHardware”,如圖8.26所示。
圖8.26打開調(diào)試界面
選擇后,NIOSIIIDE會打開調(diào)試界面(DebugPerspective)。可以在程序中設(shè)置斷點(diǎn),運(yùn)行停止在斷點(diǎn)處(圖8.27的箭頭處),如圖8.27所示。
圖8.27調(diào)試至斷點(diǎn)
單擊繼續(xù)執(zhí)行(Resume)按鈕,程序就會繼續(xù)運(yùn)行。單擊暫停按鈕,程序暫停運(yùn)行。單擊停止按鈕,將退出運(yùn)行,如圖8.28所示。
圖8.28調(diào)試按鈕
如需對程序進(jìn)行修改,單擊停止按鈕退出運(yùn)行,然后單擊如圖8.29所示的按鈕回到C/C++編輯界面。
選擇后,即可返回程序編輯界面修改代碼,然后后再重復(fù)上述調(diào)試過程。
(11)編譯并下載。
編寫完軟件工程后,我們還要回到QuartusⅡ里面對整個系統(tǒng)進(jìn)行編譯。選擇“Processing”菜單下面的“StarCompilation”。編譯成功以后我們就可以選擇“Tools”菜單里面的“Programmer”,下載整個配置到FPGA中去了。
至此整個SOPC系統(tǒng)的軟硬件開發(fā)流程就已經(jīng)介紹完畢。讀者可以動手設(shè)計自己的SOPC系統(tǒng)了。
評論