使用SD卡作为Tang Nano 9K FPGA上RISC-V YRV核的代码存储器
在Tang Nano 9K等高性价比FPGA开发板上,综合资源受限导致片上RAM容量极小——将完整程序代码存入块RAM(Block RAM)并不现实。当前仅能提供16–20 KB用于栈与数据区,勉强支撑基础测试,却无法容纳完整的固件镜像。本文提出一种创新方案:将SD卡用作外部只读存储器(ROM),以512字节扇区为单位进行读取,功能上类比QSPI Flash的就地执行(XIP),但针对SPI协议的时序与带宽限制进行了深度适配。
YRV核通过16位总线访问存储器。其读写逻辑采用Verilog实现:
always @ (posedge clk) begin
if (mem_trans[0]) begin
mem_rdata[31:24] <= mcu_mem_bank3 [mem_addr[13:2]];
mem_rdata[23:16] <= mcu_mem_bank2 [mem_addr[13:2]];
mem_rdata[15:8] <= mcu_mem_bank1 [mem_addr[13:2]];
mem_rdata[7:0] <= mcu_mem_bank0 [mem_addr[13:2]];
end
if (mem_wr_byte[3]) mcu_mem_bank3 [mem_addr_reg[13:2]] <= mem_wdata[31:24];
if (mem_wr_byte[2]) mcu_mem_bank2 [mem_addr_reg[13:2]] <= mem_wdata[23:16];
if (mem_wr_byte[1]) mcu_mem_bank1 [mem_addr_reg[13:2]] <= mem_wdata[15:8];
if (mem_wr_byte[0]) mcu_mem_bank0 [mem_addr_reg[13:2]] <= mem_wdata[7:0];
end
SD扇区缓存状态机
RAM资源被极致压缩至仅512字节——恰好容纳一个扇区。当CPU访问地址落在当前已缓存的扇区内时,mem_ready信号立即置高(类比AHB-Lite中的HREADY),执行无缝继续;若发生缓存未命中(即访问地址超出当前扇区范围),有限状态机(FSM)将自动触发一次新的SD卡扇区读取操作,并由byte_cnt计数器实时追踪读取进度。
该FSM包含三个核心状态:
- IDLE(空闲):等待内存访问请求到来。
- READ(读取):从SD卡中读取目标512字节扇区。
- START(启动):发起读命令(发送
rd指令)。
SD控制器基于开源项目FPGA-SDcard-Reader与MIT 6.111课程设计,专为Tang Nano 9K的SPI接口定制优化(DAT1/DAT2引脚悬空不接)。初始化阶段以400 kHz低速运行,确保高鲁棒性——无需断电重启即可完成可靠初始化。
集成至YRV Plus工程
本方案实现在labs/99_experimental/99_03_yrv_sd路径下,构建于basics-graphics-music基础工程之上。配置项tang_nano_9k_tm1638_sd将SD卡引脚设为3.3V电平。显示输出采用TM1638驱动芯片:port0控制BCD数码管段码,port1选择数码管位选。
以下为显示“HELO”的汇编示例(每个字符独立存储于一个扇区):
li s0, 0xFFFF0000 # port0 — 段码数据
li s1, 0xFFFF0002 # port1 — 位选地址
main_loop:
# 'H'(第3位数码管)
li t1, 0x8
sh t1, 0(s1)
.rept 100
nop
.endr
li t2, 0b00110111
sh t2, 0(s0)
.rept 1000
nop
.endr
# 同理依次加载'E'、'L'、'O'
固件通过HxD工具按扇区逐个烧录。
实测效果:
- 字符切换间隙执行约1000条NOP指令(模拟真实负载)。
- “HELO”四字符清晰稳定显示于四个七段数码管。
- 复位与初始化高度可靠,全程无需断电重启。
- 拔出SD卡后系统立即安全停机,无异常行为。
核心结论
- SD卡在SPI模式下,配合512字节扇区缓存,可实现类XIP的代码执行能力。
- 状态机设计显著降低延迟;
mem_ready信号保障CPU在读取期间严格同步。 - 特别适用于毫秒级信号时序的低带宽嵌入式场景。
- 如需更流畅体验,建议将缓存扩展至1–2 KB。
- 完全兼容Gowin系列FPGA上的YRV核——即使不配备外部SRAM亦可稳定运行。
进一步优化方向
当前每扇区读取耗时约6+个时钟周期(QSPI方案为6周期)。将缓存扩大至2–4个扇区,可大幅减少缓存未命中率。多Bank缓冲机制(复刻YRV原始内存架构)亦具备可行性。面向进阶开发者:可集成Wishbone或AXI总线桥接模块,使该方案无缝扩展至更复杂的SoC系统设计中。
— Editorial Team
暂无评论。