1. MicroBlaze最小系统
Microblaze有3个ip,带mcs那个是集成好所有东西在内部,允许你配置参数。MDM是连jtag到MB的。什么都不带的是纯core。
构建最小系统时,可以按默认设置。
- 只需要确保Local Memory Bus interfaces下的Instruction和Data interface连接即可。
- Enable Peripheral AXI Data Interface 可以勾选上,这样可以用AXI 访问外部地址空间。
- 如果不需要JTAG uart,可以去掉Enable MicroBlaze Debug Module Interface。
设置好microblaze后,点Run Block Automation,会让你选择一些Options。
- Preset: 这个会修改mb的默认参数,会替换上一步的手动配置。不修改。
- Local Memory: 内存,最大只能选128KB。设置好后,可以在Address Editor里修改。
- Local Memory ECC: 根据需要设置,通常不要
- Cache Configuration: 根据需要设置,通常不要
- Debug Module:根据需要设置,需要要JTAG转uart,就勾选上Debug & UART。
- Peripheral AXI Port:根据是否有访问外部axi的需求设置,axi 可以转apb/ahb/avmm等。
- Interrupt Controller:中断控制器。如果要接uart,timer等中断,就需要。
- Clock Connection:建议选New External Port,由外部输入时钟。
设置好后点击OK,然后保存bd。可以发现新增了System Reset和MDM模块,还有local memory。点开local memory,找到lmb_bram,可以看到配置为32768* 32 = 128KB,可以通过Address Editor中,修改Instruction和Data2个接口的Range修改memory大小。修改后需要保存才能看到lmb_bram的配置修改。
MDM模块需要配置成
- Enable Debug register access form AXI: axi可以访问本模块的寄存器。默认需要。
- Enable AXI memory Access from debug:jtag可以访问其他axi 地址。按需
- Enable Cross Trigger:外部trigger,按需。
- Enable JTAG UART:勾选,勾选后vitis的外设头文件中会出现一个uart lite的设置基地址。
设置后,点run connection automation,点mdm_1的s axi,连接到mb的axi上。
此时可以新增一个AXI uartLite模块。然后点run connection automation,勾选axi uart lite的s axi,我们只需要自动连接axi,选中后,在右边option中可以看到mater等设置,选择mb的axi。
再添加一个AXI APB Bridge,双击修改,按需要选择apb slave 个数,选择apb3和apb4配置,超时时间。此时需要注意,apb最好是在内部转时钟域,从外面输入apb clk。所以需要配置,AXI interconnect,新增1个master口。然后手动连接axi apb bridge。注意,把axi apb bridge的clk和rst_n export出去。AXI Interconnect的M0x_ACLK和M0x_ARESETN和apb clk和apb rstn连接。
最后再点击run connection automation,把mb的复位也export出去,选择低有效,可以看到连接到了system reset模块的ext reset in上。再选择连接uart接口,export出去。
最后一步去address editor给没有基地址的slave都设置一下。
至此一个简单的mb就搭建好了。如果还需要中断,可以手动添加axi interrupt controller,把中断线连接到intr管脚即可。也可以先例化所有的ip,auto connect时会自动例化。有多个中断时需要例化concat,做个多合一。
点击F6,或者图标进行validate design,pass后就可以Generate output product,按照ip进行集成了。
2. MicroBlaze串口收发
将带着mb的rtl代码进行综合,生成bit后,点击File -> Export_Hardware,Include bitstream,找个位置保存好xsa即可。同理,可以在这里export block design,把mb保存成1个tcl,需要使用时,在tcl console中source mb.tcl就可以完全重建一个mb。
有了xsa后,就有了mb的配置文件,内存多大,有哪些外设,地址分配等信息。
2.1 platform
- 点击Tool下的Launch Vits IDE,先Open workspace,选择1个文件夹下目录
- 然后Create Platform component,新建一个platform,设置name和位置,选上面的xsa文件,等待解析后,选择单机standalone或者freertos,确认生成。选择freertos还可以支持lwip,跑个轻量化的tcpip。
- 点击build先编译一下platform。编译车工后,在build后会出现1个绿色的打勾(vitis2023.2)
配置platform
- 点击左侧flow下的component,选择platform,此时只有一个,后续如果新建了app,还会出现app。再点击后面的设置图标。
- Switch XSA: 如果修改了mb的配置,例如增加了ram,就需要在这里修改xsa,重新编译。
- Hardware Specification:可以看到xsa的外设和地址分配。仅显示,无需配置
- 依次点开左侧的platform结构树,在standalone下,可以看到standalone_stdin和standalone_stdout,这里目前可以设置none(无需打印),axi uartlite 0和mdm,也就是printf函数打印时用哪个串口。按需修改即可。
- drivers下可以看到外设文档链接和examples,可以看到外设如何使用。
2.2 Helloworld
- 上面已经配置好platform了,然后开始开发app,app调用platform提供的相同的函数,由此可以在切换不同配置mb时,不修改app的代码,兼容性得到保证。
- 点击File -> New Component -> From examples,选择helloworld,点后面的加号,next,选择platform,完成创建。
- 在Flow下,component 选择hello_world,点击bulid,就可以在workspace目录下的hello_world下的build下找到hello_world.elf,这个就是mb的固件。
- hello_world -> Sources -> src -> hello_world.c就是代码所在,可以看到内容只有print。
- lscript.ld 在这里可以设置堆和栈的大小,还有memory的范围。
- 我们修改内存大小后,先切换xsa,编译platfrom,再对着app右键Reset Linker Script,然后检查lscript.ld 是否已经修改,修改了后再开始编译。
- 配置app。双击app下的Settings -> UserConfig.cmake。 Directories下新增include路径,找头文件的。Optimization下配置优化等级和debug level,按需配置即可。
2.3 uart收发
可以先在driver下导入串口的example,就可以看到收发的示例。
c
`include "xuartlite.h"
XUartLite UartLite;
XUartLite_Initialize(&UartLite,XPAR_XUARTLITE_0_BASEADDR);
unsigned char data[11];
data = "hello_world"
XUartLite_Send(&UartLite,&data,11); //发送数据,可以跟进去查看最终写的寄存器
while(1){
status = XUartLite_IsSending(&UartLite); //检查是否发送完毕
if(status == 0)
break;
}
//轮询接收
unsigned char recv_data[8];
while(1){
count = XUartLite_Recv(&UartLite,recv_data,1);
if(count > 1){
shell(recv_data[0]);
}
}
这里要注意的是,XPAR_XUARTLITE_0_BASEADDR在xparameters.h中定义,可以看到XPAR_XUARTLITE_0_BASEADDR基地址在0x40600000上,而XPAR_XUARTLITE_1_BASEADDR基地址在0x41400000上,0x41400000是mdm的基地址,由此可知,uart1是jtag uart。
3. XSDB
Xilinx System Debugger(赛灵思系统调试器),是 AMD Xilinx 随 Vitis / Vivado 套件自带的纯命令行交互式调试与硬件交互工具。
- XSDB:专注调试、硬件操作(下载 elf、断点、读写内存 / 寄存器、JTAG 控制),功能更纯粹;
- XSCT:早期综合命令行工具,包含全部 XSDB 功能,额外支持工程创建、编译、BSP 配置等工程管理;
新版本提示:XSCT 已标记为弃用,新版 Vitis 推荐直接使用内置 XSDB 或 Python 命令行工具。
启动xdsb:
- vitis下,顶部标题栏,Vitis -> XSDB console。在底部就可以选择到console上去。但是经常会出现服务器编译,在调试机连接jtag,所以这种方式经常不可用
- 在lab安装目录下,双击打开xsdb。
xsdb常用的命令
connect :连接本地硬件服务器
targets :查看 JTAG 链上所有目标(处理器、FPGA、PMC 等)
target :编号 选中指定处理器(比如选中 MicroBlaze)
rst :复位选中的处理器
dow xxx.elf :下载 elf 固件到处理器,可以用help download查看该命令
run :全速运行程序。 help running。con继续运行, stop停止,
stop :暂停程序运行
mrd :地址 长度 读取内存(排查 BRAM/DDR 数据、溢出),需要实现axi master。
mwr :地址 数值 写入内存 / 寄存器
reg :查看处理器寄存器
exit :退出 XSDB
jtag frequency 1500000 修改jtag频率
3.1 下载bit文件。
c
xsdb% connect
xsdb% targets
1 xc7k325t
xsdb% ta 1
xsdb% fpga -f C:/xxx/xxx/xxx.bit (注意'/'方向)
3.2 下载elf
c
xsdb% ta
1* xc7k325t
2 Microblaze Debug Module at USER2
3 Microblaze #0 (Running)
xsdb% ta 3
xsdb% rst
xsdb% dow app.elf
xsdb% con
3.3 JTAG UART
c
xsdb% ta
1* xc7k325t
2 Microblaze Debug Module at USER2
3 Microblaze #0 (Running)
xsdb% ta 2
xsdb% jtagterminal -start (打开一个新的终端)
xsdb% jtagterminal -stop(关闭)
还可以把uart转发到本地tcp端口
c
xsdb% jtagterminal -socket
xsdb% 49634
xsdb% jtagterminal -stop(关闭)
打开mobaxterm,创建一个telnet会话,选择127.0.0.1/49634即可。