特权同学

Nexys3学习手记7:MicroBlaze小试牛刀

0
阅读(5240)

Nexys3学习手记7:MicroBlaze小试牛刀

有了前面两个实例的铺垫,下面这个工程就要带大家尝试搭建一个基于MicroBlaze的应用。特权同学也是第一次接插Xilinx的嵌入式开发平台,跑了一个流程下来,正如所料,和Altera的SOPC Builder(今后主推Qsys)以及EDS相比,单从开发环境上来看是大同小异、换汤不换药的。

如图1所示,其实在安装ISE软件的时候,由于我们选择了Embedded Edition(可参考手记2),那么在安装完成的程序菜单中,如图1所示,EDK(Embedded Development Kit)后有两个开发平台,即Xilinx Platform Studio(硬件开发平台,简称XPS)和Xilinx Software Development Kit(软件开发平台,简称SDK),对应Altera的SOPC Builder(或Qsys)和EDS。由于Xilinx的SDK支持的软核MicroBlaze片内总线是AXI,而Altera的NIOS II主推的是Avalon,这里先不论孰优孰劣,他们之间多少还是有些区别的,非常习惯于SOPC Buider下工作的特权同学第一次接触XPS的环境还真有些不适应。而反观软件平台SDK,由于和EDS一样都是基于Eclipse的架构,所以比较容易上手,甚至连菜单按钮的布局和使用也多少有些似曾相识的感觉。

图1 EDK开发环境

相似归相似,咱们还是老老实实的找个傻瓜教程扎扎实实的熟悉一下整个开发流程。很自然的,特权同学便开启DocNav淘淘金,如图2所示,EDK and SDK下尽都是相关文档,而经过粗略的浏览后,特权同学锁定了“EDK Concepts, Tools, and Techniques.pdf”文档。虽然此文档也只是很简单的列举了一个软硬件协同开发的实例,很多设计细节都被忽略了(没让特权同学少吃苦头),但是好歹能够让人摸着大方向,于是花费不多时间特权同学便成功构建并验证了属于自己的第一个嵌入式工程(包括硬件工程和软件工程)。

图2 EDK和SDK相关文档

如图3所示,这里基本示意了整个软硬件开发的工作流程。从ISE基本设计输入开始,包括了XPS硬件系统架构的生成,再到SDK的软件开发,同时在ISE完成综合、约束、映射等编译步骤,最终生成可下载文件进行板级的调试验证。

图3 基本嵌入式工作流程

就着前面的开发步骤,我们也简单的跑跑流程好好体验一番。在上一个已经例化pll工程的基础上,我们接着使用XPS添加一个带MicroBlaze软核的嵌入式系统。

如图4所示,新建一个源文件,选择Embedded Processor,命名为mysoc。

图4 新建Embedded Processor文件

新建的Embedded Processor会自动打开XPS,然后首先弹出一个基本系统向导选择对话框,如图5所示。点击“Yes”。

图5 基本系统向导选择

接着出现Base System Builder对话框,默认选择AXI system后点击“OK”。接着进入基本系统配置页面,这里主要由两个页面,第1个页面如图6所示。这里配置板级的信息和系统选择,板级信息如输入时钟频率,复位信号有效极性等,系统选择可以配置为单核或双核,优化策略可以是面积或吞吐量,该实例默认选择均符合要求,无需改动,点击“Next”到配置页面2。

图6 基本系统设置页面1

如图7所示,在配置页面2中,选择Processor Frequency为50MHz,设置Local Memory Size为32KB。接下来需要添加一个8bit的GPIO外设,点击“Available Peripherals”下的“Add Device…”按钮。

图7基本系统设置页面2

弹出“Add IO Devices for Generic Board”窗口如图8所示,分别设置“IO Interface Type”为“GPIO”、“Device”为“LEDS”,完成后点击“OK”。

图8 添加GPIO外设

此时,在“Included Peripherals for microblaze_0”下出现如图9所示的LEDS外设,默认设置Data Width为8。最后我们点击Finish完成向导配置。

图9 新添加的LEDS外设

稍等片刻,当新系统生成好之后,如图10所示,在XPS默认打开的System Assembly View的Bus Interfaces列表中,这个新系统的所有组件都罗列出来了,并且在左侧有各个组件间的信号接口连接关系。从他们之间的相互连接关系很容易便可理解这个简单系统的架构方式:microblaze_0便是大名鼎鼎的软核CPU——MicroBlaze,它连接了AXI总线用于外设扩展,这条总线上挂着的外设包括了我们特意添加的GPIO外设LEDS;此外,microblaze_0的两个LMR接口分别连着microblaze_0_i_bram_ctrl和microblaze_0_d_bram_ctrl,从命名上不能推断出着两个组件应该是CPU的指令(instruction)和数据(data)存储控制器,而靠右侧的红色连接部分又分别将他们与microblaze_0_bram_ctrl组件相连接,说明这个microblaze_0_bram_ctrl便是CPU的主存储控制器。此外,两个相对独立的clock_generator_0和proc_sys_reset_0则为系统时钟和复位产生组件。

图10 IP组件列表

接着我们来看看Ports部分,如图11所示。这里展开External Ports便是该系统所有需要与外部进行直接隐射的管脚。LEDS_TRI_O便是8个连接到板上指示灯的信号,RESET是低电平有效的复位信号,而CLK_N和CLK_P是一对100MHz输入的差分信号。由于我们的外部输入100MHz时钟不是差分的,而是单时钟接口,因此需要简单的做些修改。

展开clock_generator_0,在CLKIN一栏右击选择“New Connection”,此时如图12所示,差分时钟便成了单时钟接口了。鼠标落在这个单时钟信号上再次右击并选择“Make External”,这个单端时钟接口便出现在了External Ports中。而之前的差分时钟接口并未在External Ports中消失,需要依次右击并选择“Delete External Ports”便可将其删除。

图11 系统外部连接信号

图12 更改后的CLKIN

修改好之后的External Ports列表如图13所示。

图13 更改后的External Ports

完成时钟信号修改,点击XPS菜单栏HardwareàGenerate Netlist生产这个嵌入式硬件系统的网表。回到ISE中,在Hierarchy下多出了mysoc.xmp文件,选中它。在Processes下展开Design Utilities,双击View HDL Instantiation Template生产系统的例化模板文件,如图14右侧所示。

图14 生成系统例化模板

将此模板复制到ISE顶层源代码中,相应匹配好接口,原先的8个LED接口将由软件编程控制。顶层源代码修改如下:

module testled(

clk,rst_n,

led

);

input clk; //100MHz

input rst_n; //低电平复位信号

output[7:0] led; //连接到LED指示灯

wire clk_100m; //clocking输出100MHz

wire clk_50m; //clocking输出50MHz

wire clk_25m; //clocking输出25MHz

wire clk_12m5; //clocking输出12.5MHz

wire clk_locked; //clocking输出完成标志位

//---------------------------------------------------

//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系统

(* 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”完成硬件系统的编译和下载文件生成。

下一步我们把平台转移到SDK,在工程目录下新建一个名为SDK_workspace的文件夹,然后打开SDK时需要选择一个workspace,如图15所示,对应定位到SDK_workspace文件夹下即可。

图15 workspace设置

进入SDK后,菜单栏上选择FileàNewàXilinx C Project,然后在“New Hardware Project”中输入Project name,并选择工程目录下的mysoc\__xps\system.xml作为Target Hardware Specification。此配置页面主要是设置软件工程的硬件平台。

图16 硬件平台配置页面

下一配置页面如图17所示,这里设置软件工程的Project name,并且选择Select Project Template为“Empty Application”。其余选项使用默认,完成设置。

图17 软件工程配置页面

此时在Project Explorer下出现了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

for(j=0;j<256;j++);

}

/* ------------------------------------------------------------ */

/* main function */

/* ------------------------------------------------------------ */

int main()

{

uchar m;

while(1)

{

for(m=0;m<8;m++)

{

XGpio_WriteReg(XPAR_LEDS_BASEADDR,1,(1<

delay(10000);

}

}

return 0;

}

接着右键单击example_application_0并选择Builder Project对该软件工程进行编译。接着配置产生可在线烧录的.bit文件,这个.bit文件将包括硬件工程生成的.bit文件和软件工程烧录文件.elf。在XPS的菜单栏选择Xilinx ToolsàProgram FPGA,Program FPGA的配置如图19所示,Bitstream中选择硬件生成的配置文件testled.bit,一般就在工程目录下;BMM File中选择硬件系统文件edkBmmFile_bd.bmm,也在工程目录下;最后在Software Configuration下点击ELF File to Initialize in Block RAM的下拉条找到example_application_0.elf即软件工程的烧录文件。

图19 FPGA烧录

原本Program FPGA用于在线烧录FPGA器件,但是Nexys3目前的USB连接方式并不直接支持(这个后面再研究,话说“白猫黑猫抓到老鼠都是好猫”,咱只要能下载进去就行),但是不要紧,我们还有Adept呢。这里配置一下待烧录文件的一些基本信息,然后点击Program后虽然会报错并提示无法成功烧录,但是与此同时在mysoc_hw_platform文件夹下生成了一个包含软硬件烧录的download.bit文件,最后我们使用Adept将这个文件下载到Nexys3中即可实现在线运行的流水灯了。

Baidu
map