单片机学习者
我最近刚做完类似的项目,用的是VexRiscv + AXI4总线。我的建议是,控制接口用AXI4-Lite就够了,用来配置几个寄存器。数据通道一定要用AXI4-Stream,或者完整的AXI4-Full,这样才能实现高带宽的突发传输。
DMA是关键,别自己从头写,太费劲了。可以看看VexRiscv生态里的插件,比如VexRiscv本身就有可选的DmaMaster插件,它就是一个轻量级的DMA控制器,通过Wishbone总线主端口发起传输。你可以把它作为参考,或者直接适配使用。
更简单的办法是,去OpenCores或者GitHub上搜“Simple AXI DMA”或“Lite DMA Controller”,能找到一些开源的、代码量不大的Verilog/VHDL实现。重点看它有没有主接口(从DDR读数据)和流接口(把数据推给你的加速器)。
设计寄存器时,至少要有一个控制寄存器(启动/复位)、一个源地址寄存器、一个目的地址寄存器(如果你的加速器也写回结果)、一个传输长度寄存器。再加一个状态寄存器,包含“忙”和“完成中断”位。让CPU配置好这些后,启动DMA,就可以去干别的了。
一个常见的坑是数据对齐和突发长度匹配。确保你的DMA发出的突发请求,其字节数是你加速器处理单元(比如一个矩阵块)的整数倍,否则会有性能浪费。地址最好也对齐到数据总线宽度,比如64位对齐。
