有了前面兩個實例的鋪墊,下面這個工程就要帶大家嘗試搭建一個基于MicroBlaze的應(yīng)用。特權(quán)同學(xué)也是第一次接插Xilinx的嵌入式開發(fā)平臺,跑了一個流程下來,正如所料,和Altera的SOPC Builder(今后主推Qsys)以及EDS相比,單從開發(fā)環(huán)境上來看是大同小異、換湯不換藥的。????????
如圖1所示,其實在安裝ISE軟件的時候,由于我們選擇了Embedded Edition(可參考手記2),那么在安裝完成的程序菜單中,如圖1所示,EDK(Embedded Development Kit)后有兩個開發(fā)平臺,即Xilinx Platform Studio(硬件開發(fā)平臺,簡稱XPS)和Xilinx Software Development Kit(軟件開發(fā)平臺,簡稱SDK),對應(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)。而反觀軟件平臺SDK,由于和EDS一樣都是基于Eclipse的架構(gòu),所以比較容易上手,甚至連菜單按鈕的布局和使用也多少有些似曾相識的感覺。
圖6 基本系統(tǒng)設(shè)置頁面1???????? 如圖7所示,在配置頁面2中,選擇Processor Frequency為50MHz,設(shè)置Local Memory Size為32KB。接下來需要添加一個8bit的GPIO外設(shè),點擊“Available Peripherals”下的“Add Device…”按鈕。
圖7基本系統(tǒng)設(shè)置頁面2???????? 彈出“Add IO Devices for Generic Board”窗口如圖8所示,分別設(shè)置“IO Interface Type”為“GPIO”、“Device”為“LEDS”,完成后點擊“OK”。
圖8 添加GPIO外設(shè)???????? 此時,在“Included Peripherals for microblaze_0”下出現(xiàn)如圖9所示的LEDS外設(shè),默認(rèn)設(shè)置Data Width為8。最后我們點擊Finish完成向?qū)渲谩?
圖9 新添加的LEDS外設(shè)???????? 稍等片刻,當(dāng)新系統(tǒng)生成好之后,如圖10所示,在XPS默認(rèn)打開的System Assembly View的Bus Interfaces列表中,這個新系統(tǒng)的所有組件都羅列出來了,并且在左側(cè)有各個組件間的信號接口連接關(guān)系。從他們之間的相互連接關(guān)系很容易便可理解這個簡單系統(tǒng)的架構(gòu)方式:microblaze_0便是大名鼎鼎的軟核CPU——MicroBlaze,它連接了AXI總線用于外設(shè)擴展,這條總線上掛著的外設(shè)包括了我們特意添加的GPIO外設(shè)LEDS;此外,microblaze_0的兩個LMR接口分別連著microblaze_0_i_bram_ctrl和microblaze_0_d_bram_ctrl,從命名上不能推斷出著兩個組件應(yīng)該是CPU的指令(instruction)和數(shù)據(jù)(data)存儲控制器,而靠右側(cè)的紅色連接部分又分別將他們與microblaze_0_bram_ctrl組件相連接,說明這個microblaze_0_bram_ctrl便是CPU的主存儲控制器。此外,兩個相對獨立的clock_generator_0和proc_sys_reset_0則為系統(tǒng)時鐘和復(fù)位產(chǎn)生組件。
圖10 IP組件列表???????? 接著我們來看看Ports部分,如圖11所示。這里展開External Ports便是該系統(tǒng)所有需要與外部進(jìn)行直接隱射的管腳。LEDS_TRI_O便是8個連接到板上指示燈的信號,RESET是低電平有效的復(fù)位信號,而CLK_N和CLK_P是一對100MHz輸入的差分信號。由于我們的外部輸入100MHz時鐘不是差分的,而是單時鐘接口,因此需要簡單的做些修改。???????? 展開clock_generator_0,在CLKIN一欄右擊選擇“New Connection”,此時如圖12所示,差分時鐘便成了單時鐘接口了。鼠標(biāo)落在這個單時鐘信號上再次右擊并選擇“Make External”,這個單端時鐘接口便出現(xiàn)在了External Ports中。而之前的差分時鐘接口并未在External Ports中消失,需要依次右擊并選擇“Delete External Ports”便可將其刪除。
圖11 系統(tǒng)外部連接信號
圖12 更改后的CLKIN???????? 修改好之后的External Ports列表如圖13所示。圖13 更改后的External Ports???????? 完成時鐘信號修改,點擊XPS菜單欄HardwareàGenerate Netlist生產(chǎn)這個嵌入式硬件系統(tǒng)的網(wǎng)表?;氐絀SE中,在Hierarchy下多出了mysoc.xmp文件,選中它。在Processes下展開Design Utilities,雙擊View HDL Instantiation Template生產(chǎn)系統(tǒng)的例化模板文件,如圖14右側(cè)所示。
圖14 生成系統(tǒng)例化模板???????? 將此模板復(fù)制到ISE頂層源代碼中,相應(yīng)匹配好接口,原先的8個LED接口將由軟件編程控制。頂層源代碼修改如下:module testled(??????????? clk,rst_n,??????????? led??????? );?input clk;????? //100MHzinput rst_n;??? //低電平復(fù)位信號?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_black_box" *)mysoc uut_mysoc (??? .RESET(rst_n),??? .LEDS_TRI_O(led),??? .clock_generator_0_CLKIN_pin(clk_100m)??? );?endmodule???????? 最后我們雙擊“Generate Programming File”完成硬件系統(tǒng)的編譯和下載文件生成。????????? 下一步我們把平臺轉(zhuǎn)移到SDK,在工程目錄下新建一個名為SDK_workspace的文件夾,然后打開SDK時需要選擇一個workspace,如圖15所示,對應(yīng)定位到SDK_workspace文件夾下即可。
圖15 workspace設(shè)置???????? 進(jìn)入SDK后,菜單欄上選擇FileàNewàXilinx C Project,然后在“New Hardware Project”中輸入Project name,并選擇工程目錄下的mysoc\__xps\system.xml作為Target Hardware Specification。此配置頁面主要是設(shè)置軟件工程的硬件平臺。
圖16 硬件平臺配置頁面???????? 下一配置頁面如圖17所示,這里設(shè)置軟件工程的Project name,并且選擇Select Project Template為“Empty Application”。其余選項使用默認(rèn),完成設(shè)置。
圖17 軟件工程配置頁面???????? 此時在Project Explorer下出現(xiàn)了mysoc_hw_platform、empty_application_bsp_0和example_application_0三個文件夾。在example_application_0上右擊并選擇NewàSource file,新建一個名為main.c的源文件,如圖18所示。
圖18 軟件工程文件夾???????? 在main.c中編寫一段簡單的流水燈測試代碼,如下所示:/* ------------------------------------------------------------ *//*????????????? Include File Definitions??????????????????????? *//* ------------------------------------------------------------ *///#include "xil_types.h"??? //This file contains basic 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
評論
查看更多