再战zynq无ddr启动
太难了
fpga真的是太难了
抓耳挠腮 阴暗的爬行 🐦珠颈斑鸠咕咕叫🐦 🐧咕咕咕嘎嘎🐧jdlajfdlafjlkdjaflkdjaklf
让我们再来一次…总算跑起来了(身心俱疲
杀了我吧 xilinx
测试环境 vivado 2018.3 zynq7010
建一个工程,添加一个zynq核,把ddr关了
打开qspi flash用来固化程序(注意,只能使用qspi flash,sd卡或者nand都会失败 由于fsbl里的一些机制,我暂时还不知道如何绕过 这就是上篇文章我鼓捣了一天没成功的原因)
顺便加个emio用来验证ps是否正确工作
加一个简单的计数器闪灯的.v文件验证pl是否正常工作
然后添加规则约束综合实现生成比特流导出sdk不谈
直接快进到打开sdk
建一个普通的空工程,写个闪灯
用户代码正常写就行
然后修改链接脚本,给所有内容改到ram1去
注意,ram1只有64k大小,so。。。基本写不了啥,很容易爆
因为zynq的内置ram只有256k,前面192k要给fsbl用(本来是256k都给fsbl的,这都已经是挤出来的了)
所以这点小内存基本上。。当单片机用都不行。毕竟zynq的ps库挺重的 占内存不小
比较实用的用法可能是只用来引导pl当作一个很便宜的fpga用吧,毕竟zynq拆机片便宜的要死
编译一下
可以看到空间占用50k(zynq默认不会xip,所以应该是code+data+bss都会加载到内存)
然后建一个fsbl
这东西默认编译出来130k
然后改fsbl
下面的内容都是我验证过必须的,网上教程有很多经过验证可做可不做不影响结果的修改,都去掉了
首先把296行的条件编译改成固定编译(if 1)
因为没有ddr,默认这个条件编译不启动下面fsbl会直接不执行报错
直接改成if 1强制执行
然后把298到311行的ddr检查注掉
打开fsbl.h,把475行的地址改成0xFFFFFE00
修改链接脚本,给所有内存地址都改到ram0(其实只有最后一个默认是ram1需要改)
记得保存
重新编译一下
默认生成一下boot文件
给板子切到jtag启动模式,把boot.bin烧到flash里,选编译出来的boot和fsbl就行了
重新切换回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是个苦大仇深的活
大概就这样咯