Teach Pelajaran dengan makmal jarak jauh

Pelajaran Teach

Logik digital pada DE1-SoC (6/6): projek kemuncak FSM — mesin layan diri

Reka bentuk, sintesis dan kembangkan FSM mesin layan diri pada DE1-SoC sambil menguji syiling, set semula, pengeluaran barang, baki dan kredit pada paparan.

  • Altera DE1-SoC
  • 75 min
  • Prasiswazah pengenalan
  • ms-MY
  • Digital systems & FPGA
Altera DE1-SoC
Altera DE1-SoC

Hasil pembelajaran

  • Mereka bentuk dan mengembangkan mesin keadaan terhingga yang bukan remeh pada perkakasan sebenar.

  • Membina pengawal mesin layan diri yang keadaannya mewakili kredit terkumpul.

  • Menambah ciri melalui pusat pemeriksaan berpandu: pemulangan baki, pemilihan barangan dan paparan perpuluhan.

  • Menaakul bilangan keadaan dan bilangan flip-flop yang diperlukan.

Pratonton aktiviti pelajar

Kandungan aktiviti

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

1

Daripada pengesan kepada pengawal: FSM yang mengingati wang anda

8 min

Dalam Pelajaran 5, anda membina mesin keadaan terhingga yang keadaannya merupakan kedudukan abstrak dalam pengecam: lampu isyarat yang bergerak melalui hijau → kuning → merah dan pengesan jujukan 1011 yang mengingati setakat mana corak itu telah dilihat. Dalam projek kemuncak ini, keadaan mewakili sesuatu yang nyata dan fizikal: jumlah wang yang telah dimasukkan setakat ini. Anda akan membina pengawal mesin layan diri yang kecil, kemudian mengembangkannya satu ciri pada satu masa.

Ingat bahawa mesin keadaan terhingga mempunyai tiga bahagian: satu set keadaan, peraturan untuk keadaan seterusnya berdasarkan keadaan semasa dan input, serta output yang bergantung pada keadaan — dan dalam mesin Mealy, turut bergantung pada input. Kemahiran baharu dalam pelajaran ini ialah reka bentuk: mula-mula tentukan keadaan yang diperlukan dan lukis jadual peralihan; hanya selepas itu tulis Verilog.

Bagi mesin yang menerima syiling, pilihan yang semula jadi ialah menjadikan setiap keadaan mewakili satu aras kredit. Jika mesin menerima syiling 5 sen dan 10 sen serta mengeluarkan barang apabila kredit mencapai 15 sen, kreditnya boleh menjadi 0, 5, 10 atau 15 sen — empat keadaan. Kita namakan keadaan ini S0, S5, S10 dan S15. Memasukkan syiling membawa mesin ke keadaan kredit yang lebih tinggi; mencapai harga akan mengeluarkan barang dan mengembalikan mesin ke S0.

Isyarat papan adalah seperti biasa. Oleh sebab ini ialah reka bentuk berjujukan yang dipacu jam, modul ini mengisytiharkan jamnya sendiri: templat lalai leds_mirror.v tidak mempunyai jam, jadi kita menambah input CLOCK_50;. Seperti dalam Pelajaran 5, suis yang dinaikkan bernilai 1; KEY aktif rendah, jadi butang yang ditekan bernilai 0; LEDR aktif tinggi; dan HEX0HEX5 ialah paparan tujuh segmen aktif rendah.

Rajah keadaan kredit mesin layan diri. Empat keadaan, S0 dengan 0 sen, S5 dengan 5, S10 dengan 10 dan S15 dengan 15, tersusun dari kiri ke kanan. Syiling 5 sen pada SW0 bergerak satu keadaan; syiling 10 sen pada SW1 bergerak dua keadaan. Mencapai 15 sen mengeluarkan barang dan kembali ke S0; syiling 10 sen pada S10 mencapai 20 sen, turut mengeluarkan barang dan kembali ke S0 sambil memulangkan baki. Anak panah biru menunjukkan dua laluan pengeluaran barang.

Mesin layan diri sebagai rajah keadaan kredit. Syiling 5 sen, SW[0], bergerak satu keadaan; syiling 10 sen, SW[1], bergerak dua keadaan. Mencapai harga mengaktifkan output pengeluaran barang dan kembali ke S0; KEY[0] menetapkan semula mana-mana keadaan kepada S0. Pusat pemeriksaan berikutnya menambah output kedua untuk memulangkan baki dan keadaan tambahan untuk pemilihan barangan.

Mesin asas menggunakan empat keadaan berasingan: S0, S5, S10, S15. Mengapakah mesin memerlukan keadaan yang berlainan untuk setiap aras kredit? Apakah yang *tidak* dapat dilakukannya jika hanya mempunyai satu keadaan?

LEDR[7], pengeluaran barang, disimpan dan kekal menyala sehingga anda menekan KEY[0]. Selepas barang dikeluarkan dan mesin kembali ke S0, apakah yang mengosongkan nilai simpanan ini? Apakah masalah yang akan berlaku jika tiada apa-apa mengosongkannya?

2

Latihan 3-C: FSM mesin layan diri

14 min

Ini ialah reka bentuk permulaan anda. Baca reka bentuk ini sebagai FSM dalam tiga blok yang kini sudah biasa: pembahagi jam supaya syiling boleh dimasukkan pada kadar yang sesuai untuk manusia; blok gabungan keadaan seterusnya dan output; serta daftar keadaan dipacu jam dengan set semula tak segerak aktif rendah. Lengkapkan penanda TODO_* sebelum menjalankan sintesis.

Keadaan. S0, S5, S10, S15 ialah empat aras kredit yang dikodkan sebagai nilai 2 bit, 0..3. Kredit semasa dalam sen diperoleh daripada keadaan dan ditunjukkan dalam dua cara: pada LEDR[3:0] sebagai nombor perduaan dalam sen dan pada HEX0 sebagai satu aksara, iaitu 0 untuk 0 sen, 5 untuk 5, A untuk 10 dan F untuk 15. Ini hanyalah digit perenambelasan bernilai 0, 5, 10 dan 15.

Peralihan — inilah jadual yang akan anda lukis dahulu semasa mereka bentuk:

Ringkasan peralihan:

- S0, 0 sen: syiling 5 sen -> S5; syiling 10 sen -> S10; tidak mengeluarkan barang.
- S5, 5 sen: syiling 5 sen -> S10; syiling 10 sen -> S15; tidak mengeluarkan barang.
- S10, 10 sen: syiling 5 sen -> S15; syiling 10 sen -> S0 dan keluarkan barang apabila mencapai 20 sen, tanpa baki dalam versi asas.
- S15, 15 sen: pada detik berikutnya -> S0 dan keluarkan barang, tanpa mengira input.

Dua butiran perlu diberi perhatian. Dalam S10, memasukkan syiling 10 sen mencapai 20 sen — melebihi harga 15 sen — jadi mesin mengeluarkan barang dan kembali ke S0, tetapi versi asas ini tidak memulangkan baki. Pusat pemeriksaan seterusnya membetulkannya. Selain itu, S15 ialah keadaan “keluarkan barang dan set semula”: pada detik berikutnya, ia mengaktifkan dispense dan kembali ke S0 tanpa mengira input. Oleh itu, apabila jumlah syiling tepat 15 sen, anda akan melihat kredit mencapai F; pada detik berikutnya, barang dikeluarkan.

Output pengeluaran barang disimpan. dispense ialah isyarat satu denyut. Seperti pengesan dalam Pelajaran 5, denyut tunggal mudah terlepas pada kamera jauh. Oleh itu, kita menyimpannya dalam dispense_latch, memacu LEDR[7] dengan nilai itu dan mengosongkannya hanya semasa set semula. Selepas barang dikeluarkan, LEDR[7] kekal menyala sehingga anda menekan KEY[0].

Memasukkan syiling — pemasaan. Pembahagi menggunakan DIV = 16,666,666, jadi slow_clk bertukar kira-kira setiap 0.33 s. Untuk memasukkan syiling, naikkan satu suis, tunggu satu detik jam perlahan, kira-kira satu pertiga saat, kemudian turunkannya kembali kepada 0. Membiarkan suis dinaikkan selama beberapa detik akan dikira sebagai beberapa syiling. Masukkan satu syiling pada satu-satu masa.

// Pelajaran 6 - Latihan 3-C: modul permulaan FSM mesin layan diri
// Lengkapkan peralihan kredit, simpanan pengeluaran barang dan logik output sebelum sintesis.
module leds_mirror(CLOCK_50, SW, KEY, LEDR, HEX0);
    input        CLOCK_50;
    input  [9:0] SW;
    input  [3:0] KEY;
    output [9:0] LEDR;
    output [6:0] HEX0;

    localparam S0 = 2'd0, S5 = 2'd1, S10 = 2'd2, S15 = 2'd3;
    localparam [24:0] DIV = 25'd16_666_666;
    reg [24:0] div;
    reg        slow_clk;
    always @(posedge CLOCK_50) begin
        if (!KEY[0]) begin div <= 0; slow_clk <= 0; end
        else if (div == DIV) begin div <= 0; slow_clk <= ~slow_clk; end
        else div <= div + 1'b1;
    end

    wire nickel = SW[0];
    wire dime   = SW[1];
    reg [1:0] state, next_state;
    reg       dispense_latch;

    always @(posedge slow_clk or negedge KEY[0]) begin
        if (!KEY[0]) begin
            state <= S0;
            dispense_latch <= 1'b0;
        end else begin
            state <= next_state;
            if (TODO_DISPENSE_CONDITION) dispense_latch <= 1'b1;
        end
    end

    always @(*) begin
        case (state)
            S0:  next_state = TODO_FROM_S0;
            S5:  next_state = TODO_FROM_S5;
            S10: next_state = TODO_FROM_S10;
            S15: next_state = TODO_FROM_S15;
            default: next_state = S0;
        endcase
    end

    assign LEDR[3:0] = TODO_CREDIT_LEDS;
    assign LEDR[6:4] = 3'b000;
    assign LEDR[7]   = TODO_DISPENSE_LED;
    assign LEDR[9:8] = 2'b00;
    assign HEX0      = TODO_CREDIT_HEX_PATTERN;
endmodule

Bermula dari S0, ramalkan sebelum menjalankannya: apakah jujukan aksara yang akan muncul pada HEX0, dan bilakah LEDR[7], pengeluaran barang, akan menyala jika anda memasukkan satu syiling 10 sen diikuti satu syiling 5 sen, satu syiling bagi setiap detik?

3

Jalankan mesin: syiling, pengeluaran barang dan set semula

14 min

Bina pengawal pada papan sebenar, masukkan syiling melalui dua laluan berbeza dan sahkan bahawa LED pengeluaran barang kekal menyala.

  1. Buka makmal Verilog DE1-SoC. Editor memaparkan fail leds_mirror.v.

  2. Pilih semua kandungan leds_mirror.v dan gantikannya dengan modul di atas. Kekalkan nama leds_mirror. Perhatikan bahawa modul mengisytiharkan input CLOCK_50;: templat tidak menambah jam secara automatik.

  3. Pilih Jalankan sintesis (Synthesize). Jika lawatan berpandu menutupi butang, tutup atau langkau lawatan itu. Tunggu 1 hingga 3 minit, betulkan sebarang kesilapan menaip dan jalankan sintesis sekali lagi. Teruskan hanya apabila kompilasi selesai dengan 0 ralat.

  4. Pilih Muat naik ke FPGA (Upload to FPGA) dan tunggu sehingga papan langsung serta kamera tersedia.

  5. Tekan dan lepaskan KEY[0] untuk menetapkan semula. HEX0 sepatutnya menunjukkan 0 dan LEDR[7] sepatutnya padam.

  6. Tiga syiling 5 sen. Naikkan SW[0], tunggu kira-kira satu pertiga saat untuk satu detik, kemudian turunkan SW[0]. HEX0 berubah kepada 5. Ulangi untuk mencapai A, 10 sen, dan sekali lagi untuk mencapai F, 15 sen. Pada detik berikutnya, barang dikeluarkan: LEDR[7] menyala dan HEX0 kembali kepada 0. LEDR[7] kekal menyala.

  7. Tekan KEY[0] untuk menetapkan semula: LEDR[7] padam dan HEX0 menunjukkan 0.

  8. Syiling 5 + syiling 5 + syiling 10 sen. Masukkan dua syiling 5 sen (HEX0: 05A), kemudian masukkan satu syiling 10 sen pada SW[1]. Dari S10, syiling 10 sen mencapai 20 sen, jadi mesin mengeluarkan barang dengan serta-merta dan kembali ke S0. LEDR[7] menyala.

  9. Tekan KEY[0] untuk menetapkan semula sebelum pusat pemeriksaan seterusnya.

Tetapkan semula dahulu. Masukkan satu syiling bagi setiap detik dan, selepas setiap syiling, catat aksara pada HEX0 yang menunjukkan kredit serta sama ada LEDR[7], pengeluaran barang, menyala. Lakukan laluan tiga syiling 5 sen dahulu, kemudian tetapkan semula dan lakukan laluan dua syiling 5 sen diikuti satu syiling 10 sen.

Syiling dimasukkan Kredit pada HEX0 (0/5/A/F) LEDR[7] keluarkan barang? (ya/tidak)

Muat naik bukti anda. Selepas tiga syiling 5 sen menyebabkan mesin mengeluarkan barang, ambil tangkapan skrin kamera dengan LEDR[7] menyala dan lampirkannya di bawah.

Apabila kredit mencapai 15 sen dan HEX0 menunjukkan F, barang tidak dikeluarkan pada detik yang sama — barang dikeluarkan pada detik berikutnya. Berdasarkan kes S15 dalam kod, terangkan sebabnya dalam satu ayat.

Dalam reka bentuk asas, memasukkan syiling 10 sen dari S10 mencapai 20 sen dan mengeluarkan barang, tetapi pelanggan kehilangan 5 sen. Output apakah yang perlu anda tambah untuk membetulkannya, dan dalam satu-satunya kes manakah output itu digunakan?

4

Pusat pemeriksaan 3-C1 (wajib): tambah pemulangan baki

12 min

Pengembangan pertama anda membetulkan kes tidak adil yang baru dikenal pasti. Apabila mesin mencapai 20 sen — satu-satunya laluan bayaran berlebihan, iaitu S10 diikuti syiling 10 sen — mesin perlu menyalakan LED kedua, LEDR[6], yang bermaksud “pulangkan baki 5 sen”, di samping mengeluarkan barang pada LEDR[7]. Semua pengeluaran barang lain, tepat pada 15 sen, tidak memulangkan baki.

Ini ialah perubahan kecil dan tepat pada FSM. Anda memerlukan output tersimpan kedua, change_latch, yang memacu LEDR[6] dan ditetapkan apabila mesin mengeluarkan barang *melalui laluan 20 sen*. Cara paling kemas ialah menambah isyarat gabungan change di sebelah dispense, menegaskannya hanya dalam cabang S10 + syiling 10 sen, dan menyimpannya dengan cara yang sama seperti dispensed_latch.

Inilah tingkah laku yang dijangka selepas perubahan anda:

Tingkah laku pusat pemeriksaan yang dijangka:

- Tiga syiling 5 sen (5+5+5): kredit mencapai 15 sen; LEDR[7], pengeluaran barang = ya; LEDR[6], baki = tidak; kembali ke S0.
- Syiling 5 + syiling 10 sen (5+10): kredit mencapai 15 sen; LEDR[7], pengeluaran barang = ya; LEDR[6], baki = tidak; kembali ke S0.
- Syiling 10 + syiling 5 sen (10+5): kredit mencapai 15 sen; LEDR[7], pengeluaran barang = ya; LEDR[6], baki = tidak; kembali ke S0.
- Syiling 5 + syiling 5 + syiling 10 sen (5+5+10): kredit mencapai 20 sen; LEDR[7], pengeluaran barang = ya; LEDR[6], baki = ya; kembali ke S0.
- Dua syiling 10 sen (10+10): kredit mencapai 20 sen; LEDR[7], pengeluaran barang = ya; LEDR[6], baki = ya; kembali ke S0.

Laksanakan perubahan itu, kemudian sahkan pada papan bahawa LEDR[6] menyala hanya pada laluan 20 sen dan tidak pernah menyala pada laluan tepat 15 sen.

  1. Edit modul mesin layan diri anda untuk menambah output pemulangan baki: LEDR[6] tersimpan yang menyala hanya apabila mesin mengeluarkan barang melalui laluan 20 sen, S10 + syiling 10 sen, bersama output pengeluaran barang sedia ada pada LEDR[7].

  2. Pilih Jalankan sintesis (Synthesize), betulkan sebarang kesilapan menaip dan pilih Muat naik ke FPGA (Upload to FPGA).

  3. Tetapkan semula. Lakukan laluan tepat 15 sen, contohnya tiga syiling 5 sen: sahkan LEDR[7] menyala dan LEDR[6] kekal padam.

  4. Tetapkan semula. Lakukan laluan 20 sen, sama ada dua syiling 5 sen diikuti syiling 10 sen atau dua syiling 10 sen: sahkan kedua-dua LEDR[7] dan LEDR[6] menyala.

Selepas perubahan 3-C1, jalankan setiap laluan dan baca kedua-dua LED output. Catat sama ada LEDR[7], pengeluaran barang, dan LEDR[6], baki, menyala pada penghujung setiap laluan.

Laluan syiling Kredit dicapai (15/20 sen) LEDR[7] keluarkan barang? (ya/tidak) LEDR[6] pulangkan baki? (ya/tidak)

Muat naik bukti anda. Pada laluan 20 sen, contohnya dua syiling 5 sen diikuti satu syiling 10 sen, ambil tangkapan skrin kamera yang menunjukkan kedua-dua LEDR[7], pengeluaran barang, dan LEDR[6], baki, menyala, kemudian lampirkannya di bawah.

Tangkap kod makmal anda. Simpan leds_mirror.v yang telah diubah suai dalam makmal, kemudian gunakan kawalan bukti kod di bawah untuk menyerahkan versi pusat pemeriksaan 3-C1 dengan pemulangan baki. Jika guru meminta rajah keadaan, serahkannya secara berasingan.

Dalam FSM yang anda ubah suai, dalam kes keadaan dan input yang tepat manakah output baki, LEDR[6], ditegaskan? Mengapakah itu satu-satunya kes bayaran berlebihan dalam mesin ini?

5

Pusat pemeriksaan 3-C2 (pilihan / bonus): pemilihan barangan

8 min

Pusat pemeriksaan bonus ini menjadikan mesin menjual dua barangan: minuman ringan berharga 15 sen, dipilih dengan SW[2], dan kopi berharga 20 sen, dipilih dengan SW[3]. Mesin mesti mengeluarkan barang hanya apabila kredit mencapai harga barangan yang dipilih — bagi minuman ringan, barang dikeluarkan pada 15 sen; bagi kopi, mesin menunggu hingga 20 sen.

Idea pentingnya ialah perubahan ini memperbesar ruang keadaan. Mesin tidak lagi boleh diterangkan melalui kredit sahaja kerana tingkah lakunya pada, misalnya, 15 sen kini bergantung pada *barangan yang dipilih*: keluarkan minuman ringan, tetapi terus menunggu untuk kopi. Mesin perlu mengingati kedua-dua kredit dan pilihan. Gabungkan kedua-duanya — contohnya satu keadaan ialah pasangan *(barangan dipilih, aras kredit)* — kemudian tentukan gabungan yang benar-benar boleh berlaku dan tindakan bagi setiap gabungan.

Lukis dahulu rajah keadaan yang diperbesar, tentukan bilangan keadaan yang benar-benar diperlukan, kemudian laksanakannya. Tiada satu pengekodan yang “betul”, tetapi terdapat bilangan minimum keadaan berbeza yang diperlukan oleh tingkah laku tersebut dan, daripada itu, bilangan minimum flip-flop.

(Bonus) Serahkan reka bentuk anda. Lampirkan rajah keadaan yang diperbesar untuk mesin dua barangan dan tampal Verilog yang diubah suai, atau lampirkan kod sebagai fail .txt.

(Bonus) Berapakah bilangan keadaan berbeza yang diperlukan oleh mesin dua barangan anda dan, oleh itu, berapakah bilangan minimum flip-flop yang diperlukan? Ingat bahawa bilangan minimum flip-flop untuk mengekod N keadaan ialah ceil(log2(N)). Nyatakan N anda, tunjukkan pengiraan ceil(log2(N)) dan berikan justifikasi ringkas bagi bilangan keadaan itu.

6

Pusat pemeriksaan 3-C3 (pilihan / bonus): paparan perpuluhan dua digit

7 min

Mesin asas menunjukkan kredit sebagai satu aksara perenambelasan, 0, 5, A atau F. Cara ini ringkas, tetapi bukan cara mesin sebenar memaparkan wang. Pusat pemeriksaan bonus ini menunjukkan kredit sebagai nombor perpuluhan dua digit pada HEX1:HEX000, 05, 10, 15 dan, dengan laluan 3-C1 / 3-C2, 20. HEX0 menunjukkan digit sa dan HEX1 menunjukkan digit puluh.

Ini menggunakan semula idea penyahkod tujuh segmen daripada Pelajaran 2: fungsi seg yang memetakan satu digit perpuluhan 0..9 kepada pola segmen aktif rendah {g,f,e,d,c,b,a}. Pisahkan kredit kepada digit puluh dan sa, nyahkod setiap satu, kemudian pacu HEX1 dan HEX0. Ingat untuk menambah output [6:0] HEX1; pada senarai port modul — templat lalai hanya menyediakan HEX0, jadi HEX1 mesti diisytiharkan, sama seperti yang anda lakukan untuk penyahkod dua digit dalam Pelajaran 2.

Anda hanya memerlukan fungsi perpuluhan seg, dalam bentuk yang sama seperti Pelajaran 2, serta pemisahan nilai kredit yang benar-benar digunakan, iaitu 0, 5, 10, 15 dan 20:

output [6:0] HEX1;                 // tambah pada senarai port (digit puluh)
// ...
function [6:0] seg;                // digit perpuluhan 0..9 -> segmen aktif rendah
    input [3:0] d;
    case (d)
        4'd0: seg = 7'b1000000;
        4'd1: seg = TODO_SEGMENT_PATTERN_1;
        4'd2: seg = TODO_SEGMENT_PATTERN_2;
        // Teruskan 3..9, kemudian padam paparan bagi default.
        default: seg = 7'b1111111;
    endcase
endfunction

wire [4:0] price  = 5'd15;
wire [4:0] credit = TODO_CURRENT_CREDIT_VALUE;
wire [4:0] change = TODO_CHANGE_VALUE;
wire [3:0] tens   = TODO_TENS_DIGIT;
wire [3:0] ones   = TODO_ONES_DIGIT;
assign HEX0 = seg(ones);
assign HEX1 = seg(tens);
  1. (Bonus) Edit modul mesin layan diri anda: tambah output [6:0] HEX1; pada senarai port, tambah penyahkod perpuluhan seg, pisahkan kredit kepada digit puluh dan sa, kemudian pacu HEX1:HEX0.

  2. Pilih Jalankan sintesis (Synthesize), betulkan sebarang kesilapan menaip dan pilih Muat naik ke FPGA (Upload to FPGA).

  3. Tetapkan semula dan masukkan syiling. Sahkan HEX1:HEX0 menunjukkan 00, 05, 10, 15 dan 20 pada laluan bayaran berlebihan apabila kredit meningkat.

(Bonus) Muat naik bukti anda. Ambil tangkapan skrin kamera yang menunjukkan kredit perpuluhan dua digit pada HEX1:HEX0, contohnya 10 atau 15, kemudian lampirkannya di bawah.

(Bonus) Bagi kredit 15 sen, apakah digit puluh dan digit sa yang dikira oleh penyahkod, iaitu nilai yang memacu HEX1 dan HEX0, dan paparan manakah menunjukkan 5?

7

Penutup projek kemuncak: binaan anda sepanjang kursus

12 min

Kini anda telah membina pada perkakasan sebenar satu laluan lengkap melalui logik digital:

- Get logik (Pelajaran 1): AND, OR, NOT, NAND, NOR dan XOR — unsur asas setiap litar — serta idea bahawa Verilog *menerangkan perkakasan*, bukannya berjalan seperti atur cara.
- Reka bentuk gabungan dan peminimuman (Pelajaran 2): jadual kebenaran, hasil tambah sebutan darab, hasil darab sebutan tambah, peta Karnaugh dan pemultipleks — menukarkan spesifikasi kepada litar *paling ringkas* yang memenuhinya.
- Ingatan (Pelajaran 3): flip-flop dan daftar muatan selari — saat litar memperoleh keupayaan untuk *mengingati*.
- Pembilang dan daftar anjak (Pelajaran 4): blok berjujukan yang dipacu melalui pembahagi jam, bersama disiplin menyemak bahawa pemalar muat dalam daftar dan susunan bit sepadan dengan perkara yang anda lihat.
- Mesin keadaan terhingga (Pelajaran 5): mesin Moore dan Mealy — lampu isyarat dan pengesan jujukan — yang bertindak berdasarkan keadaan yang diingati.
- Projek kemuncak FSM (pelajaran ini): pengawal mesin layan diri yang anda *reka bentuk* daripada jadual peralihan, kemudian *kembangkan* — pemulangan baki, pemilihan barangan dan paparan perpuluhan — sambil menaakul bilangan keadaan dan flip-flop.

Itulah teras kursus pengenalan logik digital, dan anda menjalankan setiap bahagiannya pada FPGA sebenar.

Arah seterusnya. Berikut beberapa arah pilihan jika anda mahu meneruskan:

- Pemasaan — setup dan hold. Flip-flop sebenar memerlukan inputnya stabil dalam tetingkap masa yang singkat di sekitar pinggir jam. Mematuhi masa *setup* dan *hold* membolehkan reka bentuk berjalan pada frekuensi jam sasaran dan membuka jalan kepada analisis pemasaan statik.
- Aritmetik dan ALU. Gabungkan penambah, pembanding dan logik menjadi unit aritmetik-logik, iaitu teras pengiraan sesebuah pemproses.
- Saluran paip. Bahagikan laluan gabungan yang panjang kepada peringkat berjam untuk meningkatkan daya pemprosesan, satu teknik utama dalam perkakasan pantas.
- HDL lain dan simulasi. SystemVerilog dan VHDL melanjutkan perkara yang telah anda pelajari; *simulasi*, dengan bangku uji dan bentuk gelombang, membolehkan reka bentuk disahkan sebelum digunakan pada papan.

Bacaan lanjut pilihan. Kursus percuma [FPGA Academy](https://fpgacademy.org/courses.html) membincangkan keluarga DE1-SoC yang sama dengan mendalam, dan Harris & Harris, *Digital Design and Computer Architecture*, bab 1–3, ialah teks yang sangat baik untuk bahan daripada get logik hingga FSM yang baru anda pelajari. Kedua-duanya tidak diwajibkan — rujuk jika anda mahu meneroka lebih lanjut.

Dalam beberapa ayat, jejak perkembangan idea *ingatan* sepanjang kursus: daripada satu flip-flop dalam Pelajaran 3, kepada daftar dan pembilang dalam Pelajaran 3–4, kemudian kepada mesin keadaan terhingga yang keadaannya membawa makna dalam Pelajaran 5–6. Apakah yang dapat dilakukan oleh litar selepas ingatan ditambah yang tidak dapat dilakukan oleh get gabungan semata-mata?

Dalam tiga ayat, rumuskan projek kemuncak anda: (1) perkara yang diwakili oleh *keadaan* mesin layan diri dan cara syiling mengubahnya, (2) satu ciri yang anda tambah dalam pusat pemeriksaan serta bukti yang anda rakam, dan (3) satu keadaan apabila tingkah laku aktif rendah atau output tersimpan penting untuk melihat hasil pada kamera.