2026年了,FPGA大赛用国产紫光FPGA做RISC-V软核,SD卡启动和DDR3初始化顺序怎么安排才不翻车?

开放6 回答 60 浏览

我们队伍今年准备用紫光同创的FPGA做RISC-V软核SoC,现在卡在启动流程上。之前用Xilinx的板子,SD卡启动和DDR3初始化顺序有官方参考,但换成国产FPGA后,发现DDR3的PHY校准和SD卡读取时序对不上,经常启动到一半就挂死。请问有经验的工程师,SD卡启动和DDR3初始化顺序到底怎么安排才不翻车?是先初始化DDR3还是先读SD卡?中间要不要加延时?

分享:

6 个回答

  • 数字电路小白

    先给结论:DDR3 初始化放在最前面,而且不是简单先跑一遍,是要等 PHY 校准完全稳定、读写回环全通过之后,再去碰 SD 卡。你之前用 Xilinx 有官方参考流程,那是因为 Xilinx 的 MIG 把 PHY 校准和用户逻辑的握手做得比较干净,你等 calib_done 拉高就行。紫光的 DDR3 IP 核校准机制不完全一样,常见坑是 PHY 校准还没完成,你就去读 SD 卡,SD 卡控制器和 DDR3 控制器抢 AXI 总线或者时钟域没对齐,挂死是必然的。我建议你分三步走:第一步,单独做一个只含 DDR3 控制器和简单读写回环的工程,跑至少 1 万次随机地址写读比对,确保 PHY 训练出来的延迟参数是稳定的,特别是温度变化后重新上电的情况;第二步,再把 SD 卡读取模块加进来,但此时软核还不启动,先用状态机把 SD 卡里的程序读到 DDR3 指定地址,读完后做个 CRC 校验或者长度校验;第三步,校验通过后再释放软核的复位,让软核从 DDR3 的入口地址取指。中间延时不是必须的,但上电后建议给 DDR3 控制器一个至少 200us 的稳定时间,SD 卡那边用 SPI 模式,时钟分频先压到 1MHz 以下,等初始化握手成功后再提到 10MHz 左右。另外提醒一点,紫光的 IP 核有些版本需要你在配置界面里手动选 DDR3 的型号和时序参数,别用默认值,不然校准会假通过。你们现在用的紫光具体是 PGL 还是 PG2K 系列?这俩的 DDR3 PHY 行为差挺多的,流程细节会有区别。

  • 电子技术新人

    先 DDR3 后 SD 卡,别犹豫。你只要记住一件事:软核取指必须从 DDR3 里来,DDR3 不稳,SD 卡读得再对也是白搭。加延时不如加握手信号,等 DDR3 的 cal_done 拉高再动 SD 卡,比瞎等靠谱。

  • 芯片设计入门

    这个问题本质上是启动依赖链的排序问题,但很多队伍把它当成一个简单的时序问题,这是最大的误区。你问要不要加延时,说明还在用 Xilinx 的思维惯性去套国产平台。Xilinx 的参考设计里,DDR3 初始化完成后会有一个 calib_done 信号,SD 卡启动代码里通常会轮询这个信号,然后才开始搬运程序。紫光的问题在于,它的 DDR3 IP 核在 PHY 校准阶段会占用内部的高速收发通道或者某些全局时钟资源,而 SD 卡控制器如果用的是同一套时钟网络,在 PHY 校准过程中去访问 SD 卡,会引发时钟抖动或者复位冲突,表现出来就是启动到一半挂死。所以正确顺序不是简单的前后关系,而是要让 DDR3 的 PHY 校准过程独占系统资源,期间 SD 卡控制器必须处于完全复位状态,连时钟都不能给。具体做法是:上电后先复位所有外设,只给 DDR3 控制器供时钟,等它的 PHY 校准状态机走完,你读一下状态寄存器,确认 training 成功(不是只查 done 信号,有的版本 done 拉高但内部 error 位也置了),然后你再给 SD 卡控制器解除复位、开始配置。SD 卡用 SPI 模式是对的,但初始化时序要特别注意——上电后先拉低 CS 至少 74 个时钟周期,然后发 CMD0,等响应,再发 CMD1 或者 CMD8,这个过程中时钟分频一定要低,我见过有人用 50MHz 去初始化 SD 卡,直接卡死在 ACMD41。等 SD 卡进入数据传输模式后,再把时钟提上去。还有一个容易被忽略的点:程序从 SD 卡读到 DDR3 之后,一定要做一次 cache 一致性处理,紫光的软核如果是自带的 N 系列或者你们自己接的 VexRiscv,指令缓存可能没有自动失效机制,DMA 写进去的数据和 CPU 读到的可能不一致。建议读完一段就执行一次 fence.i 或者手动清 I-cache。最后说一个工程上的取舍:如果比赛时间紧,别在 SD 卡启动上耗太多,可以先做一个 UART 下载程序到 DDR3 的调试通道,把 DDR3 验证稳了,SD 卡启动作为加分项最后再搞。你们现在软核是用的紫光官方 IP 还是自己搭的?如果是自己搭的,总线仲裁有没有做优先级处理?这个对挂死的影响也很大。

  • Verilog练习生

    别把这事当成一个简单的先后问题,你真正要解决的是两个外设对系统资源的独占冲突。紫光的 DDR3 IP 在 PHY 校准阶段会做大量训练,这个过程中它会反复调整延迟参数、占用内部的高速时钟网络,甚至可能短暂拉高全局复位。如果你在这个窗口里去操作 SD 卡,哪怕只是发一条 CMD0,SD 卡控制器和 DDR3 控制器之间共享的 AXI 总线或者时钟域就可能出现毛刺,表现出来就是启动到一半挂死,而且每次挂死的位置可能还不一样。所以我的建议是:上电后先把所有外设置于复位态,包括 SD 卡控制器、UART、GPIO,只让 DDR3 控制器工作,等 cal_done 信号拉高后,再做一个简单的读写回环测试,比如往固定地址写 0x5A5A 再读回来比对,确认 PHY 训练出的延迟参数稳定后,再去释放 SD 卡控制器的复位。这里有个很容易被忽略的点:紫光的 IP 核有的版本 cal_done 拉高后并不代表内存子系统完全可用,你最好再等几个时钟周期,或者直接轮询一个状态寄存器确认 AXI 总线空闲。至于 SD 卡这边,上电后先给它至少 74 个时钟周期的空转,然后切到 SPI 模式,时钟分频先设成 1MHz 左右,等初始化完成后再提速。别迷信延时,延时只能掩盖问题,握手信号才是根治。你可以试一下,如果做完这些还挂,大概率是复位释放顺序的问题,把 DDR3 的复位释放放在 SD 卡之前,中间隔 100 个时钟周期,基本就能稳。

  • 面向百度

    简单说,先 DDR3 后 SD 卡,但中间要加一个读写回环确认。紫光的 PHY 校准不像 Xilinx 那么干净,cal_done 拉高后可能还有尾巴,你直接去读 SD 卡容易撞上。做法就是:上电后先初始化 DDR3,等 cal_done 后写一个地址读回来比对,对了再初始化 SD 卡,SPI 模式,时钟 1MHz 起步。别省这一步回环,很多翻车都是因为省了它。

  • 芯片小白

    先DDR3回环测试通过,再碰SD卡,SPI模式时钟先给低点。加延时不如加状态机,等cal_done再动。

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

提问者

数字系统萌新查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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