2026年FPGA大赛用国产高云FPGA做RISC-V软核+图像加速,SD卡启动和DDR3初始化顺序怎么安排才不翻车?

开放6 回答 65 浏览

我们队伍今年FPGA大赛选了高云FPGA做RISC-V软核,外挂DDR3跑图像加速,但是SD卡加载固件和DDR3初始化顺序总是搞不对,上电偶尔起不来。想问下有没有人调过类似架构?是先把DDR3初始化完再读SD卡,还是先读SD卡再初始化DDR?另外高云的IP核和Xilinx的差别大吗?求一份具体的上电启动流程图,急!

分享:

6 个回答

  • 芯片学徒

    先初始化DDR3再读SD卡,别犹豫。高云上电默认从SPI Flash或SD卡引导,但DDR3不初始化的话,固件里的代码一旦碰内存就崩。你可以在BootLoader里先跑DDR training,再挂载SD卡读固件到DDR里跳转。顺序反了,大概率是随机死机。

  • 硅农预备役001

    我们去年用高云Arora调过类似架构,先说结论:DDR3初始化必须在SD卡读取之前完成,但有个坑——高云的DDR3 IP核默认是AXI接口,而RISC-V软核(比如用芯来或自研)的AXI主端口时序和Xilinx的差别很大,尤其是读写响应延迟和burst长度。建议你上电后先让软核跑一段裸机代码,这段代码要放在FPGA内部的BRAM里(高云有专门的Boot ROM配置),先调用DDR3的初始化函数,等training完成并返回成功标志,再去读SD卡。SD卡读取建议用SPI模式,别用SDIO,因为高云的SDIO控制器在RISC-V下驱动不成熟,容易超时。另外,DDR3初始化时高云的IP核有个`init_done`信号,一定要等它拉高再往下走,别用固定延时,不同批次芯片的training时间能差几十毫秒。如果上电偶尔起不来,大概率是DDR3的reset和时钟相位没对齐,检查一下你的`ddr3_rst_n`是不是由PLL锁定信号控制,高云要求DDR复位至少保持100us。流程图网上没有现成的,自己画:PLL锁定→DDR3复位释放→初始化IP→等待done→SPI读SD卡第一扇区→校验固件CRC→搬运到DDR3→跳转执行。还有个容易忽略的点:SD卡供电要稳定,高云开发板上的SD卡VDD经常和DDR3共用一路电源,上电瞬间压降大,建议分开供电或者加个大电容。

  • 数字电路初学者

    主思路就一条:先DDR后SD,但你要注意高云的工具链里有个坑——DDR3 IP核的例化模板和Xilinx完全不同,它不给你自动生成约束文件,你得手动加`create_clock`和`set_input_delay`,否则DDR training时序乱跑。我建议你先把DDR3初始化代码单独放一个模块,用LED或串口打印调试信息确认稳定了,再挂SD卡逻辑。SD卡上电前最好先拉低CS再上电,不然有些卡会进入未知状态。另外,高云的上电复位最好用外部看门狗芯片,别依赖内部POR,大赛现场环境乱,电源毛刺多。流程图的话,我手写一份:上电→配置FPGA→软核从BRAM启动→初始化系统时钟→等待PLL锁定→DDR3复位释放→DDR3 training→检查done信号→SPI读取SD卡MBR→找FAT32根目录→读固件文件→校验→写入DDR3→跳转。你先跑通这个,再考虑图像加速,别一上来就并行处理。

  • 电子萌新小张

    别先折腾DDR3,先把SD卡启动搞干净。高云的上电顺序里,DDR3初始化可以放到软核启动之后异步做,但SD卡必须得在DDR3 ready之前完成读取并暂存到BRAM里——因为你的固件可能本身就依赖DDR3运行,而SD卡驱动代码又不能放DDR里。正确做法:FPGA配置完成后,软核从片上SRAM启动,先用SPI读SD卡前几个扇区(这段代码要小,SRAM够用),把固件头解析出来,然后初始化DDR3,再把固件从SRAM拷贝到DDR3。这样即使DDR3初始化失败,你还能用串口打印错误。高云和Xilinx的最大差别在IP核的`user_interface`上,高云没有Xilinx的`ui_clk_sync`信号,你得自己处理跨时钟域。建议看高云官方手册里的DDR3参考设计,照着改。流程上,我建议画个状态机:IDLE→SD_READ→DDR_INIT→COPY→JUMP,每个状态加超时计数器,超过500ms就报错重启。

  • 芯片爱好者小陈

    先把最容易翻车的点说破:SD卡驱动代码不能放在DDR3里,因为DDR3还没初始化时你根本没法访问它。所以正确的顺序是——FPGA配置完成后,RISC-V软核从片上SRAM/BRAM启动,先用SPI模式读SD卡的前几个扇区,把固件头解析出来,这段代码必须精简到SRAM能放下。然后初始化DDR3,等training完成、init_done拉高,再把固件从SRAM拷到DDR3,最后跳转执行。反过来先初始化DDR3再读SD卡的问题在于,你的SD卡驱动代码如果本身依赖DDR3运行,那DDR3没起来之前驱动也跑不了,死循环。高云和Xilinx最大的差别是IP核没有ui_clk_sync这类同步信号,跨时钟域要自己处理,建议直接照官方DDR3参考设计的时序改。你们现在上电偶尔起不来,大概率是DDR3 training时序没约束好,或者SD卡上电时CS没拉低。你们用的高云具体是Arora还是GW2A系列?不同系列的DDR3 IP核约束写法差挺多的。

  • FPGA入门生

    先别急着定顺序,你们得先搞清楚一个前提:固件本身依赖不依赖DDR3运行。如果你们的RISC-V软核和图像加速代码全部能塞进BRAM,那完全可以先读SD卡、把固件暂存到BRAM,再初始化DDR3,最后拷贝过去。但如果固件比较大,比如图像加速的权重参数直接编进固件里,那BRAM肯定不够,这时候就必须先初始化DDR3,因为软核启动后第一件事就是访问DDR3里的代码。我建议你们做个折中:BootLoader放BRAM,先初始化DDR3,但SD卡读取用SPI模式且驱动代码也放BRAM,这样即使DDR3 training失败,BootLoader还能通过串口打印错误信息,不会黑屏死机。高云的工具链确实比Xilinx简陋,DDR3 IP核不自动生成约束文件,你得手动加create_clock和set_input_delay,否则training时序乱跑,上电偶尔起不来就是这个原因。另外,高云的上电复位建议用外部看门狗芯片,别依赖内部POR,比赛现场电源毛刺多,内部复位不可靠。你们可以先用LED或串口打印DDR3 training的done信号,确认稳定了再挂SD卡逻辑,一步一步来。你们现在SD卡用的是SPI模式还是SDIO?高云的SDIO控制器在RISC-V下驱动不太成熟,如果卡在读取阶段,换个SPI模式可能就解决了。

登录后可在本页底部提交回答

提问者

数字IC菜鸟查看主页
浏览「其他」

描述场景与已尝试方案,更容易获得有效解答

相关问题

同分类

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位