Karta SD jako pamięć programu dla procesora RISC-V YRV na płytce FPGA Tang Nano 9K
Na tanich płytach FPGA, takich jak Tang Nano 9K, ograniczona liczba zasobów dostępnych do syntezy pamięci RAM znacznie ogranicza pojemność pamięci programu. Dostępne jest jedynie 16–20 KB pamięci przeznaczonej na stos i dane — wystarczająco dużo do testów, ale niewystarczająco do przechowywania pełnego kodu aplikacji. Zaproponowano wykorzystanie karty SD jako pamięci typu ROM z mechanizmem odczytu sektorowego (512 bajtów), analogicznie do trybu XIP (eXecute In Place) stosowanego w przypadku pamięci QSPI Flash, lecz z uwzględnieniem specyfiki protokołu SPI.
Jądro YRV komunikuje się z pamięcią poprzez 16-bitową szynę. Logika odczytu i zapisu została zaimplementowana w języku 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
Maszyna stanów do buforowania sektorów z karty SD
Pamięć RAM została ograniczona do 512 bajtów — czyli dokładnie jednego sektora. Gdy jądro odwołuje się do adresu znajdującego się w aktualnie załadowanym sektorze, kontynuuje działanie z ustawionym sygnałem mem_ready (analogicznie do HREADY w interfejsie AHB-lite). W przypadku wyjścia poza zakres bieżącego sektora maszyna stanów inicjuje odczyt nowego sektora z karty SD. Licznik byte_cnt śledzi postęp operacji odczytu.
Maszyna stanów obejmuje następujące stany:
- IDLE: oczekiwanie na żądanie dostępu do pamięci,
- READ: odczyt sektora z karty SD,
- START: inicjacja operacji odczytu (wysłanie komendy
rd).
Sterownik karty SD został zapożyczony z projektów FPGA-SDcard-Reader oraz MIT 6.111 i dopasowany do interfejsu SPI płytki Tang Nano 9K (linie DAT1 i DAT2 nie są podłączone). Inicjalizacja na częstotliwości 400 kHz zapewnia stabilną pracę bez konieczności resetowania zasilania.
Integracja z projektem YRV Plus
Implementacja znajduje się w katalogu labs/99_experimental/99_03_yrv_sd, oparta na projekcie basics-graphics-music. Używana konfiguracja to tang_nano_9k_tm1638_sd, zaprojektowana pod napięcie 3,3 V na pinach karty SD. Wyświetlanie odbywa się za pomocą sterownika TM1638: port0 odpowiada za segmenty BCD, a port1 za pozycję cyfr na wyświetlaczu.
Przykład kodu wyświetlającego napis „HELO” (każdy znak umieszczony w osobnym sektorze):
li s0, 0xFFFF0000 # port0 – segmenty
li s1, 0xFFFF0002 # port1 – pozycje cyfr
main_loop:
# 'H' (pozycja 3)
li t1, 0x8
sh t1, 0(s1)
.rept 100
nop
.endr
li t2, 0b00110111
sh t2, 0(s0)
.rept 1000
nop
.endr
# Analogicznie dla E, L, O
Zapis firmware'u w HxD: instrukcje rozmieszczone są sektorowo.
Wyniki testu:
- Między wyświetlaniem kolejnych znaków wykonywanych jest ok. 1000 instrukcji
NOP(symulacja obciążenia procesora), - Napis „HELO” jest czytelny na czterech wyświetlaczu siedmiosegmentowym,
- Reset działa stabilnie, inicjalizacja karty SD nie wymaga cyklu wyłączenia/zasilania,
- Wyciągnięcie karty SD natychmiast zatrzymuje wykonanie programu.
Kluczowe założenia
- Karta SD w trybie SPI nadaje się do dostępu typu XIP przy użyciu bufora o pojemności 512 bajtów,
- Maszyna stanów minimalizuje opóźnienia, a sygnał
mem_readysynchronizuje pracę jądra, - Rozwiązanie jest odpowiednie dla zadań o niskiej dynamice sygnałów (skala milisekund),
- Zalecany rozmiar bufora to 1–2 KB w celu wyrównania wydajności,
- Kompatybilne z jądrem YRV na FPGA Gowin bez konieczności stosowania zewnętrznej pamięci SRAM.
Perspektywy optymalizacji
Obecna implementacja zużywa ponad 6 taktów na sektor (w porównaniu do 6 taktów dla QSPI). Zwiększenie bufora do 2–4 sektorów znacznie zmniejszy liczbę błędów cache. Możliwe jest również wprowadzenie buforowania wielu banków pamięci, zgodnie z oryginalną architekturą YRV. Dla zaawansowanych deweloperów: warto rozważyć integrację z adapterem Wishbone lub AXI w celu skalowania rozwiązania.
— Editorial Team
Brak komentarzy.