Altifigence Academy

28 / 37 · Khái niệm

Máy trạng thái: tách trạng thái, chuyển và đầu ra

Viết FSM từ bảng đặc tả; so Moore, Mealy, trạng thái bất hợp lệ và chính sách yêu cầu.

Trạng thái chỉ tóm tắt lịch sử cần thiết

Khi đầu ra không chỉ do đầu vào hiện tại quyết định, định nghĩa trạng thái cần lưu. Không lưu toàn bộ lịch sử; chỉ phân biệt những khác biệt cần để quyết định hành vi tương lai.

Sk+1=F(Sk,Xk)S_{k+1}=F(S_k,X_k)

Xét bộ điều khiển khởi động và hoàn tất công việc. IDLE chờ yêu cầu, BUSY đang xử lý, DONE báo hoàn tất một chu kỳ.

Trạng thái hiện tạiĐiều kiệnTrạng thái saubusydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONELuôn luônIDLE01

busy và done là đầu ra của trạng thái hiện tại. Ví dụ sau cạnh thấy hoàn tất khi ở BUSY, trạng thái đổi DONE rồi done=1. Đây là đầu ra Moore.

Mỗi cột ghi lại quan sát tại một cạnh lênCạnh lên Khoảnh khắc clock chuyển 0 sang 1, khác với mức cao chỉ cả khoảng CLK=1. Tìm hiểu thêm. Đầu vào là giá trị ngay trước cạnh, còn trạng thái có tên chứa after là giá trị ngay sau cập nhật. Cách căn cột thể hiện thứ tự lấy mẫu, không mô tả độ trễ lan truyềnĐộ trễ lan truyền Thời gian từ khi đầu vào đổi đến khi đầu ra ổn định ở giá trị đúng. Tương đương logic và đặc tính thời gian là hai vấn đề riêng. Tìm hiểu thêm vật lý. Ban đầu IDLE. Sau cạnh chấp nhận work_done, trạng thái thành DONE và done=1. Sau DONE luôn là IDLE bất kể start.

Đầu ra Moore theo trạng thái hiện tại
Xem dữ liệu dạng sóng
Dữ liệu dạng sóng: mỗi ký tự là một khoảng; dấu chấm giữ trạng thái trước; p là một chu kỳ đồng hồ.
Tín hiệuDạng sóngGiá trị bus
edge2345E0 → E1 → E2 → E3
start10.1
work_done0.10
state after2.34BUSY → DONE → IDLE
busy after1.0.
done after0.10

RTL tách chuyển trạng thái khỏi lưu trữ

SystemVerilog
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);

Đây là ví dụ SystemVerilog giải thích cấu trúc điều khiển. Tạo work_done của bộ xử lý nối vào và đồng bộ đầu vào phải cài riêng.

Câu hỏi đặc tả dễ bỏ sót

Mạch trên bỏ qua start ở BUSY và DONE. Muốn nhận yêu cầu mới đồng thời hoàn tất, phải đổi bảng chuyển trước. Đầu ra Mealy dùng trạng thái và đầu vào hiện tại nên phản ứng nhanh, nhưng cần xét thời gian, glitch trên đường tổ hợp. Chọn mã trạng thái binary hay one-hotOne-hot Biểu diễn có đúng một bit bằng 1. Nếu cho phép cả trường hợp tất cả bằng 0, gọi riêng là one-hot-or-zero. Tìm hiểu thêm khác với phân loại Moore/Mealy.

Tự thử

start=1 một chu kỳ khi đang DONE. FSM có lập tức bắt đầu việc mới không? Muốn cho phép việc liên tiếp cần đổi gì?

Đọc giải thích

Bảng trên DONE→IDLE nên không nhận yêu cầu đó. Có thể đổi DONE có start thành BUSY, hoặc thiết kế giao thức giữ yêu cầu. Khi ấy kiểm tra độ dài done và thời điểm chấp nhận theo đặc tả mới.

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.