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.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
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.
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.
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.
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.
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;Buka makmal VHDL DE1-SoC. Editor memaparkan
blink.vhd.Gantikan seluruh fail dengan kod di atas, lengkapkan semua TODO, kekalkan entiti
blinkdan sahkan inputCLOCK_50 : in std_logic.Klik Synthesize (Bina/sintesis). Tutup atau langkau lawatan jika menutup butang. Tunggu 1–3 minit dan baiki ralat sehingga binaan berjaya dengan 0 ralat.
Klik Upload to FPGA (Muat naik ke FPGA) dan tunggu kamera.
Letakkan
SW(0)ke atas dan sahkanLEDR(0)menyala sertaLEDR(1)padam.Dengan
SW(0)masih ke atas, tekan dan tahanKEY(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.
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;Gantikan seluruh
blink.vhddengan daftar di atas. Lengkapkan TODO dan kekalkanCLOCK_50 : in std_logic.Klik Synthesize, tunggu kejayaan, kemudian klik Upload to FPGA.
Tetapkan
SW(7 downto 0)=10101010. LED belum memaparkan nilai itu kerana data belum dimuatkan.Muatkan: tekan dan lepaskan
KEY(1).LEDR(7 downto 0)kini menunjukkan10101010.Lihat ingatan: tukar suis kepada
01010101tanpa menekanKEY(1). LED kekal10101010.Kemas kini: tekan dan lepaskan
KEY(1)sekali lagi. LED berubah kepada01010101.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.
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.