Teach Pelajaran dengan makmal jarak jauh

Pelajaran Teach

Nios V pada DE1-SoC (4/5): paparan HEX dan pemasa

Bina dan muat naik contoh C Nios V untuk HEX0 dan pemasa sela, kemudian perhatikan tingkah laku HEX0 dan LEDR0 pada perkakasan DE1-SoC.

  • Nios V for DE1-SoC
  • 75 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 persisian paparan dan pemasa pemetaan memori yang disahkan dalam sistem Nios V tetap.

  • Menerangkan sebab paparan tujuh segmen memerlukan corak segmen berkod.

  • Mengkonfigurasi dan meninjau pemasa sela FPGA di 0xFF202000.

  • Membezakan input logik NB0..NB3 melalui JP1/GPIO yang disahkan daripada laluan butang KEY FPGAcademy dalam pelayar yang tidak disokong.

  • Mengumpulkan bukti langsung bagi tingkah laku persisian pada papan DE1-SoC sebenar.

Pratonton aktiviti pelajar

Kandungan aktiviti

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

1

Daripada GPIO kepada persisian

5 min

Dalam pelajaran sebelumnya, anda menggunakan I/O pemetaan memori untuk kawalan ringkas: input NSW pelayar, data GPIO JP1 dan output LEDR. Pelajaran ini mengekalkan idea yang sama tetapi menggunakan dua persisian lebih lengkap yang telah dibina ke dalam sistem FPGA tetap.

Persisian ialah blok perkakasan yang dikawal oleh pemproses Nios V dengan membaca atau menulis alamat tertentu. Anda tidak mengubah reka bentuk FPGA dalam pelajaran ini. Anda akan menggantikan main.c dengan contoh C ringkas, membina fail ELF, memuat naiknya dan menyemak sama ada tingkah laku papan sepadan dengan penerangan pada aras daftar.

Dua contoh wajib ialah:

- hex_counter, yang menulis corak berkod kepada HEX0.
- timer_blink, yang mengkonfigurasi pemasa sela dan menukar LEDR0.

Untuk peta daftar lengkap, gunakan manual FPGAcademy DE1-SoC Computer with Nios V. Aktiviti ini menyediakan subset yang diperlukan: HEX3_HEX0 di 0xFF200020 dan pemasa sela di 0xFF202000.

Subset peta daftar Nios V bagi HEX3_HEX0 dan pemasa sela yang digunakan oleh contoh pembilang HEX dan LED bermasa.

Pelajaran ini menggunakan dua laluan daftar yang disahkan dalam sistem Nios V tetap: output paparan HEX dan pemasaan LED yang dipacu oleh pemasa sela.

Pelayar menunjukkan kawalan butang logik khusus Nios V yang berlabel NB0..NB3. Kawalan ini ialah input JP1/GPIO yang disahkan, bukan daftar KEY FPGAcademy di 0xFF200050.

Untuk kerja wajib dalam pelajaran ini, gunakan contoh HEX dan pemasa di bawah. Bahagian butang pilihan boleh dijalankan secara tersendiri jika ditugaskan: gunakan NB0..NB3 sebagai input logik JP1 dan elakkan istilah KEY0..KEY3.

Anggap sesuatu persisian sedia untuk kursus hanya apabila terdapat bukti langsung bagi profil makmal LabsLand semasa. Sesuatu daftar boleh wujud dalam sistem rujukan tetapi masih tidak sesuai untuk aktiviti jauh jika laluan kawalan pelayar tidak disambungkan kepadanya.

2

Daftar output HEX

22 min

Paparan HEX ialah paparan tujuh segmen. Sesuatu digit tidak ditulis sebagai nombor 3; digit itu ditulis sebagai corak bit yang menghidupkan atau mematikan setiap segmen.

Contoh hex_counter menulis corak segmen kepada HEX3_HEX0 di 0xFF200020.

Setiap bait dalam HEX3_HEX0 mengawal satu paparan. Dalam atur cara permulaan ini, hanya bait rendah digunakan, jadi hanya HEX0 berubah. Nilai seperti 0x3F bukan sekadar nombor sifar; nilai itu ialah corak segmen yang menyalakan segmen yang diperlukan untuk membentuk 0.

Contoh:

- Digit 0 menggunakan corak 0x3F.
- Digit 1 menggunakan corak 0x06.
- Digit A menggunakan corak 0x77.

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

  2. Gantikan kod permulaan dengan kod hex_counter di bawah.

  3. Klik Build ELF (Bina ELF), kemudian muat naik dengan Upload to FPGA.

  4. Perhatikan HEX0 dalam paparan papan untuk sekurang-kurangnya dua digit berbeza.

  5. Rekod sama ada HEX0 berubah mengikut nilai perenambelasan.

Gunakan kod ini untuk hex_counter:

Pilih seluruh blok kod sebelum menyalinnya ke dalam main.c; gantikan keseluruhan kod permulaan.

/* Komputer DE1-SoC dengan Nios V — I/O pemetaan memori */
volatile int *HEX3_HEX0 = (int *) 0xFF200020;  /* 7 segmen HEX3..HEX0 */

static const unsigned char HEX_CODE[16] = {
    0x3F, 0x06, 0x5B, 0x4F,
    0x66, 0x6D, 0x7D, 0x07,
    0x7F, 0x67, 0x77, 0x7C,
    0x39, 0x5E, 0x79, 0x71
};

static void delay(void)
{
    volatile int i;
    for (i = 0; i < 2000000; i++) {
    }
}

int main(void)
{
    int count = 0;

    while (1) {
        *HEX3_HEX0 = HEX_CODE[count & 0xF];
        count++;
        delay();
    }
    return 0;
}

Gunakan jadual untuk merekod perkara yang anda lihat selepas memuat naik hex_counter. Tingkah laku yang dijangka telah diisi. Masukkan dua digit atau corak HEX0 berbeza yang dilihat, kemudian pilih lulus, gagal atau tidak pasti dalam lajur hasil.

Rekod satu semakan HEX0 daripada papan langsung. Kekalkan tingkah laku yang dijangka melainkan pengajar meminta ujian lain; masukkan dua digit atau corak yang dilihat, kemudian pilih lulus, gagal atau tidak pasti.

Tingkah laku yang dijangka Digit atau corak pertama dilihat Digit atau corak kedua dilihat Hasil

Mengapakah contoh ini menggunakan jadual carian corak segmen dan bukannya menulis nilai integer 0, 1, 2 dan seterusnya secara langsung kepada daftar HEX?

3

Pemasa sela

22 min

Contoh timer_blink memprogram pemasa sela FPGA pada alamat pangkalan 0xFF202000. Kod ini menetapkan tempoh, memulakan pemasa, meninjau bit tamat tempoh, mengosongkan bit itu dan menukar LEDR0.

Jam pemasa ialah 100 MHz, jadi 50,000,000 detik jam bersamaan dengan kira-kira setengah saat. Tempoh 32 bit dibahagikan kepada dua daftar 16 bit kerana antara muka pemasa menyimpan bahagian rendah dan tinggi secara berasingan.

Daftar pemasa yang digunakan:

- STATUS pada ofset +0x0: bit 0, TO, menjadi 1 apabila tempoh tamat.
- CONTROL pada ofset +0x4: STOP, START dan CONT mengawal sama ada pemasa berjalan secara berterusan.
- PERIOD_LO pada ofset +0x8: 16 bit rendah tempoh.
- PERIOD_HI pada ofset +0xC: 16 bit tinggi tempoh.

  1. Gantikan kod C dengan kod timer_blink di bawah.

  2. Klik Build ELF (Bina ELF), kemudian muat naik dengan Upload to FPGA.

  3. Perhatikan LEDR0 selama sekurang-kurangnya 10 saat.

  4. Rekod sekurang-kurangnya dua saat apabila keadaan LED berubah.

  5. Anggarkan sama ada kelipan itu cukup stabil untuk digunakan sebagai sumber pemasaan.

Gunakan kod ini untuk timer_blink:

Pilih seluruh blok kod sebelum menyalinnya ke dalam main.c; gantikan keseluruhan kod sebelumnya.

/* Komputer DE1-SoC dengan Nios V — I/O pemetaan memori */
volatile int *LEDS = (int *) 0xFF200000;  /* LED merah */

#define TIMER_BASE      0xFF202000
#define TIMER_STATUS    (*(volatile short *)(TIMER_BASE + 0x0))
#define TIMER_CONTROL   (*(volatile short *)(TIMER_BASE + 0x4))
#define TIMER_PERIOD_LO (*(volatile short *)(TIMER_BASE + 0x8))
#define TIMER_PERIOD_HI (*(volatile short *)(TIMER_BASE + 0xC))

#define TIMER_TO        0x1
#define TIMER_CONT      0x2
#define TIMER_START     0x4
#define TIMER_STOP      0x8

int main(void)
{
    const unsigned int half_second = 50000000u;  /* jam pemasa 100 MHz */
    int led = 0;

    TIMER_CONTROL = TIMER_STOP;
    TIMER_PERIOD_LO = (short)(half_second & 0xFFFFu);
    TIMER_PERIOD_HI = (short)((half_second >> 16) & 0xFFFFu);
    TIMER_STATUS = 0;  /* kosongkan TO */
    TIMER_CONTROL = TIMER_CONT | TIMER_START;

    while (1) {
        if ((TIMER_STATUS & TIMER_TO) != 0) {
            TIMER_STATUS = 0;  /* kosongkan TO */
            led ^= 1;
            *LEDS = led;
        }
    }
    return 0;
}

Gunakan jadual untuk merekod kelipan yang dipacu oleh pemasa. Kekalkan tetingkap 10 saat melainkan pengajar meminta ujian lebih panjang. Dalam lajur bukti, tulis perubahan yang dilihat, contohnya padam -> hidup -> padam, kemudian pilih lulus, gagal atau tidak pasti.

Rekod satu pemerhatian pemasa. Gunakan tetingkap 10 saat, huraikan perubahan keadaan LEDR0 yang dilihat, kemudian pilih lulus, gagal atau tidak pasti.

Tetingkap pemerhatian (s) Perubahan keadaan LEDR0 yang dilihat Tingkah laku yang dijangka Hasil

Bagaimanakah kelipan yang dipacu pemasa ini berbeza daripada gelung lengah perisian? Nyatakan daftar tempoh pemasa, bit tamat tempoh dan satu sebab pemasa perkakasan berguna dalam perisian terbenam.

4

Ubah suai kecil pada persisian

18 min

Pilih satu contoh yang disahkan dan buat perubahan kecil yang boleh diperhatikan.

Contoh:

- Dalam hex_counter, ubah urutan paparan supaya hanya mengira nilai perenambelasan genap.
- Dalam hex_counter, kawal dua digit HEX dan bukannya HEX0 sahaja.
- Dalam timer_blink, ubah tempoh pemasa supaya LEDR0 berkelip lebih cepat atau lebih perlahan.
- Dalam timer_blink, tukar bit LED yang berlainan.
- Kerja butang pilihan: baca bit 0 hingga 3 JP1 daripada NB0..NB3 dan paparkannya pada LEDR0..LEDR3.

  1. Pilih contoh HEX atau pemasa.

  2. Buat satu perubahan kecil pada kod.

  3. Bina dan muat naik fail ELF.

  4. Perhatikan papan dan rekod cara tingkah laku berubah.

Serahkan baris kod yang diubah dan kenal pasti daftar pemetaan memori yang dipengaruhi oleh setiap baris itu.

Pastikan ubah suai cukup kecil untuk disahkan dalam satu sesi papan. Penyerahan yang baik mengubah satu tingkah laku dan boleh disemak melalui satu atau dua pemerhatian.

Serahkan catatan pemerhatian yang ringkas: perkara yang berubah, perkara yang anda jangka dan perkara yang ditunjukkan oleh papan langsung.

5

Pilihan: butang logik NB

Butang logik NB0..NB3 telah disahkan melalui bit 0 hingga 3 daftar data JP1. Butang ini berguna untuk latihan tinjauan ringkas, tetapi bukan port KEY3..KEY0 FPGAcademy.

Corak C minimum:

volatile int *LEDS = (int *) 0xFF200000;
volatile int *JP1 = (int *) 0xFF200060;
volatile int *JP1_DIR = (int *) 0xFF200064;

*JP1_DIR = 0;
while (1) {
    *LEDS = (*JP1) & 0xF;   // NB0..NB3 -> LEDR0..LEDR3
}

Mengapakah latihan pilihan ini membaca bit 0 hingga 3 JP1 dan bukannya daftar KEY FPGAcademy di 0xFF200050?

Jika anda menjalankan latihan butang pilihan, rekod satu butang NB yang diklik dan bit LED yang berubah.

6

Sediakan projek kemuncak

8 min

Projek kemuncak mesti menggunakan NSW0..NSW9 dan LEDR0..LEDR9, serta sekurang-kurangnya satu persisian tambahan yang disahkan dalam pelajaran ini.

Persisian tambahan manakah yang paling mungkin anda gunakan dalam projek kemuncak?

Huraikan satu tingkah laku projek kemuncak yang menggabungkan NSW/LEDR dengan persisian tambahan yang dipilih. Sertakan alamat daftar yang anda jangka akan digunakan.