Pelajaran Teach
Logik digital pada DE1-SoC dengan VHDL (5/6): mesin keadaan terhingga
Bina dan ubah suai FSM Moore untuk lampu isyarat pada DE1-SoC, dengan sambungan pilihan pengesan Mealy.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
Hasil pembelajaran
Menerangkan mesin keadaan terhingga dari segi keadaan, peralihan dan output.
Menerangkan sebab pengawal lampu isyarat ialah mesin Moore dan mengenal pengesan Mealy sebagai sambungan pilihan.
Membaca dan mengubah suai FSM VHDL dua atau tiga blok: daftar keadaan, logik keadaan seterusnya dan logik output.
Membina dan mengubah suai pengawal lampu isyarat pada DE1-SoC sebenar.
Menerangkan kepentingan set semula tak segerak aktif-rendah apabila FSM berjam perlahan perlu kembali ke keadaan yang diketahui.
Pratonton aktiviti pelajar
Kandungan aktiviti
Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.
Apakah itu mesin keadaan terhingga
10 min
Anda sudah membina litar yang mengingati: flip-flop menyimpan satu bit, daftar menyimpan beberapa bit dan pembilang menyimpan kiraan semasa. Mesin keadaan terhingga (FSM) menyusun ingatan itu menjadi *situasi yang bermakna*. Pada setiap masa, mesin berada dalam tepat satu daripada set keadaan yang kecil dan tetap. Bagi lampu isyarat, keadaannya mungkin GREEN, YELLOW dan RED. Bilangan keadaan itu terhingga, maka namanya, dan mesin sentiasa berada dalam tepat satu daripadanya.
FSM ditakrifkan oleh tiga perkara:
- Keadaan — set situasi terhingga yang boleh diduduki mesin. Satu keadaan khas ialah keadaan set semula, tempat mesin bermula.
- Peralihan — peraturan untuk berpindah daripada satu keadaan kepada keadaan lain. Pada setiap pinggir jam, mesin melihat keadaan semasa dan input lalu menentukan keadaan seterusnya. GREEN -> YELLOW bermaksud, jika mesin berada dalam GREEN dan syarat dipenuhi, ia berpindah ke YELLOW pada pinggir berikutnya.
- Output — nilai yang dipacu oleh mesin pada outputnya, di sini LED, dalam setiap situasi.
Seluruh mesin bergerak mengikut jam. Pada setiap pinggir, ia mungkin berpindah kepada keadaan baharu berdasarkan keadaan semasa dan input semasa, kemudian mengekalkan keadaan itu hingga pinggir berikutnya. Antara pinggir, ia hanya menunggu. Ini ialah tingkah laku sampel dan tahan yang sama seperti flip-flop, kini digunakan untuk melalui jujukan keadaan.
Moore berbanding Mealy. FSM terbahagi kepada dua jenis mengikut sumber output:
- Dalam mesin Moore, output bergantung hanya pada keadaan semasa. Jika keadaan diketahui, output juga diketahui; input tidak muncul dalam persamaan output. Lampu isyarat ialah Moore: apabila keadaan ialah RED, LED merah menyala tanpa mengira input.
- Dalam mesin Mealy, output bergantung pada keadaan semasa dan input semasa bersama-sama. Keadaan yang sama boleh menghasilkan output berbeza mengikut input ketika itu. Pengesan jujukan menegaskan “dikesan” dalam keadaan tertentu *hanya apabila bit masuk juga mempunyai nilai yang betul*.
Output Moore stabil selagi mesin kekal dalam sesuatu keadaan. Output Mealy boleh berubah sebaik sahaja input berubah, walaupun keadaan tidak bertukar. Ini menjadikannya pantas tetapi juga berpotensi singkat dan terganggu oleh glitch, perkara yang penting pada kamera.
Bentuk piawai FSM dalam VHDL. Hampir setiap FSM dalam kursus ini ditulis sebagai dua atau tiga blok yang bekerjasama:
1. Daftar keadaan — proses VHDL berjam (if rising_edge(clock) then ...) yang menyimpan keadaan semasa dan menyalin keadaan seterusnya pada setiap pinggir. Inilah satu-satunya blok yang mempunyai ingatan.
2. Proses keadaan seterusnya — proses gabungan VHDL yang mengira keadaan seterusnya daripada keadaan semasa dan input. Ia perlu memberikan nilai lalai yang selamat sebelum case atau meliputi setiap cabang secara jelas supaya setiap laluan memberikan nilai kepada output dan next_state.
3. Logik output — tugasan isyarat serentak atau tugasan dalam proses gabungan yang memacu output daripada keadaan (Moore) atau daripada keadaan dan input (Mealy).
Kedua-dua reka bentuk dalam pelajaran ini mengikuti bentuk tersebut: proses keadaan berjam, proses gabungan keadaan seterusnya dengan nilai lalai dan logik output.
Mesin jual layan mengingati jumlah wang yang telah dimasukkan dan mengeluarkan barangan apabila jumlahnya mencapai harga. Apabila dimodelkan sebagai FSM, apakah yang paling tepat memainkan peranan keadaan?
Sebuah litar menyalakan LED apabila berada dalam keadaan BUSY dan input go kini bernilai 1. Adakah output itu Moore atau Mealy? Terangkan dalam satu ayat.
Catatan wajib: set semula tak segerak dalam FSM ini
7 min
Sebelum membina apa-apa, perhatikan satu perubahan yang disengajakan daripada pelajaran terdahulu.
Dalam Pelajaran 3, flip-flop dan daftar menggunakan set semula segerak: set semula diuji di dalam proses berjam, seperti if KEY(0) = '0' then Q <= '0'; di dalam if rising_edge(CLOCK_50) then. Pelajaran 4 sudah menggunakan set semula tak segerak aktif-rendah bagi litar jam perlahan; pelajaran ini meneruskan gaya itu untuk keadaan FSM supaya set semula tidak menunggu jam perlahan.
FSM dalam pelajaran ini menggunakan set semula tak segerak aktif-rendah. Lihat senarai kepekaan daftar keadaan:
process(slow_clk, KEY)
begin
if KEY(0) = '0' then state <= TODO_RESET_STATE;
elsif rising_edge(slow_clk) then state <= TODO_NEXT_STATE;
end if;
end process;
Meletakkan KEY dalam senarai kepekaan proses dan memeriksa if KEY(0) = '0' then sebelum cabang pinggir jam bermakna proses keadaan turut bertindak pada saat KEY(0) menjadi rendah, iaitu ketika butang ditekan, bukan hanya pada pinggir slow_clk. Menekan KEY(0) memaksa mesin ke keadaan yang diketahui serta-merta, tanpa menunggu jam perlahan.
Nyatakan perbezaannya dengan jelas:
- Set semula segerak (Pelajaran 2–3): berkuat kuasa hanya pada pinggir jam. Ia kemas dan boleh dijangka, tetapi jika jam perlahan anda perlu menunggu pinggir.
- Set semula tak segerak (Pelajaran 5–6): berkuat kuasa serta-merta apabila isyarat set semula ditegaskan, tanpa mengira jam.
Mengapa berubah? FSM ini berjalan daripada slow_clk terbahagi yang pinggirnya berselang beberapa saat. Jika set semula segerak digunakan, anda mungkin menekan KEY(0) tetapi tidak melihat apa-apa berlaku selama lebih satu saat hingga pinggir perlahan berikutnya. Jika mesin tersekat, ketika itulah anda paling memerlukan jalan keluar segera. Set semula tak segerak memberikan pemaksaan kembali ke mula yang segera dan boleh dipercayai pada papan sebenar. KEY ialah aktif-rendah: KEY(0) menjadi rendah ketika butang ditekan dan KEY(0) = '0' benar selagi butang ditahan.
Anda menekan KEY(0) ketika pinggir slow_clk berikutnya masih kira-kira satu saat lagi. Dengan set semula tak segerak yang digunakan, bilakah mesin melompat ke keadaan set semula? Bilakah set semula segerak akan melompat?
Daftar keadaan ditulis sebagai process(slow_clk, KEY) dengan if KEY(0) = '0' then ... elsif rising_edge(slow_clk) then .... Apakah yang ditambah oleh cabang set semula tak segerak (if KEY(0) = '0' then ...), dan bagaimanakah set semula bertindak jika cabang itu dibuang, meninggalkan hanya proses berjam rising_edge(slow_clk)?
Latihan 3-A: lampu isyarat (FSM Moore)
10 min
FSM pertama anda ialah pengawal lampu isyarat. Ia mempunyai tiga keadaan yang dilalui dalam kitaran tetap, dengan setiap lampu dikekalkan selama bilangan detik tertentu:
GREEN -> YELLOW -> RED -> GREEN -> ...
Sambungannya ialah LEDR(0) = hijau, LEDR(1) = kuning, LEDR(2) = merah dan KEY(0) = set semula aktif-rendah yang mengembalikan mesin ke GREEN. Mesin dipacu oleh slow_clk terbahagi: setiap pinggir menaik ialah satu detik mesin keadaan. Dengan pembahagi ini, gunakan kira-kira 0.67 s bagi setiap detik yang kelihatan; pinggir menaik pertama selepas set semula boleh tiba lebih awal.
Ini ialah mesin Moore. Logik output di bahagian bawah ialah
LEDR(0) <= TODO_GREEN_LED;
LEDR(1) <= TODO_YELLOW_LED;
LEDR(2) <= TODO_RED_LED;
Setiap LED ialah fungsi keadaan sahaja; tiada input muncul. Mengetahui keadaan menentukan dengan tepat lampu yang menyala. Itulah ciri penentu mesin Moore.
Dua daftar berasingan menjalankan dua tugas berasingan. Baca daftar keadaan dengan teliti kerana reka bentuk ini mempunyai *dua* ingatan yang mudah dikelirukan:
- state, isyarat jenis state_t, menyimpan lampu yang sedang menyala: GREEN, YELLOW atau RED. Inilah keadaan FSM.
- timer, isyarat unsigned(2 downto 0), ialah pembilang tempoh berasingan yang mengira turun bilangan detik yang tinggal bagi lampu semasa. Selagi timer lebih besar daripada sifar, ia hanya berkurang (timer <= timer - 1) dan keadaan tidak berubah. Hanya apabila timer mencapai 0, mesin bergerak ke next_state dan memuat semula timer bagi lampu baharu.
Jadi daftar keadaan menyimpan *lampu yang mana* menyala, manakala pemasa mengira *berapa lama* lampu itu kekal menyala. Kedua-duanya ialah daftar berlainan dengan tujuan berlainan; pemasa mengekalkan setiap lampu dan menghalangnya daripada berlalu dalam satu detik sahaja.
Tempoh sebenar daripada kod. Apabila mesin memasuki setiap keadaan, ia memuat semula timer; kiraan daripada nilai yang dimuat hingga 0, termasuk kedua-duanya, memberikan bilangan detik:
- GREEN memuatkan timer = 3 dan mengira 3, 2, 1, 0 -> 4 detik (kira-kira 2.7 s).
- YELLOW memuatkan timer = 1 dan mengira 1, 0 -> 2 detik (kira-kira 1.3 s).
- RED memuatkan timer = 3 -> 4 detik (kira-kira 2.7 s).
Oleh itu, satu kitaran lengkap mempunyai 4 + 2 + 4 = 10 detik, kira-kira 10 × 0.67 s = 6.7 s dari mula hingga akhir.
Lampu isyarat sebagai mesin Moore tiga keadaan: GREEN -> YELLOW -> RED -> GREEN. Pemasa mengekalkan setiap keadaan selama bilangan detik tetap: GREEN 4, YELLOW 2 dan RED 4; satu detik yang kelihatan mengambil kira-kira 0.67 s. Setiap keadaan menyalakan tepat satu LED, jadi output bergantung pada keadaan sahaja. KEY(0) menetapkan semula mesin ke GREEN.
Inilah entiti lengkap. Pembahagi menghasilkan slow_clk; proses keadaan dengan set semula tak segerak memajukan lampu apabila pemasa tamat; proses gabungan mengira lampu seterusnya; dan tiga tugasan LED serentak membentuk logik output Moore.
-- Kod permulaan: lengkapkan baris TODO sebelum sintesis.
-- Pelajaran 5 - Latihan 3-A: pengawal lampu isyarat (FSM Moore).
-- KEY(0)=set semula. LEDR(0)=hijau, LEDR(1)=kuning, LEDR(2)=merah.
-- Tempoh: GREEN = 4 detik, YELLOW = 2 detik, RED = 4 detik.
-- Satu detik FSM yang kelihatan ialah pinggir menaik slow_clk, kira-kira 0.67 s dengan pembahagi ini.
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);
LEDR : out std_logic_vector(9 downto 0)
);
end entity blink;
architecture rtl of blink is
type state_t is (GREEN, YELLOW, RED);
signal state, next_state : state_t := GREEN;
signal timer : unsigned(2 downto 0) := "011";
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';
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)
begin
case state is
when GREEN => next_state <= TODO_AFTER_GREEN;
when YELLOW => next_state <= TODO_AFTER_YELLOW;
when RED => next_state <= TODO_AFTER_RED;
end case;
end process;
process(slow_clk, KEY)
begin
if KEY(0) = '0' then
state <= GREEN; timer <= "011";
elsif rising_edge(slow_clk) then
if timer = 0 then
state <= next_state;
case next_state is
when GREEN => timer <= TODO_GREEN_RELOAD; -- 4 detik
when YELLOW => timer <= TODO_YELLOW_RELOAD; -- 2 detik
when RED => timer <= TODO_RED_RELOAD; -- 4 detik
end case;
else
timer <= timer - 1;
end if;
end if;
end process;
LEDR(0) <= TODO_GREEN_OUTPUT;
LEDR(1) <= TODO_YELLOW_OUTPUT;
LEDR(2) <= TODO_RED_OUTPUT;
LEDR(9 downto 3) <= (others => '0');
end architecture rtl;Output lampu isyarat ialah tugasan serentak seperti LEDR(0) <= '1' when state = GREEN else '0';. Untuk menjadikan salah satu output ini Mealy dan bukan Moore, jenis sebutan apakah yang perlu ditambah pada ungkapan tetapi tiada sekarang?
Latihan 3-A pada papan: perhati dan ubah suai
12 min
Sekarang bina lampu isyarat pada DE1-SoC sebenar, ukur setiap fasa, kemudian ubah suainya.
Buka makmal VHDL DE1-SoC. Editor memaparkan fail
blink.vhd.Pilih semua kandungan
blink.vhddan gantikannya dengan kod permulaan lampu isyarat di atas. Lengkapkan setiap baris TODO, kekalkan entiti bernamablinkdan kekalkanCLOCK_50 : in std_logic.Klik Synthesize. Jika lawatan berpandu menutupi butang, tutup atau langkau dahulu. Tunggu hingga selesai, kira-kira 1–3 minit. Ralat paling lazim ialah
CLOCK_50tiada dalam senarai port atau koma bertitik tertinggal; baiki dan jalankan Synthesize semula. Teruskan hanya apabila status akhir menyatakan binaan berjaya dengan 0 ralat.Klik Upload to FPGA dan tunggu papan serta kamera langsung.
Perhatikan kitaran. Lihat
LEDR(0)(hijau),LEDR(1)(kuning) danLEDR(2)(merah) berkitar. Kira berapa saat, atau detik kira-kira 0.67 s, setiap lampu kekal menyala dan rekodkannya. Bandingkan dengan kod: GREEN sepatutnya 4 detik, YELLOW 2 dan RED 4.Tekan set semula. Ketika lampu berada pada YELLOW atau RED, tekan dan lepaskan
KEY(0). Mesin sepatutnya kembali ke GREEN serta-merta. Inilah set semula tak segerak.
Perhatikan kitaran lampu isyarat dan ukur setiap fasa pada kamera. Rekod tempoh yang dilihat, dalam saat atau detik kira-kira 0.67 s, dan bandingkan dengan detik jangkaan daripada kod: GREEN 4, YELLOW 2 dan RED 4.
| Fasa (LED menyala) | Detik jangkaan (daripada kod) | Tempoh diperhatikan (s atau detik) |
|---|---|---|
Hantar bukti anda. Tunggu fasa YELLOW dan ambil tangkap layar kamera ketika LEDR(1) (kuning) menyala sementara LEDR(0) (hijau) dan LEDR(2) (merah) padam. Lampirkannya di bawah.
Sekarang lakukan satu perubahan pemasaan wajib pada reka bentuk.
(Ubah suai) Tukar tempoh. Edit nilai muat semula timer supaya kitarannya menjadi GREEN = 6 detik, YELLOW = 4 detik, RED = 6 detik. Pemasa mengira daripada nilai yang dimuat hingga 0, termasuk kedua-duanya, jadi N detik bermaksud memuatkan N - 1: muatkan "101" (5) bagi GREEN, "011" (3) bagi YELLOW dan "101" (5) bagi RED, dalam case daftar keadaan dan juga baris set semula jika nilai awal berubah. Jalankan sintesis, muat naik, sahkan pemasaan baharu pada kamera dan kira jumlah panjang kitaran baharu dalam detik.
Sambungan pilihan: tambah keadaan merah berkelip. Tambah keadaan keempat, FLASH_RED, selepas RED hanya jika guru meminta sambungan ini. Untuk mengelakkan LEDR(2) dipacu dari dua tempat, gantikan tugasan LED merah dengan satu pemacu gabungan seperti LEDR(2) <= '1' when state = RED else timer(0) when state = FLASH_RED else '0';. Kemudian tambah FLASH_RED pada jenis VHDL state_t dan case keadaan seterusnya, berikan tempoh dalam case pemasa, jalankan sintesis, muat naik dan sahkan LED merah berkelip sebelum kembali ke hijau.
Untuk menjadikan YELLOW dua kali lebih lama, nilai daftar yang manakah perlu diubah (state atau timer), di bahagian mana tepatnya dalam kod, dan daftar manakah yang dibiarkan langsung tidak berubah?
Selepas menukar nilai muat semula tempoh, jalankan lampu isyarat sekali lagi. Rekod bilangan detik yang diubah bagi setiap keadaan supaya perubahan kod dibuktikan, bukan sekadar diterangkan.
| Keadaan | Detik diubah yang diperhatikan | Nilai muat semula dalam kod |
|---|---|---|
Bagi masa yang diubah (GREEN = 6, YELLOW = 4 dan RED = 6 detik), berapakah jumlah panjang satu kitaran lengkap dalam detik? Tunjukkan pengiraan.
Dengan menggunakan kod dan pemerhatian anda, jelaskan dalam dua atau tiga ayat bahawa ini ialah mesin Moore. Kenal pasti logik output dan terangkan sebab LED ialah fungsi keadaan sahaja, bukan sebarang input.
Sambungan pilihan: pengesan jujukan 1011 (FSM Mealy)
11 min
FSM kedua anda memerhatikan aliran bit yang tiba satu per detik jam pada SW(0) dan menyalakan LED apabila corak 1011 baru dikesan. Ini ialah mesin Mealy: ia menegaskan “dikesan” dalam keadaan tertentu *hanya apabila bit masuk juga betul*, jadi output bergantung pada keadaan dan input bersama-sama.
Sambungannya ialah SW(0) = bit input bersiri, KEY(0) = set semula aktif-rendah, LEDR(0) = dikesan dan LEDR(5 downto 1) = keadaan semasa dalam paparan one-hot, satu LED bagi setiap keadaan, supaya pergerakan mesin dapat dilihat. Mesin dipacu oleh slow_clk terbahagi yang pinggir menaiknya, satu detik, berlaku kira-kira setiap 1.33 s dengan pembahagi ini.
Keadaan. Pengesan mengingati bahagian 1011 yang telah dipadankan:
- S0 — belum memadankan apa-apa; keadaan set semula.
- S1 — bit terakhir ialah 1; memadankan 1.
- S2 — memadankan 10.
- S3 — memadankan 101.
- S4 — memadankan 1011 sepenuhnya. Dari sini mesin masih boleh memulakan padanan baharu, membolehkan pengesanan bertindih: 1 terakhir bagi satu 1011 boleh menjadi 1 pertama bagi yang berikutnya.
Pada setiap detik, blok keadaan seterusnya melihat keadaan semasa dan bit pada SW(0), lalu bergerak sewajarnya. Output detect ditegaskan dalam S3 hanya apabila bit masuk ialah 1, kerana 101 diikuti 1 melengkapkan 1011. Itulah output Mealy, yang ditentukan oleh keadaan dan input.
Mengapa output disimpan — baca dengan teliti. Isyarat Mealy mentah detect tinggi selama satu detik sahaja. Pada jam pantas, denyut itu tidak kelihatan; walaupun pada jam perlahan ini, kilatan kira-kira 1.33 s mudah terlepas pada kamera jauh. Oleh itu, reka bentuk tidak menyambungkan detect terus ke LED. Sebaliknya, pengesanan disimpan: daftar berasingan detected_latch ditetapkan kepada 1 apabila detect dicetuskan dan kekal ditetapkan hingga set semula ditekan. LEDR(0) memaparkan latch itu. Selepas 1011 dikesan, LED menyala dan kekal menyala hingga KEY(0). Peristiwa singkat ditukar menjadi petunjuk stabil yang mudah dirakam.
Pengesan 1011 sebagai mesin Mealy lima keadaan. S0 hingga S4 menjejaki bahagian 1011 yang telah dipadankan. Output detect, yang ditanda pada peralihan S3, bergantung pada keadaan S3 dan input 1 bersama-sama, jadi ia ialah output Mealy. Peraturan tindihan memastikan mesin bersedia bagi padanan baharu; contohnya, S3 dengan 0 kembali ke S2, bukan S0. Denyut detect satu detik disimpan pada LEDR(0) hingga set semula.
Inilah entiti lengkap. Perhatikan bentuk dua proses: proses gabungan mengira next_state dan isyarat Mealy detect, manakala process(slow_clk, KEY) berjam menyimpan keadaan dan latch dengan set semula tak segerak.
-- Kod permulaan: lengkapkan baris TODO sebelum sintesis.
-- Pelajaran 5 - Latihan 3-B: pengesan jujukan 1011 (FSM Mealy) dengan pengesanan tersimpan.
-- SW(0)=bit input bersiri. KEY(0)=set semula. LEDR(0)=latch pengesanan.
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)
);
end entity blink;
architecture rtl of blink is
type state_t is (S0, S1, S2, S3, S4);
signal state, next_state : state_t := S0;
signal detect, detected_latch : std_logic := '0';
constant DIV : unsigned(26 downto 0) := to_unsigned(33333333, 27);
signal div_count : unsigned(26 downto 0) := (others => '0');
signal slow_clk : std_logic := '0';
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 <= S0;
detect <= '0';
case state is
when S0 => TODO_TRANSITION_FROM_S0;
when S1 => TODO_TRANSITION_FROM_S1;
when S2 => TODO_TRANSITION_FROM_S2;
when S3 => TODO_TRANSITION_FROM_S3_AND_DETECT;
when S4 => TODO_TRANSITION_FROM_S4;
end case;
end process;
process(slow_clk, KEY)
begin
if KEY(0) = '0' then
state <= S0; detected_latch <= '0';
elsif rising_edge(slow_clk) then
state <= next_state;
if TODO_DETECT_CONDITION then detected_latch <= '1'; end if;
end if;
end process;
LEDR(0) <= detected_latch;
LEDR(5 downto 1) <= "00001" when state = S0 else
"00010" when state = S1 else
"00100" when state = S2 else
"01000" when state = S3 else
"10000";
LEDR(9 downto 6) <= (others => '0');
end architecture rtl;Bolehkah anda meramalkan dengan tepat bila detect dicetuskan hanya dengan memerhatikan LED keadaan LEDR(5 downto 1), *tanpa* mengetahui SW(0)? Gunakan jawapan anda untuk menerangkan sebab output ini ialah Mealy, bukan Moore.
Sambungan pilihan pada papan: masukkan bit dan pulih
12 min
Sekarang bina pengesan dan masukkan bit secara manual. Cara memasukkan satu bit: tetapkan SW(0) kepada nilai bit, kemudian tunggu satu detik jam perlahan penuh, kira-kira 1.33 s, supaya mesin mensampelnya pada pinggir menaik berikutnya. Selepas itu tukar SW(0) kepada bit seterusnya dan tunggu lagi. Perhatikan LEDR(5 downto 1) untuk mengikuti keadaan.
Dalam
blink.vhd, gantikan semua kandungan dengan kod permulaan pengesan1011di atas. Lengkapkan setiap peralihan dan syarat TODO, kekalkan entitiblinkdan kekalkanCLOCK_50 : in std_logic.Klik Synthesize, tunggu hingga berjaya, kemudian klik Upload to FPGA.
Tetapkan semula dahulu. Tekan dan lepaskan
KEY(0).LEDR(0)(dikesan) sepatutnya padam dan LED keadaanLEDR(5 downto 1)menunjukkan S0 (00001).Masukkan
1, 0, 1, 1. TetapkanSW(0) = 1, tunggu kira-kira 1.33 s; tetapkan0, tunggu; kemudian1, tunggu; akhirnya1, tunggu. Selepas1terakhir,LEDR(0)sepatutnya tersimpan menyala. Rekod LED keadaan selepas setiap bit.Tetapkan semula, kemudian masukkan
1, 0, 1, 0, 1, 1, dengan satu bit salah di tengah. Mesin tidak sepatutnya mencetus secara palsu, perlu pulih dan masih mengesan1011pada akhir denganLEDR(0)tersimpan menyala. Ini menunjukkan FSM pulih daripada bit salah dan tidak tersekat.Gunakan set semula setiap kali hendak memulakan aliran baharu; hanya set semula memadam
LEDR(0)yang tersimpan.
Masukkan aliran bit 1,0,1,1, satu bit bagi setiap detik jam perlahan, kira-kira 1.33 s setiap satu. Selepas setiap bit, baca keadaan daripada LEDR(5 downto 1), one-hot 00001=S0, 00010=S1, 00100=S2, 01000=S3 dan 10000=S4, serta catat sama ada LEDR(0), dikesan, telah tersimpan menyala. Pengesanan sepatutnya tersimpan selepas 1 terakhir.
| Bit dimasukkan (SW(0)) | LEDR(5 downto 1) diperhatikan (one-hot) | LEDR(0) dikesan? (menyala/padam) |
|---|---|---|
Hantar bukti anda. Selepas memasukkan 1, 0, 1, 1, LEDR(0) (dikesan) tersimpan menyala hingga set semula, iaitu keadaan stabil yang boleh difoto. Ambil tangkap layar kamera yang menunjukkan LEDR(0) tersimpan menyala dan lampirkannya.
Sambungan pilihan jika masih ada masa: ubah suai pengesan untuk mengenal 101 dan bukan 1011. Mula-mula lukis rajah keadaan baharu: anda memerlukan keadaan “belum dipadankan”, “padan 1” dan “padan 10”; output pengesanan perlu dicetuskan apabila bit seterusnya ialah 1 dalam keadaan “padan 10”. Jika dilaksanakan, kekalkan latch dan paparan one-hot, jalankan sintesis, muat naik dan sahkan bahawa memasukkan 1, 0, 1 menyimpan LEDR(0) menyala.
Adakah output Mealy mentah detect berdaftar, disimpan dalam flip-flop, atau gabungan, dikira terus daripada keadaan dan input? Apakah masalah pemasaan yang boleh disebabkan oleh output Mealy gabungan, dan bagaimana hal itu berkait dengan sebab LEDR(0) disimpan?
Andaikan isyarat mentah detect satu detik disambung terus ke LEDR(0) dan tidak disimpan. Pada jam perlahan kira-kira 1.33 s, apakah yang mungkin kelihatan pada kamera ketika 1011 dikesan, dan mengapakah bukti itu tidak boleh dirakam dengan andal?
Dalam langkah 5, anda memasukkan 1, 0, 1, 0, 1, 1 dan mesin masih mengesan 1011 pada akhir. Terangkan secara ringkas cara FSM pulih daripada bit salah dan tidak tersekat atau mencetus secara palsu.
Perkara yang anda bina
4 min
Anda membina pengawal lampu isyarat Moore pada DE1-SoC sebenar: outputnya bergantung pada keadaan sahaja dan ia bergerak GREEN -> YELLOW -> RED menggunakan pemasa tempoh. Dalam sambungan pilihan, anda turut meneroka pengesan jujukan 1011 Mealy yang output detect-nya bergantung pada keadaan dan input bersama-sama. Anda menggunakan bentuk FSM piawai: daftar keadaan berjam, blok gabungan keadaan seterusnya dengan nilai lalai dan logik output. Anda juga melihat cara set semula tak segerak aktif-rendah mengembalikan FSM berjam perlahan ke keadaan diketahui serta-merta dan, dalam sambungan, sebab output satu detik disimpan supaya kamera jauh dapat menangkapnya.
Jujukan manakah sepadan dengan kerja anda bagi setiap latihan dalam pelajaran ini?
Dalam tiga atau empat ayat: terangkan sebab lampu isyarat ialah mesin Moore dengan merujuk logik output; nyatakan perbezaan antara daftar state dan timer; huraikan perubahan tempoh yang diuji; dan namakan satu langkah yang memerlukan kekutuban aktif-rendah KEY atau set semula tak segerak. Jika anda melakukan pengesan pilihan, tambah satu ayat tentang sebab ia Mealy atau sebab LEDR(0) disimpan.