2026年了,FPGA大赛用国产紫光FPGA做RISC-V软核,怎么把UART和GPIO外设挂到AXI总线上?求具体步骤

开放3 回答 70 浏览

今年集创赛想用紫光同创的FPGA做个RISC-V软核小系统,但官方资料里只有CPU核的例程,外设挂载这块讲得特别模糊。我想把UART和GPIO通过AXI-Lite总线挂上去,但不知道地址映射怎么分配、中断控制器怎么接,仿真的时候总是不通。有没有大佬做过类似工程的,能分享一下从建工程到跑通串口打印的完整步骤?另外紫光的工具链和Vivado差别大吗,有没有什么坑要注意?

分享:

3 个回答

  • FPGA实践者

    先别急着把 UART 和 GPIO 往 AXI 上挂,我猜你大概率卡在地址映射和链接脚本对不上这件事上。紫光同创的软核例程里,PicoRV32 或 VexRiscv 的默认内存映射通常是从 0x00000000 开始放 RAM,但外设基地址你得自己定。常见做法是把外设区放在 0x40000000 起,预留 4KB 对齐空间,UART 占 0x40000000,GPIO 占 0x40001000,这样每条 AXI-Lite 通道对应 4KB 的页,不用纠结跨页问题。关键坑在于:紫光的 PDS 里 IP 封装方式和 Vivado 不一样,它不自动帮你生成 AXI 接口的 wrapper,你得手动写一个简单的 AXI-Lite 从机模块,把 awready/wready/bvalid 这些握手信号按标准时序拉通。建议先用官方例程里的 CPU 核跑通一个 LED 闪烁(直接操作内存地址),确认链接脚本里 RAM 基址没问题,再逐步加外设。中断这块,如果只是串口打印,可以先不用中断,轮询 TX 寄存器空标志就行,等打印通了再考虑 PLIC 或直接边沿触发到 IRQ 引脚——紫光的核有些版本只支持 level 触发,你得看具体型号的寄存器手册。仿真不通最常见的原因是 AXI 的 ready 信号没有在复位后拉高,或者地址位宽没对齐,你先用 Modelsim 跑一个只写 UART 数据寄存器的 testbench,抓 awready 和 wvalid 的波形,看有没有握手成功。工具链差异方面,PDS 的时序约束文件是 .fdc 格式,不是 XDC,而且综合速度慢,但标准 Verilog 基本都能跑,别用 SystemVerilog 的高级特性。我建议你先把官方例程的工程完整跑一遍,确认能下载到板子上,再改外设,这样至少能筛掉一半的环境问题。你现在用的软核是 PicoRV32 还是 VexRiscv?这俩的地址映射和中断引脚定义差别挺大,直接决定你怎么接外设。

  • FPGA探索者

    紫光 PDS 就是换个皮的 Vivado,但 IP 封装那层很坑,别指望它自动生成 AXI wrapper,手动写从机握手信号吧。先别碰中断,轮询串口输出通了再想别的。

  • 数字电路初学者

    我去年做过类似的事,简单说下我的路线。第一步,把官方例程里的软核工程原封不动跑一遍,用串口调试助手发个字符看能不能回显,这一步能确认工具链和下载链路没问题。第二步,自己写一个 AXI-Lite 从机模块,只实现一个 32 位寄存器,地址用 0x40000000,先用它控制一个 LED 灯,验证读写通路。第三步,把 UART 的发送 FIFO 接口接到这个寄存器上,轮询发送。地址映射就按 0x40000000 + 4KB 对齐,中断先别接。紫光 PDS 和 Vivado 最大的差别是 IP 核封装方式,但手写 Verilog 不受影响。仿真时注意 AXI 的 awready 和 wready 要等地址和数据都有效才拉高,你八成是握手时序不对。跑通后记得把链接脚本里的外设段地址改对,不然 CPU 访问不到。你现在卡在仿真还是实际板卡调试?

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

提问者

Verilog新手村查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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