一、需求
项目需要将FPGA处理后的图片输出到屏幕实现可视化。
上篇博客讲了在ZCU102上调通Standalone DP接口的过程,实现了Xilinx SDK显示Demo。现在需要将Demo中显示的图像换成自定义的图像。有很多途径能从外部传输数据到ZYNQ中,包括Ethernet、USB、SD等接口都可以实现外部数据传输的功能。正好手上有现成的SD卡,我们就选择利用SD卡作为自定义图像存储的载体,用PS端先读取SD卡中存储的图像,再将图像显示在DP接口上。
二、ZYNQ Standalone SD卡接口配置
ZYNQ PS端内部集成了SD存储控制器,可以通过block design中的ZYNQ核配置实现。本工程的配置如下图所示。
这里主要需要配置的是Slot Type项,有SD2.0和SD3.0两项,需要根据自己SD卡的特性选择。值得一提的是,此前我们曾使用SD2.0的存储卡成功跑通了Linux系统(SD卡模式启动),但经过验证发现,ZCU102在Standalone模式下,同样的SD2.0的卡在后续在SDK测试中无法实现读写。通过查阅资料,发现官方给出了Zynq UltraScale+ MPSoC系列支持SD型号的列表(AMD Customer Community)。如下图所示,支持列表中对Standalone、BOOT、Linux三种SD卡使用方式做了区隔,即使是相同型号的SD卡对不同使用方式也存在兼容性的差异。
这说明原有的SD2.0卡很可能不支持Standalone模式。因此根据表格,我们上图采购了红框所示的Sandisk uhs-I型号的SD卡,该卡属于SD3.0,且能够同时支持Standalone、Boot和Linux模式。我们测试的两种SD卡如下图所示。
完成ZYNQ中SD卡配置后,再配置好DP接口(上个博客中有详细介绍)。然后保存block design,生成wrapper、综合、实现、导出比特流,打开SDK。
在SDK中根据导出的比特流生成板级支持包。然后打开板级支持包的system.mss文件。点击modify this BSP's settings,如下图所示,选中xilfss包。
xilffs包是Xilinx官方根据开源的Fat32文件系统改写的适用于ZYNQ系列的一套SD驱动程序。这也意味着我们的SD卡在使用前需要被格式化成Fat32才能进行后续使用。
使能xilffs包后,拉到system.mss文件的最下方,在Libraries中会出现xilffs的库,点击import examples,生成示例工程。
打开示例工程中的xilffs_polled_example.c程序。由于其他博客已经写了很多该示例程序的解释,此处就不再进行代码解读了。该程序的主要功能是实现SD卡的使能、挂载、写入、读取和校验功能。如果运行串口后打印如下信息,说明SD卡接口调试成功。