Teach Pelajaran dengan makmal jarak jauh

Pelajaran Teach

Logik digital pada DE1-SoC dengan VHDL (3/6): ingatan — flip-flop dan daftar

Gunakan proses VHDL berjam untuk membina flip-flop D dan daftar 8 bit, kemudian sahkan tingkah laku ingatan pada perkakasan sebenar.

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

Hasil pembelajaran

  • Menerangkan sebab logik jujukan memerlukan ingatan sedangkan logik gabungan tidak.

  • Menerangkan flip-flop D sebagai sampel dan tahan pada pinggir jam, dengan set semula segerak.

  • Membina daftar muatan selari 8 bit daripada flip-flop yang berkongsi jam dan set semula.

  • Menggunakan tugasan isyarat dalam proses VHDL berjam dan mengenal input KEY aktif-rendah.

Pratonton aktiviti pelajar

Kandungan aktiviti

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

1

Mengapa litar memerlukan ingatan

10 min

Semua reka bentuk sebelum ini bersifat gabungan: LED hanya bergantung pada kedudukan suis ketika itu. Apabila suis berubah, output berubah sebaik sahaja isyarat melalui get. Litar gabungan tiada keadaan; ia tidak mengetahui input sebentar tadi dan tidak boleh menyimpan apa-apa.

Namun sistem berguna memerlukan ingatan. Pembilang perlu mengetahui nilai semasa untuk menghasilkan nilai seterusnya. CPU perlu menyimpan operan dan hasil antara arahan. Lampu isyarat perlu mengetahui warna semasa untuk memilih warna berikutnya. Get sahaja hanya mencerminkan input semasa.

Logik jujukan ialah logik yang mengingati. Outputnya bergantung pada input semasa dan keadaan yang disimpan. Flip-flop menyimpan satu bit keadaan, manakala jam memberitahu semua flip-flop bila hendak dikemas kini.

DE1-SoC menyediakan jam bergerak bebas 50 MHz bernama CLOCK_50, yang naik dan turun 50,000,000 kali sesaat. Mulai pelajaran ini, setiap reka bentuk jujukan perlu mengisytiharkannya sebagai input. Templat blink.vhd tidak mempunyai jam, jadi anda perlu menambah CLOCK_50 : in std_logic pada entiti. Melupakannya ialah ralat lazim reka bentuk jujukan.

Litar yang manakah jujukan, iaitu outputnya boleh bergantung pada masa lalu?

Mengapakah flip-flop atau daftar memerlukan CLOCK_50 : in std_logic, dan apakah yang biasanya berlaku jika input itu ditinggalkan? Jawab dalam satu atau dua ayat.

2

Flip-flop D: sampel dan tahan pada pinggir jam

11 min

Flip-flop D ialah unsur ingatan paling ringkas. Ia mempunyai input data D, input jam dan output Q. Peraturannya ialah:

> Pada setiap pinggir menaik jam, Q menangkap nilai D dan mengekalkannya hingga pinggir menaik berikutnya.

Di antara pinggir, perubahan D tidak mengubah Q. Inilah sampel dan tahan: flip-flop mensampel D apabila jam berubah daripada 0 kepada 1, kemudian mengekalkan sampel itu. Maka Q boleh terus bernilai 1 selepas D kembali kepada 0.

Rajah pemasaan flip-flop D dengan gelombang CLK, D dan Q. Q hanya menyalin D pada setiap pinggir menaik jam dan mengekalkan nilai hingga pinggir berikutnya.

Sampel dan tahan: Q hanya dikemas kini pada setiap pinggir menaik CLOCK_50, menyalin nilai D pada saat itu dan mengekalkannya hingga pinggir seterusnya.

Dua idea baharu dalam VHDL.

Pertama, proses berjam. Tingkah laku berasaskan pinggir diterangkan dengan process(CLOCK_50) dan if rising_edge(CLOCK_50) then. Tugasan di dalam proses menentukan perkara yang ditangkap oleh flip-flop pada pinggir; ia bukan arahan yang berjalan secara berterusan.

Kedua, tugasan isyarat <=. Dalam proses berjam, Q <= SW(0); menerangkan kemas kini flip-flop pada pinggir. Pemboleh ubah VHDL menggunakan := dan berubah serta-merta dalam proses. Petua kursus: gunakan isyarat dan <= bagi nilai tersimpan seperti flip-flop, daftar, pembilang dan keadaan FSM.

Set semula segerak. Set semula segerak diperiksa *di dalam* blok jam dan hanya berkuat kuasa pada pinggir:

process(CLOCK_50)
begin
    if rising_edge(CLOCK_50) then
        if KEY(0) = '0' then Q <= TODO_RESET_VALUE;
        else                  Q <= TODO_D_INPUT;
        end if;
    end if;
end process;

KEY ialah aktif-rendah: butang dibaca sebagai 0 apabila ditekan. Oleh itu KEY(0) = '0' benar ketika butang set semula ditekan.

Mengapakah <= ialah bentuk yang betul untuk mengemas kini output flip-flop dalam proses ini, dan mengapakah beberapa daftar perlu mensampel bersama pada pinggir jam yang sama?

Jika D berdenyut kepada 1 hanya di antara dua pinggir menaik dan kembali kepada 0 sebelum pinggir berikutnya, adakah Q pernah menjadi 1? Terangkan dengan peraturan sampel dan tahan.

3

Latihan 2-A — flip-flop D dengan set semula

12 min

Bina flip-flop D pada papan sebenar. Gunakan SW(0)=D, KEY(0)=set semula aktif-rendah, LEDR(0)=Q dan LEDR(1)=not Q.

Baca sebelum menjalankan. Pada 50 MHz, Q mensampel D 50,000,000 kali sesaat, terlalu pantas untuk mata atau kamera. Oleh itu LEDR(0) kelihatan mengikuti SW(0) serta-merta. Latihan ini menunjukkan set semula, bukan penyimpanan:

- Dengan SW(0) ke atas, LEDR(0) menyala dan LEDR(1) padam.
- Apabila KEY(0) ditekan dan ditahan, LEDR(0) padam walaupun SW(0) masih ke atas: set semula mengatasi data.
- Selepas KEY(0) dilepaskan, LEDR(0) kembali mengikuti SW(0).

-- Kod permulaan pelajar: lengkapkan baris TODO sebelum sintesis.
-- Pelajaran 3 - Latihan 2-A: flip-flop D.
-- SW(0)=D, KEY(0)=set semula aktif-rendah, LEDR(0)=Q, LEDR(1)=not Q.
library ieee;
use ieee.std_logic_1164.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)
    );
end entity blink;

architecture rtl of blink is
    signal Q : std_logic := '0';
begin
    process(CLOCK_50)
    begin
        if rising_edge(CLOCK_50) then
            if KEY(0) = '0' then Q <= TODO_RESET_VALUE;
            else                  Q <= TODO_D_INPUT;
            end if;
        end if;
    end process;

    LEDR(0) <= TODO_Q_OUTPUT;
    LEDR(1) <= TODO_NOT_Q_OUTPUT;
    LEDR(9 downto 2) <= (others => '0');
end architecture rtl;
  1. Buka makmal VHDL DE1-SoC. Editor memaparkan blink.vhd.

  2. Gantikan seluruh fail dengan kod di atas, lengkapkan semua TODO, kekalkan entiti blink dan sahkan input CLOCK_50 : in std_logic.

  3. Klik Synthesize (Bina/sintesis). Tutup atau langkau lawatan jika menutup butang. Tunggu 1–3 minit dan baiki ralat sehingga binaan berjaya dengan 0 ralat.

  4. Klik Upload to FPGA (Muat naik ke FPGA) dan tunggu kamera.

  5. Letakkan SW(0) ke atas dan sahkan LEDR(0) menyala serta LEDR(1) padam.

  6. Dengan SW(0) masih ke atas, tekan dan tahan KEY(0): LEDR(0) mesti padam. Lepaskan butang dan sahkan LED menyala semula.

Tetapkan SW(0) dan KEY(0) bagi setiap baris dan rekod LEDR(0)=Q serta LEDR(1)=not Q pada kamera. KEY aktif-rendah: ditekan=0, dilepaskan=1.

SW(0) (D) KEY(0) (0=ditekan, 1=dilepaskan) LEDR(0) = Q LEDR(1) = not Q

Apakah perbezaan antara flip-flop ini dengan wayar terus daripada SW(0) kepada LEDR(0)? Jawab dari segi ingatan.

Reka bentuk ini menggunakan set semula segerak. Nyatakan baris yang melakukan set semula dan terangkan maksud “segerak” dari segi masa ia berkuat kuasa.

Mengapakah LEDR(1) sentiasa menunjukkan nilai bertentangan dengan LEDR(0)?

Latihan 2-A menyimpan D, tetapi kamera hanya dapat menunjukkan set semula. Gunakan kadar 50 MHz untuk menerangkan sebab penyimpanan tidak kelihatan sedangkan set semula jelas kelihatan.

4

Latihan 2-B — daftar muatan selari 8 bit

12 min

Daftar ialah N flip-flop D yang berkongsi jam dan set semula. Daftar 8 bit menyimpan 8 bit. Muatan selari menyalin semua lapan bit input serentak pada satu pinggir jam.

Kawalan muat menjadikan ingatan kelihatan. Daftar hanya menangkap data apabila diarahkan; anda boleh menukar suis tetapi nilai tersimpan kekal. Gunakan SW(7 downto 0)=data, KEY(0)=set semula dan KEY(1)=muat, kedua-duanya aktif-rendah.

Untuk memuatkan data, tekan dan lepaskan KEY(1). Kod mensampel aras butang pada setiap pinggir jam, yang memadai bagi latihan ini.

-- Kod permulaan pelajar: lengkapkan baris TODO sebelum sintesis.
-- Pelajaran 3 - Latihan 2-B: daftar muatan selari 8 bit.
-- SW(7 downto 0)=data, KEY(0)=set semula, KEY(1)=muat. KEY aktif-rendah.
library ieee;
use ieee.std_logic_1164.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)
    );
end entity blink;

architecture rtl of blink is
    signal Q : std_logic_vector(7 downto 0) := (others => '0');
begin
    process(CLOCK_50)
    begin
        if rising_edge(CLOCK_50) then
            if KEY(0) = '0' then
                Q <= TODO_RESET_VECTOR;
            elsif KEY(1) = '0' then
                Q <= TODO_LOAD_VALUE;
            end if; -- jika tidak, Q mengekalkan nilai sebelumnya
        end if;
    end process;

    LEDR(7 downto 0) <= TODO_REGISTER_OUTPUT;
    LEDR(9 downto 8) <= (others => '0');
end architecture rtl;
  1. Gantikan seluruh blink.vhd dengan daftar di atas. Lengkapkan TODO dan kekalkan CLOCK_50 : in std_logic.

  2. Klik Synthesize, tunggu kejayaan, kemudian klik Upload to FPGA.

  3. Tetapkan SW(7 downto 0)=10101010. LED belum memaparkan nilai itu kerana data belum dimuatkan.

  4. Muatkan: tekan dan lepaskan KEY(1). LEDR(7 downto 0) kini menunjukkan 10101010.

  5. Lihat ingatan: tukar suis kepada 01010101 tanpa menekan KEY(1). LED kekal 10101010.

  6. Kemas kini: tekan dan lepaskan KEY(1) sekali lagi. LED berubah kepada 01010101.

  7. Set semula: tekan dan lepaskan KEY(0). Semua lapan LED padam tanpa mengira suis.

Laksanakan jujukan dan rekod LEDR(7 downto 0) pada setiap peringkat. Apabila suis berubah tanpa muat, nilai tersimpan mesti kekal seperti baris sebelumnya.

Peringkat SW(7 downto 0) ditetapkan kepada Tindakan pada KEY LEDR(7 downto 0) diperhatikan

Hantar bukti. Ambil tangkap layar yang membuktikan nilai tersimpan dikekalkan: LEDR(7 downto 0) menunjukkan 10101010 sementara suis menunjukkan corak berbeza seperti 01010101, tanpa menekan KEY(1) sekali lagi.

Anda menukar suis tetapi LED tidak berubah. Terangkan sebabnya menggunakan perkataan “simpan” dan “muat”.

Jika set semula (KEY(0)) dan muat (KEY(1)) ditekan pada pinggir jam yang sama, apakah nilai yang diambil oleh daftar dan mengapa? Nyatakan baris yang menentukan keutamaan itu.

Apakah tujuan praktikal daftar muatan selari dalam CPU? Berikan satu contoh konkrit perkara yang boleh disimpannya.

5

Perkara yang anda bina dan dua gaya set semula

8 min

Anda membina asas ingatan digital: flip-flop D, yang menyimpan satu bit, dan daftar, yang menggabungkan beberapa flip-flop yang dimuatkan secara selari. Anda menggunakan proses rising_edge(CLOCK_50), tugasan isyarat <= dan input KEY aktif-rendah.

Reka bentuk ini menggunakan set semula segerak, yang diperiksa di dalam proses jam. Dalam pelajaran berikutnya, anda juga akan menemui set semula tak segerak dengan process(..., KEY) dan pemeriksaan KEY(0) sebelum cabang pinggir. Ia memaksa keadaan selamat tanpa menunggu jam perlahan.

Jujukan yang manakah sepadan dengan aliran kedua-dua latihan?

Dalam tiga atau empat ayat, terangkan cara Latihan 2-B membuktikan ingatan, sebab Latihan 2-A hanya membolehkan set semula diperhatikan dan satu keadaan apabila polariti aktif-rendah KEY penting.