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.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
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.
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ện | Trạng thái sau | 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 | Luôn luôn | IDLE | 0 | 1 |
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.
Xem dữ liệu dạng sóng
| Tín hiệu | Dạng sóng | Giá trị bus |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| state after | 2.34 | BUSY → DONE → IDLE |
| busy after | 1.0. | |
| done after | 0.10 |
RTL tách chuyển trạng thái khỏi lưu trữ
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.