Zpět na domů

SD karta jako ROM pro RISC-V YRV FPGA

Článek popisuje použití SD karty jako úložiště spustitelného kódu pro RISC-V jádro YRV na desce Tang Nano 9K. Implementován FSM pro čtení sektorů 512 bajtů s cachováním v RAM. Testování s výstupem HELO potvrzuje funkčnost.

SD místo RAM: RISC-V YRV na FPGA s paměťovou kartou
Advertisement 728x90

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í.

Google AdInline article slot

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.

Google AdInline article slot

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:

Google AdInline article slot
  • 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_ready synchronizuje 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

Advertisement 728x90

Číst dál