浪潮加速卡XC7K480T搭建microblaze工程
XC7K480T搭建MicroBlaze测试工程
背景
前面我们使用小黄鱼淘到的板子并且使用JTAG探测了板上所有芯片的管脚,接下来准备搭建一个工程用来测试板上的各个接口和外设。板上的各个资源和FPGA的连接关系如下图
本次工程打算使用MicroBlaze软核来连接板上各个外设接口,将2组DDR、LED灯和温度传感器都连接到软核,再在软核中编写程序操作各个外设。主要目的是为了熟悉Vivado联合Vitis的开发流程和学习各个IP的用法。
本次开发基于Vivado2024.1,其中软件开发Vitis IDE与老版本界面有较大差异,2024版做得像Vscode的界面了。但软件部分开发流程和老版本还是差不多的,只是新增了些新功能和调整了界面布局。
创建Vivado工程
工程创建
创建一个新工程,芯片选中XC7K480TFFG1156

创建BlockDesign,命名为microblaze

例化IP
在Block Design中添加要使用的IP,这里我们主要会用到Microblaze、MIG、AXI-GPIO、AXI-I2C这几个IP。其中microblaze是xilinx的软核处理器,根据IP参数设置可配置为微控制器或微处理器,类似MCU或处理器,只是是在FPGA中使用逻辑门实现的。MIG IP是Vivado提供的内存控制器,用来连接外部的DDR颗粒并对外提供AXI总线接口,MicroBlaze就可以通过AXI总线读写内存芯片中的存储区域了。AXI GPIO IP则是作为MicroBlaze的GPIO外设,通过AXI接口挂载到系统总线上,MicroBlaze就可以通过读写IP内的寄存器控制GPIO的方向和输入输出了。类似的,AXI IIC IP则为MicroBlaze提供一路I2C接口,这里I2C接口是连接到板上的温度传感器的,后面可以通过程序控制软核通过I2C读取传感器的温度值。

配置MicroBlaze IP
配置MicroBlaze IP。双击调出来的MicroBlaze IP核,选择预定义配置为微控制器(Microcontroller Preset),点击OK保存退出。

配置MIG IP
配置MIG IP。双击MIG IP核,进入MIG配置界面,里面主要是设置和内存相关的一些参数,如DDR颗粒型号、数据位宽、时钟频率、引脚分配等。

控制器数量选择2,把板上的2组DDR都例化进去,点击Next。

引脚兼容设计,这儿可以不选,直接Next。

选择DDR控制器类型,板上为3组DDR3内存,默认即可,点击Next。

这一页需要配置DDR的时钟频率,默认为533.33M,DDR是时钟双沿采样,因此数据最大传输速率为1066.66MB/s,这款FPGA最大只支持这个频率。下面选中DDR颗粒型号,根据板上DDR颗粒的丝印反查DDR型号应为MT41K256M8XX-15E。再下面选则DDR数据宽度,板上每组DDR有9片DDR颗粒并联组成,因此数据总宽度为72位,其中64位为数据,8位为ECC校验。其他参数使用默认即可,点击Next。

下面配置AXI端口的东西,这里使用默认参数即可。

接下来配置第2组DDR的参数,和前面的步骤一样,配置完后点击Next。

这里主要是设置DDR控制器的输入时钟,我们使用板上的200M晶振时钟,两组DDR都修改输入时钟频率为200MHz,其他参数默认,点击Next。

这是是设置输入时钟类型,由于板上200M晶振输出为差分信号,因此选择为差分;参考时钟选择使用系统时钟,否则MIG外部还需提供一路参考时钟,为了简化设计就使用前面的系统时钟即可;另外可以修改下下面的系统复位极性为高有效,否则默认低有效但MIG得端口名中不会带后缀n,在后面设计时容易接错。设计好后点击Next。

内部匹配电阻使用默认50欧即可。

下一步开始进行管脚分配了,这儿选择固定管脚。

点击Read XDC/UCF,选中提供的DDR管脚约束文件XC7K480T_DDR3_0.xdc,再点击Validate校验管脚分配是否符合要求,无问题后点击Next。
重复上面的步骤分配另一组DDR的管脚。

下一步是分配MIG系统时钟管脚,根据管脚定义选择对应的时钟管脚,其他信号可不分配管脚。
再后面就一路Next直到退出IP设置生成配置好的MIG IP核。可以看到最终的IP后外面有2组DDR接口、两组S0/1_AXI分别就是两组DDR的AXI总线接口,S0/1_AXI_CTRL是ECC部分的接口C0/1_SYS_CLK是之前配置的两组DDR的系统时钟输入端。

配置AXI GPIO IP
配置AXI GPIO IP,双击AXI GPIO核,设置GPIO数量为3,与3路LED灯对应。

搭建MicroBlaze系统
搭建MicroBlaze最小系统。IP设置完后,点击Run Block Automation来自动处理Microblaze的外围模块,注意需要选择debug模块为Debug&&UART,这样JTAG仿真器就可以作为软核的串口,用来调试打印了。时钟选择New Clock Wizard,使用外部50M晶振时钟作为软核的系统时钟。

点击OK,运行完后软核的最小系统就已经搭建起来了。

连接DDR、GPIO和I2C模块到软核。点击Run Connection Automation自动连接所有外设,

自动连接完后的样子。

这里还要根据板子实际情况修改下对外端口,外部参考时钟为单端50M输入,上面自动生成的clk wizard IP默认输入为差分100M时钟,因此需要编辑时钟IP,手动修改为单端50M输入。

将MIG IP核的DDR和系统时钟端口添加外部端口,最终得到完整的MicroBlaze工程。

保存Block Design,右键选择Validate Design校验Block Design。有错误会弹出窗口提示,需要根据提示排查之前的Block Design是否存在错误,无错误则进入下一步。

生成工程文件
在Source窗口中的blockdesign文件上右键,选择Generate Output Products,生成设计文件。

等待生成文件完成后,再在blockdesign文件上右键选择Create HDL Wrapper,生成顶层文件。

最终工程目录如下图所示。

管脚分配
点击左边的Open Elaborated菜单进行管脚分配,其中DDR和DDR时钟已经在MIG IP中设置好了,只需要分配下50M时钟、三个LED管脚和I2C管脚就行了,根据实际引脚和电平分配即可,设置完管脚后保存为xdc文件。

编译
点击Generate Bitstream菜单,Vivado将自动对工程进行综合、实现和生成比特流文件,等待编译完后可以看到整个FPGA的资源使用情况和各种数据报告。

Vitis开发
创建平台工程
在Vivado中导出硬件信息。

弹出窗口中选择导出包括比特流文件。

一路Next下去直到导出成功。最终会在工程目录下生成一个硬件配置文件,后缀是.xsa,老版本Vivado生成的后缀是.hdf,这里面包含了VIVADO中设计的逻辑的一些硬件信息,比如软核的地址分配、中断分配等信息,用来给软件开发提供输入信息。
从Vivado启动Vitis IDE软件,也可以从Windows开始菜单那边启动,打开后注意切换下工作目录为Vivado工程的目录。

启动后从菜单中创建一个Platform工程

点击创建后会让输入平台项目名称和路径,然后选择前面Vivado生成的硬件配置文件

然后再一路Next直到结束,Vitis会根据硬件信息自动生成MicroBlaze的一些外设驱动程序。点击Flow串口的Build编译Platform工程。

创建helloworld例程
插入例程
从文件菜单创建一个例程,设置工程名称和路径

例程选择helloworld工程

下一步是为应用工程设置对于的Platform,这儿选择上一步创建的Platform

选择standalone_microblaze_0

Next下去,最终会自动创建一个工程,包含了实现打印HelloWorld的源代码,点击Build生成可执行文件
生成的工程要检查下编译的链接脚本lscript.ld,修改所有程序端都存储在BRAM中,如果是在DDR中则调试时程序无法运行,猜测可能是此时DDR还没初始化导致的,还没找到方法直接加载到DDR运行,因此需要注意下这部分地址分配。


调试
点击debug开始调试

随着程序执行,串口打印信息出现在debug窗口中。

创建LED测试例程
在hello world的工程中增加控制GPIO寄存器的代码,如下。单步调试可以看到三个LED随着GPIO输出变化而点亮或熄灭。

创建内存测试例程
参考上面例程步骤,选择内存测试例程,创建工程后,进行编译和单步调试,测试的内存空间为DDR空间。


浙公网安备 33010602011771号