Vivado Microblaze/JTAG Uart/XSDB应用笔记

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即可。