再战zynq无ddr启动

太难了

fpga真的是太难了

抓耳挠腮 阴暗的爬行 🐦珠颈斑鸠咕咕叫🐦 🐧咕咕咕嘎嘎🐧jdlajfdlafjlkdjaflkdjaklf

让我们再来一次…总算跑起来了(身心俱疲

杀了我吧 xilinx

测试环境 vivado 2018.3 zynq7010

建一个工程,添加一个zynq核,把ddr关了

image-20250520171434949

打开qspi flash用来固化程序(注意,只能使用qspi flash,sd卡或者nand都会失败 由于fsbl里的一些机制,我暂时还不知道如何绕过 这就是上篇文章我鼓捣了一天没成功的原因)

顺便加个emio用来验证ps是否正确工作

image-20250520171606398

加一个简单的计数器闪灯的.v文件验证pl是否正常工作

image-20250520171851488

然后添加规则约束综合实现生成比特流导出sdk不谈

直接快进到打开sdk

建一个普通的空工程,写个闪灯

image-20250520173020743

用户代码正常写就行

然后修改链接脚本,给所有内容改到ram1去

注意,ram1只有64k大小,so。。。基本写不了啥,很容易爆

因为zynq的内置ram只有256k,前面192k要给fsbl用(本来是256k都给fsbl的,这都已经是挤出来的了)

所以这点小内存基本上。。当单片机用都不行。毕竟zynq的ps库挺重的 占内存不小

比较实用的用法可能是只用来引导pl当作一个很便宜的fpga用吧,毕竟zynq拆机片便宜的要死

image-20250520175213884

编译一下

可以看到空间占用50k(zynq默认不会xip,所以应该是code+data+bss都会加载到内存)

image-20250520173222251

然后建一个fsbl

这东西默认编译出来130kimage-20250520173324322

然后改fsbl

下面的内容都是我验证过必须的,网上教程有很多经过验证可做可不做不影响结果的修改,都去掉了

首先把296行的条件编译改成固定编译(if 1)

因为没有ddr,默认这个条件编译不启动下面fsbl会直接不执行报错

image-20250520173506230

直接改成if 1强制执行

image-20250520173524891

然后把298到311行的ddr检查注掉

image-20250520173755980

打开fsbl.h,把475行的地址改成0xFFFFFE00

image-20250520173946748

修改链接脚本,给所有内存地址都改到ram0(其实只有最后一个默认是ram1需要改)

记得保存

image-20250520174542597

重新编译一下

默认生成一下boot文件

image-20250520174111168

给板子切到jtag启动模式,把boot.bin烧到flash里,选编译出来的boot和fsbl就行了

image-20250520174303782

image-20250520174341464

重新切换回flash启动,上电,可以看到PL和PS的EMIO绑定的两个引脚LED都在闪,说明已经正常启动

最后说下坑点吧

首先,只能用qspi的nor flash,别的都启动不了。别问我为啥,我之前大概折腾了一天fsbl的代码也没看太明白,应该是加载映像的过程中需要用到ddr内存来搬移,所以就挂掉。。qspi flash不需要这一步(大概

反正做参考吧,我也没能力改fsbl代码,所以就这样咯,网上的教程也都是用这个的

然后就是内存小了,本来就只有256k,fsbl占192k,给用户程序只有64k,作为单片机来说可能不小了,但是这玩意是a7,他的bsp库很大,写个闪灯编译出来都50k,还不是xip的,满满的占内存。。

网上有些dalao做裁剪优化,xip啥的,但是我太搞不太明白,也就暂时只能先这样了

作为单片机都不太能玩,只用pl当fpga用的话大概还是可以的吧

毕竟拉ddr是个苦大仇深的活

大概就这样咯