有了前面兩個(gè)實(shí)例的鋪墊,下面這個(gè)工程就要帶大家嘗試搭建一個(gè)基于MicroBlaze的應(yīng)用。特權(quán)同學(xué)也是第一次接插X(qián)ilinx的嵌入式開(kāi)發(fā)平臺(tái),跑了一個(gè)流程下來(lái),正如所料,和Altera的SOPC Builder(今后主推Qsys)以及EDS相比,單從開(kāi)發(fā)環(huán)境上來(lái)看是大同小異、換湯不換藥的。????????
如圖1所示,其實(shí)在安裝ISE軟件的時(shí)候,由于我們選擇了Embedded Edition(可參考手記2),那么在安裝完成的程序菜單中,如圖1所示,EDK(Embedded Development Kit)后有兩個(gè)開(kāi)發(fā)平臺(tái),即Xilinx Platform Studio(硬件開(kāi)發(fā)平臺(tái),簡(jiǎn)稱XPS)和Xilinx Software Development Kit(軟件開(kāi)發(fā)平臺(tái),簡(jiǎn)稱SDK),對(duì)應(yīng)Altera的SOPC Builder(或Qsys)和EDS。由于Xilinx的SDK支持的軟核MicroBlaze片內(nèi)總線是AXI,而Altera的NIOS II主推的是Avalon,這里先不論孰優(yōu)孰劣,他們之間多少還是有些區(qū)別的,非常習(xí)慣于SOPC Buider下工作的特權(quán)同學(xué)第一次接觸XPS的環(huán)境還真有些不適應(yīng)。而反觀軟件平臺(tái)SDK,由于和EDS一樣都是基于Eclipse的架構(gòu),所以比較容易上手,甚至連菜單按鈕的布局和使用也多少有些似曾相識(shí)的感覺(jué)。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/042301P95_0.jpg)
?圖1 EDK開(kāi)發(fā)環(huán)境相似歸相似,咱們還是老老實(shí)實(shí)的找個(gè)傻瓜
教程扎扎實(shí)實(shí)的熟悉一下整個(gè)開(kāi)發(fā)流程。很自然的,特權(quán)同學(xué)便開(kāi)啟DocNav淘淘金,如圖2所示,EDK and SDK下盡都是相關(guān)文檔,而經(jīng)過(guò)粗略的瀏覽后,特權(quán)同學(xué)鎖定了“EDK Concepts, Tools, and
Techniques.pdf”文檔。雖然此文檔也只是很簡(jiǎn)單的列舉了一個(gè)軟硬件協(xié)同開(kāi)發(fā)的實(shí)例,很多設(shè)計(jì)細(xì)節(jié)都被忽略了(沒(méi)讓特權(quán)同學(xué)少吃苦頭),但是好歹能夠讓人摸著大方向,于是花費(fèi)不多時(shí)間特權(quán)同學(xué)便成功構(gòu)建并驗(yàn)證了屬于自己的第一個(gè)
嵌入式工程(包括硬件工程和軟件工程)。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/0423519508_0.jpg)
圖2 EDK和SDK相關(guān)文檔????????
如圖3所示,這里基本示意了整個(gè)軟硬件開(kāi)發(fā)的工作流程。從ISE基本設(shè)計(jì)輸入開(kāi)始,包括了XPS硬件系統(tǒng)架構(gòu)的生成,再到SDK的軟件開(kāi)發(fā),同時(shí)在ISE完成綜合、約束、映射等編譯步驟,最終生成可
下載文件進(jìn)行板級(jí)的調(diào)試驗(yàn)證。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/0423115R4_0.jpg)
圖3 基本嵌入式工作流程????????
就著前面的開(kāi)發(fā)步驟,我們也簡(jiǎn)單的跑跑流程好好體驗(yàn)一番。在上一個(gè)已經(jīng)例化pll工程的基礎(chǔ)上,我們接著使用XPS添加一個(gè)帶MicroBlaze軟核的
嵌入式系統(tǒng)。???????? 如圖4所示,新建一個(gè)源文件,選擇Embedded Processor,命名為mysoc。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/042231A60_0.jpg)
圖4 新建Embedded Processor文件????????
新建的Embedded Processor會(huì)自動(dòng)打開(kāi)XPS,然后首先彈出一個(gè)基本系統(tǒng)向?qū)нx擇對(duì)話框,如圖5所示。點(diǎn)擊“Yes”。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/04221115W_0.jpg)
圖5 基本系統(tǒng)向?qū)нx擇????????
接著出現(xiàn)Base System Builder對(duì)話框,默認(rèn)選擇AXI system后點(diǎn)擊“OK”。接著進(jìn)入基本系統(tǒng)配置頁(yè)面,這里主要由兩個(gè)頁(yè)面,第1個(gè)頁(yè)面如圖6所示。這里配置板級(jí)的
信息和系統(tǒng)選擇,板級(jí)信息如輸入
時(shí)鐘頻率,復(fù)位
信號(hào)有效極性等,系統(tǒng)選擇可以配置為單核或雙核,優(yōu)化策略可以是面積或吞吐量,該實(shí)例默認(rèn)選擇均符合要求,無(wú)需改動(dòng),點(diǎn)擊“Next”到配置頁(yè)面2。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/0422002494_0.jpg)
圖6 基本系統(tǒng)設(shè)置頁(yè)面1???????? 如圖7所示,在配置頁(yè)面2中,選擇Processor Frequency為50MHz,設(shè)置Local Memory Size為32KB。接下來(lái)需要添加一個(gè)8bit的GPIO外設(shè),點(diǎn)擊“Av
ailable Peripherals”下的“
Add Device…”按鈕。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/0421305Y3_0.jpg)
圖7基本系統(tǒng)設(shè)置頁(yè)面2???????? 彈出“Add IO Devices for Generic Board”窗口如圖8所示,分別設(shè)置“IO Interface Type”為“GPIO”、“Device”為“
LEDS”,完成后點(diǎn)擊“OK”。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/0420123511_0.jpg)
圖8 添加GPIO外設(shè)???????? 此時(shí),在“Included Peripherals for microblaze_0”下出現(xiàn)如圖9所示的LEDS外設(shè),默認(rèn)設(shè)置Data Width為8。最后我們點(diǎn)擊Finish完成向?qū)渲谩?
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/04203OY8_0.jpg)
圖9 新添加的LEDS外設(shè)???????? 稍等片刻,當(dāng)新系統(tǒng)生成好之后,如圖10所示,在XPS默認(rèn)打開(kāi)的System Assembly View的Bus Interfaces列表中,這個(gè)新系統(tǒng)的所有組件都羅列出來(lái)了,并且在左側(cè)有各個(gè)組件間的信號(hào)
接口連接關(guān)系。從他們之間的相互連接關(guān)系很容易便可理解這個(gè)簡(jiǎn)單系統(tǒng)的架構(gòu)方式:microblaze_0便是大名鼎鼎的軟核
CPU——MicroBlaze,它連接了AXI總線用于外設(shè)擴(kuò)展,這條總線上掛著的外設(shè)包括了我們特意添加的GPIO外設(shè)LEDS;此外,microblaze_0的兩個(gè)LMR接口分別連著microblaze_0_i_bram_ctrl和microblaze_0_d_bram_ctrl,從命名上不能推斷出著兩個(gè)組件應(yīng)該是CPU的指令(instruction)和數(shù)據(jù)(data)存儲(chǔ)
控制器,而靠右側(cè)的紅色連接部分又分別將他們與microblaze_0_bram_ctrl組件相連接,說(shuō)明這個(gè)microblaze_0_bram_ctrl便是CPU的主存儲(chǔ)控制器。此外,兩個(gè)相對(duì)獨(dú)立的clock_generator_0和proc_sys_reset_0則為系統(tǒng)時(shí)鐘和復(fù)位產(chǎn)生組件。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/04210E018_0.jpg)
圖10 IP組件列表???????? 接著我們來(lái)看看Ports部分,如圖11所示。這里展開(kāi)External Ports便是該系統(tǒng)所有需要與外部進(jìn)行直接隱射的管腳。LEDS_TRI_O便是8個(gè)連接到板上指示燈的信號(hào),RESET是低電平有效的復(fù)位信號(hào),而CLK_N和CLK_P是一對(duì)100MHz輸入的差分信號(hào)。由于我們的外部輸入100MHz時(shí)鐘不是差分的,而是單時(shí)鐘接口,因此需要簡(jiǎn)單的做些修改。???????? 展開(kāi)clock_generator_0,在CLKIN一欄右擊選擇“New Connection”,此時(shí)如圖12所示,差分時(shí)鐘便成了單時(shí)鐘接口了。鼠標(biāo)落在這個(gè)單時(shí)鐘信號(hào)上再次右擊并選擇“Make External”,這個(gè)單端時(shí)鐘接口便出現(xiàn)在了External Ports中。而之前的差分時(shí)鐘接口并未在External Ports中消失,需要依次右擊并選擇“Delete External Ports”便可將其刪除。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/042111O44_0.jpg)
圖11 系統(tǒng)外部連接信號(hào)
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/04200R028_0.jpg)
圖12 更改后的CLKIN???????? 修改好之后的External Ports列表如圖13所示。圖13 更改后的External Ports???????? 完成時(shí)鐘信號(hào)修改,點(diǎn)擊XPS菜單欄HardwareàGenerate Netlist生產(chǎn)這個(gè)嵌入式硬件系統(tǒng)的網(wǎng)表?;氐絀SE中,在Hierarchy下多出了mysoc.xmp文件,選中它。在Processes下展開(kāi)Design Utilities,雙擊View HDL Instantiation Template生產(chǎn)系統(tǒng)的例化模板文件,如圖14右側(cè)所示。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/04191110A_0.jpg)
圖14 生成系統(tǒng)例化模板???????? 將此模板復(fù)制到ISE頂層源代碼中,相應(yīng)匹配好接口,原先的8個(gè)LED接口將由軟件
編程控制。頂層源代碼修改如下:module testled(??????????? clk,
rst_n,??????????? led??????? );?input clk;????? //100MHzinput rst_n;??? //低電平復(fù)位信號(hào)?output[7:0] led;??? //連接到
LED指示燈??wire clk_100m;????? //clocking輸出100MHzwire clk_50m;?????? //clocking輸出50MHzwire clk_25m;?????? //clocking輸出25MHzwire clk_12m5;????? //clocking輸出12.5MHzwire clk_locked;??? //clocking輸出完成標(biāo)志位?//---------------------------------------------------//IP核Clocking Wizard例化//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG?? myclocking uut_myclocking?? (// Clock in ports??? .CLK_IN1(clk),????? // IN??? // Clock out ports??? .CLK_OUT1(clk_100m),???? // OUT??? .CLK_OUT2(clk_50m),???? // OUT??? .CLK_OUT3(clk_25m),???? // OUT??? .CLK_OUT4(clk_12m5),???? // OUT??? // Status and control signals??? .RESET(!rst_n),// IN??? .LOCKED(clk_locked));????? // OUT// INST_TAG_END ------ End INSTANTIATION Template ---------?//---------------------------------------------------// 例化mysoc系統(tǒng)(* BOX_TYPE = "user_bl
ack_box" *)mysoc uut_mysoc (??? .RESET(rst_n),??? .LEDS_TRI_O(led),??? .clock_generator_0_CLKIN_
pin(clk_100m)??? );?endmodule???????? 最后我們雙擊“Generate Prog
ramming File”完成硬件系統(tǒng)的編譯和下載文件生成。????????? 下一步我們把平臺(tái)轉(zhuǎn)移到SDK,在工程目錄下新建一個(gè)名為SDK_workspace的文件夾,然后打開(kāi)SDK時(shí)需要選擇一個(gè)workspace,如圖15所示,對(duì)應(yīng)定位到SDK_workspace文件夾下即可。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/041ZAM2_0.jpg)
圖15 workspace設(shè)置???????? 進(jìn)入SDK后,菜單欄上選擇FileàNewàXilinx C Project,然后在“New Hardware Project”中輸入Project name,并選擇工程目錄下的mysoc\__xps\system.xml作為T(mén)arget Hardware Specif
ication。此配置頁(yè)面主要是設(shè)置軟件工程的硬件平臺(tái)。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/041SW940_0.jpg)
圖16 硬件平臺(tái)配置頁(yè)面???????? 下一配置頁(yè)面如圖17所示,這里設(shè)置軟件工程的Project name,并且選擇Select Project Template為“Empty Application”。其余選項(xiàng)使用默認(rèn),完成設(shè)置。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/041Q19437_0.jpg)
圖17 軟件工程配置頁(yè)面???????? 此時(shí)在Project Explorer下出現(xiàn)了mysoc_hw_platform、empty_application_bsp_0和example_application_0三個(gè)文件夾。在example_application_0上右擊并選擇NewàSource file,新建一個(gè)名為main.c的源文件,如圖18所示。
![Nexys3學(xué)習(xí)手記7:MicroBlaze小試牛刀](http://www.qldv.cn/uploads/allimg/170211/041K01426_0.jpg)
圖18 軟件工程文件夾???????? 在main.c中編寫(xiě)一段簡(jiǎn)單的流水燈測(cè)試代碼,如下所示:/* ------------------------------------------------------------ *//*????????????? Include File Definitions??????????????????????? *//* ------------------------------------------------------------ *///#include "xil_types.h"??? //This file contains b
asic types for Xilinx software IP.#include "xparameters.h"? //The hardware configuration describing constants#include "xgpio_l.h"??? //This header file contains identifiers and driver functions?#define? uchar unsigned char#define? uint? unsigned short?/* ------------------------------------------------------------ *//*????????????? delay function????????????????????????????????? *//* ------------------------------------------------------------ */void delay(uint cnt){??? uint i,j;??? for(i=0;i
圖19 FPGA燒錄原本Program FPGA用于在線燒錄FPGA器件,但是Nexys3目前的USB連接方式并不直接支持(這個(gè)后面再研究,話說(shuō)“白貓黑貓抓到老鼠都是好貓”,咱只要能下載進(jìn)去就行),但是不要緊,我們還有Adept呢。這里配置一下待燒錄文件的一些基本信息,然后點(diǎn)擊Program后雖然會(huì)報(bào)錯(cuò)并提示無(wú)法成功燒錄,但是與此同時(shí)在mysoc_hw_platform文件夾下生成了一個(gè)包含軟硬件燒錄的download.bit文件,最后我們使用Adept將這個(gè)文件下載到Nexys3中即可實(shí)現(xiàn)在線運(yùn)行的流水燈了。?轉(zhuǎn)載自:特權(quán)同學(xué)的博客
評(píng)論