Teach Pelajaran dengan makmal jarak jauh

Pelajaran Teach

Nios V pada DE1-SoC (2/5): I/O pemetaan memori dengan C

Sunting I/O pemetaan memori dalam C pada Nios V, baca suis, kawal LED dan terangkan cara alamat menghubungkan kod dengan perkakasan.

  • Nios V for DE1-SoC
  • 55 min
  • Prasiswazah Sains atau Kejuruteraan Komputer
  • ms-MY
  • Digital systems & FPGA · Embedded systems
Nios V for DE1-SoC
Nios V for DE1-SoC · Butiran makmal

Hasil pembelajaran

  • Menggunakan penuding volatile C untuk mengakses I/O pemetaan memori.

  • Membaca suis logik Nios V LabsLand melalui laluan GPIO JP1.

  • Menggunakan topeng dan anjakan untuk memetakan bit input kepada bit output LED.

  • Mengesahkan tingkah laku perkakasan melalui kamera langsung papan.

Pratonton aktiviti pelajar

Kandungan aktiviti

Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.

1

Peta I/O

8 min

Pemproses Nios V melihat persisian perkakasan sebagai alamat memori. Dalam makmal ini, atur cara permulaan menggunakan:

- LEDR di 0xFF200000: daftar output LED merah.
- data JP1 di 0xFF200060: laluan input suis logik LabsLand.
- arah JP1 di 0xFF200064: daftar arah GPIO.
- JTAG UART di 0xFF201000: output terminal melalui printf.

CPU membaca dan menulis alamat ini seperti memori biasa, tetapi fabrik FPGA menghalakan setiap akses ke persisian dan bukannya RAM. Inilah I/O pemetaan memori.

Kawalan pelayar berlabel NSW0..NSW9. Dalam aliran jauh semasa, kawalan ini bukan port fizikal SW0..SW9 di 0xFF200040. Kawalan NSW logik masuk melalui bit GPIO JP1, kemudian atur cara mengalihkan bit itu ke bawah sebelum menulis daftar LED.

Sempadan rujukan: manual FPGAcademy DE1-SoC Computer with Nios V ialah rujukan yang betul untuk komputer Nios V tetap dan peta persisiannya. Pelajaran ini sengaja menggunakan laluan JP1 yang disahkan oleh LabsLand untuk kawalan NSW pelayar, bukan daftar suis fizikal FPGAcademy secara langsung.

Kawalan suis NSW LabsLand dipetakan melalui bit JP1 kepada LED merah DE1-SoC.

Kawalan NSW pelayar dibaca daripada bit data JP1 5 hingga 14. Atur cara menganjak ke kanan sebanyak lima supaya NSW0 menjadi bit 0, kemudian menulis nilai sepuluh bit itu kepada LEDR0..LEDR9.

Kedudukan bit utama:

- NSW0 dibaca sebagai bit data JP1 5 dan menjadi LEDR0.
- NSW1 dibaca sebagai bit data JP1 6 dan menjadi LEDR1.
- NSW2 dibaca sebagai bit data JP1 7 dan menjadi LEDR2.
- Corak yang sama berterusan hingga NSW9, yang dibaca sebagai bit 14 dan menjadi LEDR9.

Bagi profil ini, menulis 0 kepada daftar arah JP1 menetapkan baris yang digunakan oleh NSW0..NSW9 sebagai input. Oleh itu, atur cara menulis *JP1_DIR = 0; sebelum membaca daftar data JP1.

Mengapakah atur cara menulis ke 0xFF200064 sebelum membaca input suis daripada 0xFF200060?

2

Bina atur cara permulaan C

14 min

  1. Buka Nios V C IDE for DE1-SoC.

  2. Periksa main.c.

  3. Klik Build ELF (Bina ELF).

  4. Muat naik ke FPGA dengan Upload to FPGA.

  5. Sahkan terminal mencetak Hello from Nios V.

  6. Tukar NSW0, NSW3 dan NSW9; perhatikan output LEDR yang sepadan.

Rekod tiga ujian ringkas. Bagi setiap baris, ramalkan output LEDR dahulu, tukar kawalan NSW dalam paparan papan dan catat hasil yang diperhatikan.

Rekod tiga ujian. Bagi setiap baris, ramalkan output LEDR sebelum menguji, kemudian masukkan output LEDR yang benar-benar dilihat pada papan.

Input yang diuji LEDR dijangka sebelum ujian LEDR diperhatikan pada papan Sepadan dengan ramalan?
3

Baca laluan kod

15 min

Biarkan tab makmal C IDE terbuka. Anda boleh menjawab berdasarkan kod di bawah, yang sama dengan fail main.c yang baru dibina dan diuji.

Tumpukan pada gelung:

*JP1_DIR = 0;
while (1) {
    *LEDS = (*JP1 >> 5) & 0x3FF;
}

Anjakan menggerakkan bit JP1 yang digunakan oleh NSW0..NSW9 ke kedudukan bit 0 hingga 9. Topeng mengekalkan hanya sepuluh bit itu sebelum menulisnya ke daftar LED.

Contohnya, apabila hanya NSW0 hidup, bit JP1 5 ialah 1. Selepas >> 5, nilai itu menjadi bit 0 lalu LEDR0 menyala. Pengecam volatile penting kerana nilai di sebalik JP1 boleh berubah disebabkan perkakasan, bukan penugasan C. Tanpa volatile, pengoptimuman pengkompil boleh menggunakan semula nilai lama atau membuang akses daftar berulang yang kelihatan berlebihan bagi memori biasa.

Jika NSW0 mencapai bit data JP1 5, mengapakah kod menganjak nilai JP1 lima kedudukan ke kanan?

Apakah risiko menulis nilai mentah JP1 terus ke daftar LED tanpa & 0x3FF?

Mengapakah penuding ini mesti volatile? Terangkan dari segi pengoptimuman pengkompil dan daftar perkakasan.

4

Ubah pemetaan

13 min

Gunakan tab C IDE sekali lagi. Jika sesi pertama masih terbuka, gunakan semula; jika telah tamat, bina ELF yang diubah dan muat naik semula. Ubah atur cara supaya LED menunjukkan corak suis yang ditransformasikan, klik Build ELF, muat naik dan uji pada papan.

Pilih satu transformasi:

- Songsangkan sepuluh bit suis sebelum menulis LED.
- Paparkan hanya lima kawalan NSW bawah pada LEDR0..LEDR4.
- Anjak corak NSW satu kedudukan LED ke kiri dan terangkan perkara yang berlaku kepada NSW9.

Hantar gelung C yang diubah dan satu perenggan yang menerangkan transformasi.

Hasil yang boleh diperhatikan mesti sepadan dengan penjelasan. Contohnya, bagi corak songsang, NSW0 yang dimatikan sepatutnya menyalakan LEDR0, manakala NSW0 yang dihidupkan memadamkannya.

Huraikan satu corak suis yang diuji, hasil LED yang dijangka dan perkara yang ditunjukkan oleh papan.

5

Rumusan

5 min

Ringkaskan laluan data lengkap daripada mengklik NSW4 dalam pelayar hingga melihat LEDR4 berubah pada papan.