有了前面两个实例的铺垫,下面这个工程就要带大家尝试搭建一个基于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的架构,所以比较容易上手,甚至连菜单按钮的布局和使用也多少有些似曾相识的感觉。
图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; //100MHzinput rst_n; //低电平复位信号 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输出完成标志位 //---------------------------------------------------//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
评论
查看更多