Tôi đã cố gắng viết một máy trạng thái hữu hạn trong mã VHDL cho bộ xử lý 16 bit đơn giản mà tôi đang triển khai trên bảng Altera DE1. Trong máy trạng thái hữu hạn, tôi có một câu lệnh CASE
xử lý các lệnh 16 bit khác nhau, được đưa vào FSM bằng STD_LOGIC_VECTOR 16 bit. Tuy nhiên, tôi đang gặp một chút rắc rối ở trạng thái giải mã, nơi Máy hữu hạn của Tiểu bang giải mã lệnh. Một trong các hướng dẫn là một ADD mất hai thanh ghi làm toán hạng và thứ ba là thanh ghi đích. Tuy nhiên, tôi cũng có một lệnh ADD trong đó có một thanh ghi và một giá trị ngay lập tức 5 bit như các toán hạng và một thanh ghi thứ hai cho đích. Vấn đề của tôi là trong câu lệnh CASE
, tôi cần có khả năng phân biệt giữa hai hướng dẫn ADD khác nhau. Vì vậy, tôi nghĩ rằng nếu tôi sử dụng các giá trị ký tự đại diện như "-" hoặc "X" trong câu lệnh CASE
, tôi có thể phân biệt giữa hai chỉ với hai trường hợp thay vì liệt kê tất cả các kết hợp giá trị đăng ký/giá trị có thể có. Ví dụ:VHDL STD_LOGIC_VECTOR Giá trị ký tự đại diện
CASE IR IS --(IR stands for "Instruction Register")
WHEN "0001------0-----" => (Go to 3-register add);
WHEN "0001------1-----" => (Go to 2-register/immediate value add);
WHEN OTHERS => (Do whatever);
END CASE;
Đây không phải là hai chỉ dẫn tôi có, tôi chỉ cần đặt hai hướng này để làm cho bài đăng này ngắn hơn một chút. Khi tôi biên dịch và chạy mã này, bộ xử lý ngừng thực thi khi nó được chuyển sang trạng thái "giải mã". Ngoài ra, Quartus cho nhiều, nhiều cảnh báo nói những điều như "cảnh báo lựa chọn VHDL tại LC3FSM.vhd (37): bỏ qua lựa chọn có chứa giá trị meta" "0001 ------ 0 -----" "" Tôi tại một mất mát như thế nào để đi về việc hoàn thành điều này. Tôi thực sự không và có lẽ không cần phải xác định tất cả các kết hợp 16-bit, và tôi hy vọng có một cách để sử dụng các ký tự đại diện trong một STD_LOGIC_VECTOR để giảm thiểu số lượng các kết hợp mà tôi sẽ phải xác định.
Có ai biết cách thực hiện điều này không?
Cảm ơn
Aha, cảm ơn rất nhiều, Paul Seeb đã đề xuất. Sau khi tôi hỏi câu hỏi ngày hôm qua, tôi đã nghĩ đến việc sử dụng câu lệnh 'CASE' cho mỗi mã hoạt động, và sau đó sử dụng câu lệnh' IF' để thực hiện các so sánh cần thiết khác. Phương pháp đầu tiên của bạn, mặc dù làm cho mã ngắn hơn một chút, vì vậy tôi đã sử dụng nó. Cảm ơn bạn, cũng Mark Thompson cho đề xuất của bạn, là tốt. –