前面已经有一篇博客介绍了MB的基本情况,这里将深入介绍MB的设置,最终实现可以用printf打印出双浮点数并操作BRAM。首先创建Block Design,如下图:
然后跳出新的界面,中间有个加号,添加MicroBlaze,然后双击,按下图分别对CPU架构、性能、调试功能、总线等进行配置:
其中AXI数据接口是与外围接口交互的总线,之后所有模块都挂在这个总线上。然后选择Run Block Automation添加内存,如下图所示:
然后按照下面配置,注意,内存比较足够大才能够使用printf函数打印出双浮点数:
配置后将会生成下图的各模块,之后将时钟按照自己板子的要求进行配置,也可以修改各模块的名字。
然后依次添加AXI UARTlite、BRAM(包括了AXI控制器和Block memory generator)、GPIO等,还可以直接添加AXI-Lite接口(右键选择Create Interface Port,选择协议),从而和自己写的支持AXI-Lite协议的模块进行交互,最后如下图所示,此时点击Run Connection Automation就可以完成自动布线的功能了。
然后选择保存,然后如下图选择菜单栏Tools的Validate Design检查整个block设计是否有问题。
如果没有问题,那么就可以生成CPU顶层文件调用,如下图所示:
这样就生成了顶层HDL文件,可以被其他模块调用。
当工程综合后,点击菜单栏File/Export/Export Hardware生成hdf文件,生成成功后,就可以在菜单栏File/Launch SDK上点击 启动SDK。
在启动SDK后,生成新的工程,如下图所示,选择File/Application Project
然后输入工程名,再点击Next,选择工程模板,这里推荐选择Hello World模板,如下图:
在编写代码过程中,操作BRAM等模块可以按照官方提供的高级API函数,也可以直接使用Xil_Out32和Xil_In32等函数进行操作,例如:
value = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR+addr*4);
Xil_Out32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR+addr*4, Value);
其中XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR是存储器的基地址,需要注意的是,由于AXI协议都是32比特4个字节进行操作,所以地址后两位是用来选择操作对应地址32比特的4个字节。
GPIO的基地址是XPAR_GPIO_0_DEVICE_ID,AXI接口的基地址是XPAR_(接口名)_BASEADDR。
该工程可以直接用printf函数打印出双浮点数。
另外,如果运行代码时申请内存空间失败(比较推荐使用静态变量和全局变量的方法,避免内存泄漏),可能是堆内存分配太小了,可以配置堆内存变大,打开lscript.ld,设置Heap Size的数值即可,如下图:
完成代码后,可以选择直接运行或者调试模式,如下图:
选择直接运行
选择调试模式
转自: https://blog.csdn.net/truecrab/article/details/80219866