Menu
CoddyTech

Xác định các trạng thái

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 79 trên 90.

challenge icon

Thử thách

Bộ điều khiển đèn giao thông là một máy trạng thái hữu hạn, tuần tự chuyển qua các trạng thái đèn khác nhau (Đỏ, Vàng, Xanh) theo những khoảng thời gian cụ thể. Máy trạng thái hữu hạn (FSM) là một mạch có thể ở một trong số trạng thái giới hạn. Mạch chuyển từ trạng thái này sang trạng thái khác dựa trên đầu vào hoặc thời gian.

Trong dự án này, bạn sẽ xây dựng một bộ điều khiển đèn giao thông cho một giao lộ đơn giản. Đèn giao thông có ba đầu ra:

ĐènĐầu raÝ nghĩa
Đỏred = 1Dừng
Vàngyellow = 1Thận trọng
Xanhgreen = 1Đi

Đèn chuyển trạng thái theo thứ tự này:

Green → Yellow → Red → Green → …

Chuỗi thời gian

Trạng tháiThời lượngTrạng thái tiếp theo
Green30 giâyYellow
Yellow10 giâyRed
Red40 giâyGreen

Trong bài học này, bạn sẽ định nghĩa các trạng thái cho bộ điều khiển đèn giao thông.

Đèn giao thông có ba trạng thái khả dĩ:

Trạng tháiĐènCode
GreenĐèn xanh BẬT2'b00
YellowĐèn vàng BẬT2'b01
RedĐèn đỏ BẬT2'b10

Hoàn thiện module bằng cách thêm những phần còn thiếu.

Cần làm:

Định nghĩa cách mã hóa trạng thái: 0=Xanh, 1=Vàng, 2=Đỏ

  1. Khai báo thanh ghi 2 bit có tên state
  2. Khai báo thanh ghi 6 bit có tên counter (để tính thời gian tối đa 40 giây). Thanh ghi này chưa được dùng ở bước này: logic thời gian sử dụng nó sẽ được thêm sau trong dự án, ở bước Định thời chuyển trạng thái
  3. Thêm các phép gán đầu ra bên trong khối always tổ hợp, always @(*) begin ... end, với case (state) bên trong. red, yellow và green được khai báo là output reg, và chỉ có thể gán giá trị cho reg bên trong khối như vậy. @(*) nghĩa là khối sẽ chạy lại mỗi khi bất kỳ giá trị nào mà nó đọc thay đổi, ở đây là state:
    • Khi state bằng 0: green = 1, yellow = 0, red = 0
    • Khi state bằng 1: green = 0, yellow = 1, red = 0
    • Khi state bằng 2: green = 0, yellow = 0, red = 1

Tự làm thử

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // TODO: Nhiệm vụ 1: Khai báo thanh ghi trạng thái (2 bit)
  
  // TODO: Nhiệm vụ 2: Khai báo thanh ghi bộ đếm (6 bit)
  

  // TODO: Nhiệm vụ 3: Gán giá trị đầu ra bằng case (state)
  // Trạng thái 0: green=1, yellow=0, red=0
  // Trạng thái 1: green=0, yellow=1, red=0
  // Trạng thái 2: green=0, yellow=0, red=1

endmodule

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online