SD karta jako úložiště kódu pro RISC-V YRV na FPGA desce Tang Nano 9K
Na levných FPGA deskách, jako je Tang Nano 9K, je při syntéze RAM omezený počet dostupných zdrojů — a tedy i velikost programové paměti. K dispozici je jen 16–20 KB pro zásobník a data: to stačí na testování, ale ne pro celý aplikovaný kód. Řešením je využít SD kartu jako externí ROM s čtením po sektorech (512 bajtů), podobně jako XIP u QSPI Flash, avšak s ohledem na specifika SPI protokolu.
Jádro YRV komunikuje s pamětí přes 16bitovou sběrnici. Logika čtení a zápisu je implementována v jazyce 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
FSM pro mezipaměťování sektorů SD
RAM je redukována na 512 bajtů — právě jeden sektor. Pokud jádro přistupuje k adrese uvnitř aktuálního sektoru, pokračuje v provozu s aktivním signálem mem_ready (ekvivalent HREADY v AHB-lite). Při přístupu mimo sektor spustí FSM čtení nového sektoru z SD karty. Čítač byte_cnt sleduje průběh čtení.
FSM obsahuje následující stavy:
- IDLE: čekání na požadavek.
- READ: čtení sektoru.
- START: inicializace čtení (příkaz
rd).
Řadič SD je odvozen z projektů FPGA-SDcard-Reader a MIT 6.111, upraven pro SPI rozhraní Tang Nano 9K (piny DAT1/DAT2 nejsou zapojeny). Inicializace na frekvenci 400 kHz zaručuje stabilitu bez nutnosti resetu napájení.
Integrace do projektu YRV Plus
Implementace je umístěna v adresáři labs/99_experimental/99_03_yrv_sd, postavena na základě šablony basics-graphics-music. Konfigurace tang_nano_9k_tm1638_sd je nastavena na 3,3 V pro piny SD. Výstup probíhá přes řadič TM1638: port0 řídí BCD segmenty, port1 pozici na displeji.
Příklad kódu pro zobrazení „HELO“ (každý znak v samostatném sektoru):
li s0, 0xFFFF0000 # port0 – segmenty
li s1, 0xFFFF0002 # port1 – pozice
main_loop:
# 'H' (pozice 3)
li t1, 0x8
sh t1, 0(s1)
.rept 100
nop
.endr
li t2, 0b00110111
sh t2, 0(s0)
.rept 1000
nop
.endr
# Stejně pro E, L, O
Firmware se připravuje v HxD: jednotlivé instrukce jsou rozmístěny po sektorech.
Výsledky testu:
- Mezi znaky se provádí cca 1000 instrukcí
NOP(užitečné zatížení). - Text „HELO“ je čitelný na čtyřech sedmisegmentových displejích.
- Reset je stabilní, inicializace probíhá bez nutnosti vypnutí napájení.
- Vytáhnutí SD karty okamžitě zastaví běh programu.
Klíčové body
- SD karta v SPI režimu je vhodná pro XIP-podobný přístup s mezipamětí o velikosti 512 bajtů.
- FSM minimalizuje prodlevy, signál
mem_readysynchronizuje jádro. - Řešení je ideální pro aplikace s nízkou dynamikou signálů (milisekundové časování).
- Pro vyrovnanější výkon doporučujeme mezipaměť 1–2 KB.
- Kompatibilní s jádrem YRV na FPGA Gowin bez externí SRAM.
Možnosti optimalizace
Současná implementace spotřebuje více než 6 taktů na sektor (ve srovnání s 6 taktovým QSPI). Rozšíření mezipaměti na 2–4 sekce sníží počet chyb při vyhledávání. Další možností je vyrovnávací paměť pro několik bank, jak je použita v původní logice YRV. Pro zkušené vývojáře: integrace s Wishbone nebo AXI adaptérem umožní škálování řešení.
— Editorial Team
Zatím žádné komentáře.