第一章 走进Helloword,搭建第一个SOC系统
0赞Microblaze(MB)的开发包含硬件和软件部分:硬件部分主要是搭建个SOC硬核系统,在Xilinx Platform Studio(XPS)中完成的。软件部分则在Xilinx的SDK中来实现我们所需的功能。下面正式进入Microblaze的学习,让我们先从一个Helloword开始吧。
◎ 打开ISE,新建一个工程,我们以MB_Demo命名这个工程,选择MIS603对应配套的器件。添加New Source,选择添加Embedded Processor,文件命名为mis603_soc(自行命名)。如下图所示:
◎继续next,直到生成mis603_soc.xmp并弹出Xilinx Platform Studio(EDK)平台。在弹出的对话框中选择Yes。
◎完成后在弹出的对话框中,选择AXI System(默认)。点击OK,弹出Board and System Selection中,做出如下选择,其他保持默认。
◎弹出Base System Builder—AXI flow对话框,保持处理时钟100Mhz不变,其他的也默认即可。当然可根据自己实际情况对RAM大小进行修改。包括:本地RAM、指令Cache和数据Cache大小,默认均为8KB。如果不添加其他外设,点击Finish即可完成一个简易的MB系统搭建。
◎回到XPS界面,在主界面中可以查看改系统所添加的组件或设备。通过‘+’可以查看每个设备之间的连接关系。点击Ports,可以看到External Ports选项,即与外部相连,其时钟采用差分输入CLK_N和CLK_P,与我们mis603单端输入时钟不一致。打开Project窗口下的mis603_soc.mhs文件,该文件里面记录了MB系统的硬件信息。
◎打开信息硬件信息文件mis603_soc.mhs,做出如下修改:将差分输入改成单端输入。点击保存后,弹出Reload,确认。这时候,再去看System Assembly View,可以看出,时钟为单端,只有一个CLK了。
◎打开UCF文件,做好外部端口时钟和复位的引脚约束。保存后,我们的最小MB系统已经搭建完成。
◎点击Hardware下Generate Netlist,产生网表。知道Console出现Done!表示编译完成。
◎返回到ISE界面,将mis603_soc.ucf添加到工程,文件目录:..\MB_Demo\MB_Demo\mis603_soc\data。新建一个mis603_MB.v文件,将mis603_soc例化至该文件内,如果不知道该文件的输入输出端口,可查看..\MB_Demo\MB_Demo\mis603_soc\hdl\mis603_soc.v文件,该文件是所建立MB系统的黑盒子文件。其中mis603_MB.v文件中的代码如下所示。
`timescale 1ns / 1ps module mis603_MB( input CLK, input RESET ); (* BOX_TYPE = "user_black_box" *) mis603_soc mis603_soc_u ( .RESET (RESET), .CLK(CLK), ); endmodule |
◎添加完成后,编译工程,产生.bit文件。编译完成后,通过xps启动SDK,Export&Launch SDK平台。
◎为SDK平台选择workspace,这里将SDK工作目录保存在MB_Demo\MB_SDK下。打开后的SDK,系统已经导入了硬件系统文件(system.xml)。从该文件中可以看到MB系统的内部信息。
◎打开system.xml文件,可以看到添加组件的信息,以及地址映射信息。尤其注意,每个组件必须有版本号,否则重启SDK。
◎点击SDK平台中的file,新建个Application Project。
◎在新建的工程中,工程名命名为Helloworld,其他保持默认即可。
◎完成后的Helloworld工程如下所示。
◎打开Helloworld的lscript.ld文件,可以看到程序代码放置的位置,这里我们都存储在内部RAM中。
◎右击Helloworld,在弹出的菜单中执行build project,生成ELF目标文件。
◎将先前生成的Bit文件预先下载到FPGA中。可直接通过ISE中的Configure Target Device下载。
◎下载完成后,再进行SDK软件调试。打开helloworld.c文件,可以看到主要执行的代码。
◎右击helloworld,让我们来执行这段代码。运行Run Configurations,配置执行环境。
◎双击GDB选型,生成一个Helloworld Debug。
◎选择STDIO Connection为JTAG UART,软件执行的信息通过JTAG反馈至Console控制台。
◎运行Run,可以看到SDK平台的Console显示出了运行的结果,这样一个简单的helloworld实验就完成了。
◎做完上述实验,很多人可能一头雾水,硬件软件是如何工作,是通过什么样的工作原理,为嘛能够在控制台打印出hello world呢。下面对整个系统进行简单的梳理。
◎在FPGA内部搭建一个MB的SOC系统,可以理解成FPGA用纯逻辑电路搭建一个类似于单片机或STM32的系统。FPGA就是个积木,一点点地搭建个独立的在芯片内部独立的系统。只不过这个microblaze系统xilinx公司已经做好了,我们能够直接拿来配置使用即可。
◎这个MB的SOC系统,输入时钟50MHZ,工作时钟100MHZ,这当然得用到时钟倍频啦。又由于系统具有复位功能,因此,复位电路又是必不可少的。连接Microblaze系统各个组件模块之间必然存在内部总线将这些功能模块连接起来。本地存储器通过LMB(本地存储器总线)与MB连接,外部可扩展接口由axi4lite_0即AXI4总线将microbalze和外面扩展接口连接。当然,我们需要一个能够实时监测系统内部状况并予以调试的组件,这样debug应然而生。没有debug,xilinx下载线无法读取FPGA开发板的运行状态,也就自然无法反馈Hello world信息至控制台啦。结合下面这样的图,让我们对刚刚搭建的最小系统有个更深刻的理解。
◎那么软件系统又是如何工作的呢,SDK平台又包括哪些东西呢。这样我们打开刚刚建立的Helloworld平台。首先Helloworld工程下包括两方面:工程Helloworld以及用来开发的BSP包。
◎Helloworld下面包括:生成的二进制文件(Binaries目录),Includes(包括的各类文件),Debug(调试所需的文件),src(开发的源文件)。
◎Helloworld_bsp下面包括:BSP Documention(BSP文件包,通常是打不开的,如何打开,将在后续教程介绍)、microbalze系统(开发所用的各种头文件、库文件 )、日志文件(.log)、生成链接文件(makefile)和系统硬件查看日志文件(system.mss)。
◎mis603_soc_hw_plateform包含硬件系统文件,MB系统中所添加的组件以及组件状态均可通过该文件查看。
◎必要的说明:很多人在建立MB系统时,不需要用到ISE,直接在xps里面新建即可,本教程之所以使用ISE来进行例化,主要是为后续教程中MB系统作为协处理器配合ISE一起开发考虑。