Menu
CoddyTech

Mengatur Waktu Transisi

Termasuk bagian Dasar-Dasar dalam perjalanan Verilog di Coddy. Pelajaran 81 dari 90.

challenge icon

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

StateDurasiNilai Counter
Green30 detik30
Yellow10 detik10
Red40 detik40

Cara Kerja Counter

  1. Saat sebuah state dimulai, counter diisi dengan nilai durasi
  2. Pada setiap clock tick, nilai counter berkurang 1
  3. 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:

  1. Hapus input next, dari header module dan ganti kondisi else if (next) dengan logika counter di bawah ini
  2. Tambahkan deklarasi reg [5:0] counter (pertahankan jika kamu sudah mendeklarasikannya pada langkah pertama)
  3. Saat reset, atur counter ke 0
  4. Saat counter == 0:
    • Muat durasi state berikutnya ke dalam counter
    • Beralih ke state berikutnya
  5. 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

endmodule

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Compiler Verilog online