28 / 37 · Konsep
Mesin keadaan: memisahkan keadaan, transisi, dan keluaran
Bangun FSM dari tabel spesifikasi dan bandingkan Moore/Mealy, keadaan ilegal, serta kebijakan permintaan.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Keadaan merangkum hanya masa lalu yang diperlukan
Jika masukan sekarang tidak cukup menentukan keluaran, definisikan keadaan tersimpan. Alih-alih menyimpan seluruh riwayat, bedakan hanya informasi yang diperlukan untuk menentukan perilaku masa depan.
Pertimbangkan pengontrol mulai dan selesai: IDLE menunggu, BUSY memproses, DONE menandai selesai satu siklus.
| Keadaan sekarang | Kondisi | Keadaan berikutnya | busy | done |
|---|---|---|---|---|
| IDLE | start=0 | IDLE | 0 | 0 |
| IDLE | start=1 | BUSY | 0 | 0 |
| BUSY | work_done=0 | BUSY | 1 | 0 |
| BUSY | work_done=1 | DONE | 1 | 0 |
| DONE | Selalu | IDLE | 0 | 1 |
busy dan done adalah keluaran keadaan sekarang. Setelah tepi yang menerima selesai pada BUSY, keadaan menjadi DONE dan done=1: ini keluaran Moore.
Setiap kolom mengamati tepi naikTepi naik Saat clock berubah 0 ke 1, berbeda dari tingkat yang mencakup seluruh interval CLK=1. Selengkapnya, masukan sebelum dan keadaan after sesudah; penjajaran bukan tundaan fisikTundaan propagasi Waktu sejak masukan berubah hingga keluaran stabil pada nilai benar. Kesetaraan logika berbeda dari karakteristik waktu. Selengkapnya. Dari IDLE, penerimaan work_done membawa keadaan ke DONE dan done=1 setelah tepi. Setelah DONE, selalu kembali IDLE tanpa bergantung start.
Lihat data gelombang
| Sinyal | Gelombang | Nilai bus |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| keadaan sesudah | 2.34 | BUSY → DONE → IDLE |
| busy sesudah | 1.0. | |
| done sesudah | 0.10 |
RTL yang memisahkan transisi dan penyimpanan
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;
state_t state, next_state;
always_comb begin
next_state = state;
case (state)
IDLE: if (start) next_state = BUSY;
BUSY: if (work_done) next_state = DONE;
DONE: next_state = IDLE;
default: next_state = IDLE;
endcase
end
always_ff @(posedge clk)
if (rst) state <= IDLE;
else state <= next_state;
assign busy = (state == BUSY);
assign done = (state == DONE);Contoh SystemVerilog ini menjelaskan struktur kontrol. Pembentukan work_done oleh pemroses terkait serta sinkronisasi masukan perlu diimplementasikan terpisah.
Pertanyaan yang mudah terlewat
Rangkaian ini mengabaikan start pada BUSY dan DONE. Untuk menerima permintaan baru saat selesai, ubah tabel transisi dahulu. Keluaran Mealy memakai keadaan dan masukan sekarang agar cepat bereaksi, tetapi timing serta glitch jalur kombinasional harus diperiksa. Enkode biner/one-hotOne-hot Representasi dengan tepat satu bit bernilai 1. Jika semua nol juga diizinkan, istilahnya one-hot-or-zero. Selengkapnya dan klasifikasi Moore/Mealy adalah keputusan berbeda.
Coba sendiri
start=1 selama satu siklus pada DONE. Apakah FSM langsung memulai pekerjaan baru? Apa yang diubah agar pekerjaan berurutan diizinkan?
Baca penjelasan
Tidak: DONE→IDLE mengabaikan permintaan itu. Tambahkan transisi DONE→BUSY jika start, atau protokol penyimpanan permintaan. Verifikasi ulang durasi done dan waktu penerimaan menurut kontrak baru.