Teach Pelajaran dengan makmal jarak jauh

Pelajaran Teach

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

Bina FSM mesin layan diri dalam VHDL, uji laluan kredit pada perkakasan dan cuba pusat pemeriksaan pilihan jika masa mengizinkan.

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

Hasil pembelajaran

  • Menjalankan dan menerangkan mesin keadaan terhingga yang bukan remeh pada perkakasan sebenar.

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

  • Mengenal pemulangan baki, pemilihan barangan dan paparan perpuluhan sebagai pusat pemeriksaan pilihan yang berperingkat.

  • Menerangkan sebab reka bentuk asas perlu mengingati keadaan kredit dan, jika mencuba 3-C2, menaakul bilangan keadaan serta flip-flop.

Pratonton aktiviti pelajar

Kandungan aktiviti

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

1

Daripada lampu isyarat kepada pengawal: FSM yang mengingati wang anda

8 min

Dalam Pelajaran 5, anda membina mesin keadaan terhingga yang keadaannya merupakan kedudukan abstrak dalam satu kitaran: lampu isyarat yang bergerak daripada hijau kepada kuning, kemudian merah. Jika anda mencuba pengesan pilihan, anda turut melihat keadaan mengingati sebahagian daripada corak. 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; pusat pemeriksaan pilihan membolehkan anda 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 VHDL.

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, entiti ini mengisytiharkan jamnya sendiri: templat lalai blink.vhd tidak mempunyai jam, jadi kita menambah CLOCK_50 : in std_logic. 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 SW(0) bergerak satu keadaan; syiling 10 sen pada SW(1) bergerak dua keadaan. Laluan harga tepat memasuki S15 dahulu; pada detik berikutnya, S15 mengeluarkan barang dan kembali ke S0. Dari S10, syiling 10 sen mencapai 20 sen, mengeluarkan barang serta-merta dan kembali ke S0.

Mesin layan diri sebagai rajah keadaan kredit. Setiap keadaan mewakili aras kredit. Syiling 5 sen, SW(0), bergerak satu keadaan; syiling 10 sen, SW(1), bergerak dua keadaan. Laluan harga tepat memasuki S15 dahulu; pada detik berikutnya, S15 mengaktifkan pengeluaran barang dan kembali ke S0. Pusat pemeriksaan pilihan 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 asas yang lengkap. 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.

Keadaan. S0, S5, S10, S15 ialah empat aras kredit bernama. Kredit semasa dalam sen diperoleh secara jelas daripada perbandingan keadaan dan ditunjukkan dalam dua cara: pada LEDR(3 downto 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 dispensed_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, tetapi FSM mengambil sampel syiling hanya pada pinggir menaik. Dalam amalan, anggap satu detik syiling mengambil masa kira-kira 0.67 s. Untuk memasukkan syiling, naikkan satu suis, tunggu sekurang-kurangnya satu pinggir menaik, kemudian turunkannya kembali kepada 0. Membiarkan suis dinaikkan selama beberapa detik akan dikira sebagai beberapa syiling. Masukkan satu syiling pada satu-satu masa.

-- Kod permulaan pelajar: lengkapkan baris TODO sebelum sintesis.
-- Pelajaran 6 - Latihan 3-C: reka bentuk asas FSM mesin layan diri.
-- SW(0)=syiling 5 sen, SW(1)=syiling 10 sen, KEY(0)=set semula. LEDR(7)=simpanan pengeluaran barang.
-- Masukkan satu syiling dengan mengekalkan SW(0) atau SW(1) tinggi selama satu pinggir menaik slow_clk, kira-kira 0.67 s.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity blink is
    port (
        CLOCK_50 : in  std_logic;
        KEY      : in  std_logic_vector(3 downto 0);
        SW       : in  std_logic_vector(9 downto 0);
        LEDR     : out std_logic_vector(9 downto 0);
        HEX0     : out std_logic_vector(6 downto 0)
    );
end entity blink;

architecture rtl of blink is
    type state_t is (S0, S5, S10, S15);
    signal state, next_state : state_t := S0;
    signal dispense, dispensed_latch : std_logic := '0';
    signal credit : unsigned(3 downto 0);
    constant DIV : unsigned(24 downto 0) := to_unsigned(16666666, 25);
    signal div_count : unsigned(24 downto 0) := (others => '0');
    signal slow_clk : std_logic := '0';

    function seg(d : unsigned(3 downto 0)) return std_logic_vector is
    begin
        case d is
            when "0000" => return "1000000"; -- 0
            when "0101" => return "0010010"; -- 5
            when "1010" => return "0001000"; -- A = 10
            when "1111" => return "0001110"; -- F = 15
            when others => return "1111111";
        end case;
    end function;
begin
    process(CLOCK_50)
    begin
        if rising_edge(CLOCK_50) then
            if KEY(0) = '0' then
                div_count <= (others => '0'); slow_clk <= '0';
            elsif div_count = DIV then
                div_count <= (others => '0'); slow_clk <= not slow_clk;
            else
                div_count <= div_count + 1;
            end if;
        end if;
    end process;

    process(state, SW)
    begin
        next_state <= state;
        dispense <= '0';
        case state is
            when S0  => TODO_FROM_0_CENTS;
            when S5  => TODO_FROM_5_CENTS;
            when S10 => TODO_FROM_10_CENTS;
            when S15 => TODO_DISPENSE_AND_RESET;
        end case;
    end process;

    process(slow_clk, KEY)
    begin
        if KEY(0) = '0' then
            state <= S0; dispensed_latch <= '0';
        elsif rising_edge(slow_clk) then
            state <= next_state;
            if TODO_DISPENSE_CONDITION then dispensed_latch <= '1'; end if;
        end if;
    end process;

    credit <= to_unsigned(0, 4)  when state = S0 else
              to_unsigned(5, 4)  when state = S5 else
              to_unsigned(10, 4) when state = S10 else
              to_unsigned(15, 4);

    LEDR(7) <= TODO_DISPENSE_LED;
    LEDR(3 downto 0) <= std_logic_vector(credit);
    LEDR(6) <= '0';  -- ganti baris ini dengan change_latch dalam sambungan 3-C1
    LEDR(5 downto 4) <= (others => '0');
    LEDR(9 downto 8) <= (others => '0');
    HEX0 <= seg(credit);
end architecture rtl;

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 VHDL DE1-SoC. Editor memaparkan fail blink.vhd.

  2. Pilih semua kandungan blink.vhd dan gantikannya dengan kod permulaan mesin layan diri di atas. Lengkapkan setiap peralihan, syarat dan output TODO, kekalkan nama entiti blink, dan perhatikan bahawa entiti mengisytiharkan CLOCK_50 : in std_logic: 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 0.67 s untuk satu detik syiling, 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 catat HEX0 serta LEDR(7). Bagi laluan tepat 15 sen, catat baris apabila kredit mula-mula mencapai F dengan pengeluaran barang masih padam; kemudian tunggu satu detik tambahan dan catat baris pengeluaran barang. Selepas itu, 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 pilihan 3-C1: tambah pemulangan baki

12 min

Jika guru anda mahukan sambungan, pusat pemeriksaan pilihan ini 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, menyimpannya dengan cara yang sama seperti dispensed_latch, dan menggantikan baris asas LEDR(6) <= '0'; dengan LEDR(6) <= change_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; tunggu satu detik tambahan, kemudian LEDR(7), pengeluaran barang = ya; LEDR(6), baki = tidak; kembali ke S0.
- Syiling 5 + syiling 10 sen (5+10): kredit mencapai 15 sen; tunggu satu detik tambahan, kemudian LEDR(7), pengeluaran barang = ya; LEDR(6), baki = tidak; kembali ke S0.
- Syiling 10 + syiling 5 sen (10+5): kredit mencapai 15 sen; tunggu satu detik tambahan, kemudian 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 entiti mesin layan diri anda untuk menambah output pemulangan baki: isytiharkan dan simpan change_latch, kemudian ganti baris asas LEDR(6) <= '0'; dengan LEDR(6) <= change_latch;. Ia hanya perlu menyala 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, tunggu detik pengeluaran barang tambahan, kemudian 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. Bagi laluan tepat 15 sen, tunggu detik pengeluaran barang tambahan sebelum membaca. 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 blink.vhd 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 VHDL 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 dan 15. Paparkan 20 hanya jika anda membina sambungan berasingan dengan keadaan paparan 20 sen atau simpanan paparan yang jelas; reka bentuk pemulangan baki 3-C1 masih mengembalikan paparan kredit kepada 00, sementara LEDR(6) menunjukkan baki. HEX0 menunjukkan digit sa dan HEX1 menunjukkan digit puluh.

Ini menggunakan semula idea penyahkod tujuh segmen daripada Pelajaran 2: fungsi bantuan bernama seg_dec, supaya boleh wujud bersama fungsi asas seg, 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 mengisytiharkan HEX1 : out std_logic_vector(6 downto 0) dalam senarai port entiti — contoh asas pelajaran ini hanya menyediakan HEX0, jadi HEX1 mesti diisytiharkan, sama seperti penyahkod dua digit dalam Pelajaran 2. Gantikan juga baris asal HEX0 <= seg(credit);; jangan biarkan kedua-dua penugasan HEX0 aktif.

Anda hanya memerlukan fungsi perpuluhan seg_dec, dalam bentuk yang sama seperti fungsi seg dalam Pelajaran 2, serta pemisahan nilai kredit asas 0, 5, 10 dan 15:

-- Tambah HEX1 pada senarai port entiti, kemudian lengkapkan bantuan paparan.
HEX0 : out std_logic_vector(6 downto 0);
HEX1 : out std_logic_vector(6 downto 0)
-- ...
function seg_dec(d : unsigned(3 downto 0)) return std_logic_vector is
begin
    case d is
        when "0000" => return "1000000";
        when "0001" => return TODO_PATTERN_FOR_1;
        when "0010" => return TODO_PATTERN_FOR_2;
        when others => return "1111111";
    end case;
end function;

signal cents : unsigned(4 downto 0);
signal tens  : unsigned(3 downto 0);
signal ones  : unsigned(3 downto 0);
-- ...
cents <= TODO_CREDIT_AS_CENTS;
tens  <= TODO_TENS_DIGIT;
ones  <= TODO_ONES_DIGIT;
HEX0 <= TODO_ONES_DISPLAY;
HEX1 <= TODO_TENS_DISPLAY;
  1. (Bonus) Edit entiti mesin layan diri anda: tambah port HEX1 : out std_logic_vector(6 downto 0) pada senarai port, tambah penyahkod perpuluhan seg_dec, pisahkan kredit kepada digit puluh dan sa, ganti baris asal HEX0 <= seg(credit); dengan pemacu paparan HEX0 dan HEX1 yang baharu, 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 dan 15 apabila kredit meningkat. Sesuaikan pola untuk 20 hanya jika anda membina sambungan berasingan dengan keadaan paparan 20 sen atau simpanan paparan yang jelas; reka bentuk 3-C1 masih mengembalikan paparan kredit kepada 00, sementara LEDR(6) menunjukkan baki.

(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

8 min

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

- Get logik (Pelajaran 1): AND, OR, NOT, NAND, NOR dan XOR — unsur asas setiap litar — serta idea bahawa VHDL *menerangkan perkakasan*, bukannya berjalan seperti atur cara.
- Reka bentuk gabungan dan peminimuman (Pelajaran 2): jadual kebenaran, SOP kanonik, peta Karnaugh dan sambungan POS, MUX serta penyahkod pilihan — menukarkan spesifikasi kepada litar yang lebih ringkas dan memenuhinya.
- Ingatan (Pelajaran 3): flip-flop dan daftar muatan selari — saat litar memperoleh keupayaan untuk *mengingati*.
- Pembilang (Pelajaran 4): blok berjujukan yang dipacu melalui pembahagi jam, bersama disiplin menyemak bahawa pemalar muat dalam daftar; sambungan pilihan memperkenalkan BCD dan daftar anjak.
- Mesin keadaan terhingga (Pelajaran 5): lampu isyarat Moore yang bertindak berdasarkan keadaan yang diingati, dengan sambungan pilihan pengesan jujukan Mealy.
- Projek kemuncak FSM (pelajaran ini): pengawal mesin layan diri yang anda *jalankan dan terangkan* daripada jadual peralihan; pusat pemeriksaan pilihan membolehkan anda menambah pemulangan baki, pemilihan barangan atau paparan perpuluhan dan, jika dicuba, menaakul bilangan keadaan dan flip-flop.

Itulah teras kursus pengenalan logik digital, dan anda menjalankan laluan wajib 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.
- Topik VHDL lanjutan dan simulasi. Topik lanjutan dalam VHDL serta *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) bukti yang anda rakam bagi laluan pengeluaran barang asas atau pusat pemeriksaan pilihan, dan (3) satu keadaan apabila tingkah laku aktif rendah atau output tersimpan penting untuk melihat hasil pada kamera.