2012-02-09 33 views
5

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

Trả lời

1

Giả sử bạn không cần các bit khác trong hướng dẫn bạn có thể hack theo cách của bạn xung quanh điều này bằng cách che các bit khác với một quá trình kiểm tra trước. (Hoặc chỉ cần đảm bảo các bit khác được đặt lại khi bạn viết hướng dẫn?)

Đây thực sự là một chút hack.

IR giả sử được lưu giữ như là một biến

if IR(15 downto 12) == "0001" then 
    IR := IR_in(15 downto 12) & "0000000" & IR_in(5) & "00000"; 
else 
    IR := IR_in 
end if; 

CASE IR IS --(IR stands for "Instruction Register") 
    WHEN "0001000000000000" => (Go to 3-register add); 
    WHEN "0001000000100000" => (Go to 2-register/immediate value add); 
    WHEN OTHERS => (Do whatever); 
END CASE; 

Ngoài ra giả sử chỉ dẫn của bạn là khéo léo nghĩ ra (là bốn bit đầu tiên từ lệnh hoặc một cái gì đó dọc theo những đường?), Bạn có thể làm báo cáo trường hợp lồng nhau và làm sự khác biệt khi cần thiết trong các khối phụ đó.

+0

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. –

5

Thật không may là không thể thực hiện được. Thay vì bất ngờ đối với hầu hết người dùng, toán tử so sánh = và so sánh case thực hiện so sánh theo nghĩa đen. Điều này là do loại std_logic chỉ là một tập hợp các ký tự, xảy ra để thực hiện như giá trị logic do cách các chức năng khác (ví dụ: andor) được xác định.

VHDL-2008 giới thiệu một tuyên bố trường hợp mới case? thực hiện như bạn mong đợi - bạn sẽ cần phải thông báo cho trình biên dịch của bạn hoạt động ở chế độ VHDL 2008. Ngoài ra, có một nhà điều hành ?= trong VHDL 2008 so sánh hai giá trị, tính đến số - s.

Nếu bạn đang sử dụng trình biên dịch vẫn còn không hỗ trợ VHDL 2008, hãy khiếu nại với nhà cung cấp. Ngoài ra còn có một chức năng std_match cho phép bạn thực hiện so sánh trong các phiên bản VHDL cũ hơn, nhưng không có gì mà tôi biết để thực hiện công việc tuyên bố case theo cách đó.

+1

+1 cho "khiếu nại với nhà cung cấp"! – Philippe

+0

Một FYI cho những người, như tôi đã đến đây sau khi vấp phải cùng một vấn đề với ISE Xilinx: trường hợp mới "?" tuyên bố (giống như hầu hết các tính năng của VHDL-2008) không có trong bản v14.4 (bản phát hành hiện tại kể từ thời điểm viết bài này) và nó không rõ ràng khi nào hoặc nếu nó sẽ có mặt trong tương lai. – MartyMacGyver

+0

hỗ trợ beta cho trường hợp VHDL2008 'trường hợp? 'Là trong Vivado2014.3 xem [AR # 62005] (http://www.xilinx.com/support/answers/62005.html). Bạn chắc chắn không muốn giả định rằng nó sẽ hoạt động (như beta). –

Các vấn đề liên quan