有了前面两个实例的铺垫,下面这个工程就要带大家尝试搭建一个基于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<CNT;I++)< style="LINE-HEIGHT: 1.6em" span="">
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<<M));< style="LINE-HEIGHT: 1.6em" span="">
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中即可实现在线运行的流水灯了。
- 每天进步一点点------下载Microblaze程序到Flash
第一步 生成下载文件(bit文件) 选择之前的工作目录,打开SDK.点击Program FPGA图标. 将bootloop项改为Hello_World.elf.点击Program.此时可以不用连接下载 ...
- 每天进步一点点------创建Microblaze软核(三)
第七步 进入SDK开发环境编译完成后弹出如下对话框,选择SDK的工作目录.在MicroblazeTutor中创建一个Workspace文件夹,并选择该文件夹为SDK的工作目录.进入SDK主界面.第八步 ...
- 每天进步一点点------创建Microblaze软核(一)
在使用FPGA时,有时会用到它做为主控芯片.对于习惯于单片机及C语言开发的人,使用FPGA做主控芯片,首先还是想到它的嵌入式软核功能.如果能够基于Microblze软核进行C语言程序的开发,相对于使用 ...
- 每天进步一点点------创建Microblaze软核(二)
第四步 进入Platform Studio操作界面通过向导创建软核后,进入到PlatformStudio——内核开发环境.Platform Studio主界面如下图. 在Ports项中,右键点击RS2 ...
- 利用animation和text-shadow纯CSS实现loading点点点的效果
经常在网上看到loading状态时的点点点的动态效果,自己也用JS写了一个,思路是使用一个计数参数,然后在需要添加点的元素后面利用setInterval一个一个加点,当计数到3时,把点变为一个--写完 ...
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)
1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...
- 在input中实现点点点与当鼠标移上去时显示剩余的字
项目中经常会遇到这个问题,在一个内容框中,由于框的宽度是固定的,但是里面的内容却有很多,那么这个时候需求里就要求第一,多余的字要以点点点的形式隐藏,第二,当鼠标移上去的时候要以title提示的方式显示 ...
- css 文本显示点点点
今天有这个需求,百度获取到这个效果,记录下来. text-overflow :ellipsis; //让截断的文字显示为点点.还有一个值是clip意思是截断不显示点点 white-space : no ...
- 在xilinxFPGA上使用microblaze及自写GPIO中断
很久很久没有更新过博客了,今天来扒一扒FPGA上CPU软核的使用. 主要完成的功能:使用的开发板是nexys 4 DDR,板上有16个switch以及16个LED,需要完成microblaze对led ...
随机推荐
- Time series data mining
from here 论文Timeseries data mining(2012)中提出:时间序列数据挖掘包括7个基本任务和3个基础问题: 7 tasks: query by content clust ...
- 数位dp(模板+例题)
文章参考:数位dp之总结 首先,什么是数位dp?它是干什么的? 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数. 举个栗子: 加入我们要枚举所有上界不超过231 ...
- springboot~工作流activiti的搭建
概念 工作流产品使用activiti的算是比较多了,自带了一套UI界面,可以直接使用,用来设计流程,下面简单总结一下它的步骤: 1 设计模型 2 发布为流程,一个模型可以发布多个版本的流程 3 建立一 ...
- C# LINQ学习笔记四:LINQ to OBJECT之操作文件目录
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5816051.html,记录一下学习过程以备后续查用. 许多文件系统操作实质上是查询,因此非常适合使用LINQ方 ...
- Python标准库之时间模块time与datatime模块详解
时间模块time与datatime 时间表示方式: 时间戳 格式化时间字符串 元组 时间戳格式: time.time()#输出1581664531.749063 元组格式: time.localtim ...
- python3练习100题——032
链接:http://www.runoob.com/python/python-exercise-example32.html 题目:按相反的顺序输出列表的值. 我的代码: for i in li[:: ...
- 1、安装gitlab
1.安装Gitlab Gitlab分为社区版和企业版(收费),这里安装的是ce社区版本 方式一: Gitlab官方有提供好的rpm包仓库,所以采用yum安装即可. [root@localhost ~] ...
- python面试的100题(17)
内存管理与垃圾回收机制 48.哪些操作会导致Python内存溢出,怎么处理? 内存溢出:你申请了10个字节的内存,但写入了大于10个字节的数据会导致内存溢出 内存溢出原因:1.内存中加载的数据量过于庞 ...
- jdk8-》allMatch、anyMatch、max、min函数
allMatch函数: 检查是否匹配所有元素,只有全部符合才返回true boolean flag = list.stream().allMatch(obj->obj.length()>5 ...
- dmesg用法
百科概念:dmesg是一种程序,用于检测和控制内核环缓冲.程序用来帮助用户了解系统的启动信息. 解释:dmesg命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构.cpu.挂载的硬件 ...