我们队伍用高云GW5A系列做RISC-V软核SoC,跑Linux,现在卡在启动流程上。SD卡里放了BOOT.bin和Image,上电后DDR3初始化总是失败,偶尔能跑起来但跑着跑着就死机。怀疑是初始化顺序问题,是先配PLL还是先配DDR3控制器?SD卡读取和DDR3校准有没有先后要求?
2026年了,FPGA大赛用国产高云FPGA做RISC-V软核+图像加速,SD卡启动和DDR3初始化顺序怎么安排才不翻车?
3 个回答

先查你的PLL锁定信号有没有真正拉高再往下走,DDR3 training必须在稳定时钟下做,这是最常见翻车点。另外复位释放后等200us再碰training,别省这个延时。SD卡读取其实可以放最后,先让DDR3跑通再加载镜像,不然时序全乱。你们是用的高云官方例程还是自己写的初始化状态机?

我去年用GW5A做过类似的东西,说下我调通的顺序吧:上电先配PLL,等lock信号稳定,然后初始化DDR3控制器,training过了之后再去读SD卡。你现在的死机问题大概率不是SD卡和DDR3的先后,而是DDR3 training本身没做干净,比如时钟抖动大或者参考电压不对。建议你在training前加个软延时,至少200us,这是高云手册里明确写的。另外检查一下你的复位释放时序,如果复位信号和PLL锁定是同时的,那training时时钟还不稳,必挂。跑着跑着死机的话,多半是DDR3读写时序余量不够,可以试着降一档频率跑,先验证功能再优化性能。你们Linux启动时用的是设备树还是直接改源码?这个也会影响内存初始化参数。

这个坑我太熟了,当年我们队也是卡在DDR3上,熬了好几个通宵。说点实在的:你现在的现象——偶尔能跑但会死机——基本可以断定是training时好时坏,而不是SD卡读取顺序问题。正确思路是:PLL先配,等lock信号稳定,这是前提;然后DDR3控制器初始化,training必须在这个稳定时钟域下做,而且复位释放后至少等200us(有的板子建议500us更保险)再开始training,这个延时用计数器实现,别用简单的sleep,因为RTL里没有真正的sleep。SD卡读取放最后,因为Linux内核镜像加载前DDR3必须已经完全可用。另外你们用的高云DDR3 IP,建议把training的日志通过UART打出来,看具体是哪个步骤失败——是write leveling还是read calibration,这样能定位是PCB走线问题还是时钟问题。还有个常见误区:很多人忽略DDR3的参考电压Vref,如果板子上没接好或者分压电阻不对,training会间歇性失败。死机问题除了时序,也可能是你的RISC-V软核跑得太快,DDR3访问时没有加wait state,导致总线冲突。降频到100MHz先跑通整个Linux启动流程,再慢慢超上去,这样能快速隔离问题。顺便问下,你们的板子是自研的还是高云官方开发板?如果是自研的,DDR3的走线等长和阻抗匹配有没有检查过,这个对training成功率影响极大。
发表回答
登录后可在本页底部提交回答