Mengatur Waktu Transisi
Termasuk bagian Dasar-Dasar dalam perjalanan Verilog di Coddy. Pelajaran 81 dari 90.
Tantangan
Dalam pelajaran ini, kamu akan menambahkan logika counter yang mengatur berapa lama setiap lampu menyala. Counter menghitung mundur dari nilai yang telah ditetapkan hingga nol, lalu memicu perubahan state berikutnya.
Persyaratan Waktu
| State | Durasi | Nilai Counter |
|---|---|---|
| Green | 30 detik | 30 |
| Yellow | 10 detik | 10 |
| Red | 40 detik | 40 |
Cara Kerja Counter
- Saat sebuah state dimulai, counter diisi dengan nilai durasi
- Pada setiap clock tick, nilai counter berkurang 1
- Saat counter mencapai 0, saatnya berpindah ke state berikutnya
Tugasmu adalah menambahkan logika counter yang belum ada ke state machine. Input next dari langkah sebelumnya tidak lagi digunakan: counter kini menentukan kapan state berubah, dan testbench tidak lagi mengendalikan next.
Yang harus dilakukan:
- Hapus
input next,dari header module dan ganti kondisielse if (next)dengan logika counter di bawah ini - Tambahkan deklarasi
reg [5:0] counter(pertahankan jika kamu sudah mendeklarasikannya pada langkah pertama) - Saat reset, atur
counterke 0 - Saat
counter == 0:- Muat durasi state berikutnya ke dalam counter
- Beralih ke state berikutnya
- Jika tidak, kurangi counter sebesar 1 pada setiap clock
Coba sendiri
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// TODO: Deklarasikan register counter (6 bit)
// Penetapan output
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// Mesin keadaan dengan pengaturan waktu
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // Mulai dari Red
// TODO: Atur counter ke 0
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
// TODO: Isi counter untuk Yellow (10 detik)
end
1: begin
state <= 2;
// TODO: Isi counter untuk Red (40 detik)
end
2: begin
state <= 0;
// TODO: Isi counter untuk Green (30 detik)
end
endcase
end else begin
// TODO: Kurangi counter sebesar 1
end
end
end
endmoduleSemua pelajaran di Dasar-Dasar
1Pengantar
Apa Itu VerilogPerangkat Keras vs Perangkat LunakModul PertamamuKomentarTingkat Abstraksi Desain4Operator Bagian 1
Operator AritmetikaOperator ModuloOperator PerbandinganUlasan, Matematika SederhanaOperator Bitwise7Penugasan dan Gerbang
Penugasan KontinuPenugasan dengan OperatorPrimitif Gerbang BawaanGerbang AND, OR, NOTGerbang XOR, XNORUlasan: Rangkaian Gerbang Logika10Pengambilan Keputusan
Pernyataan IfIf - ElseRangkuman: Komparator SederhanaPernyataan CaseCasex dan CasezRangkuman: Desain ALU5Operator Bagian 2
Operator LogikaOperator ReduksiOperator GeserOperator PenggabunganOperator KondisionalRangkuman, Tantangan Operator3Sistem Bilangan
Representasi BinerBilangan BerukuranBilangan Tanpa UkuranBilangan NegatifNilai Khusus X dan ZRingkasan: Format Bilangan6Modul
Struktur ModulPort Input dan OutputPort InoutInstansiasi ModulPemetaan Port Berdasarkan NamaPemetaan Port Berdasarkan UrutanRangkuman: Bangun Modul9Blok Prosedural
Blok alwaysBlok initialDaftar SensitivitasPenugasan BlockingPenugasan Non-BlockingRangkuman: always vs initial15Pengendali Lampu Lalu Lintas
Menentukan StatusLogika Mesin StatusLatihan sendiri: Compiler Verilog online