Có vấn đề trong phần mềm Quartus® II phiên bản 8.1 có thể khiến tín hiệu ba trạng thái VHDL được suy luận không chính xác là bộ ghép kênh. Nếu tín hiệu được kết nối với chân đầu ra thiết bị, kết quả biên dịch có thể khiến chân ổ đĩa ra bo mạch thay vì đóng vai trò là đầu ra ba trạng thái.
Sự cố phần mềm chỉ xảy ra nếu một thực thể thiết kế VHDL chứa một cổng đầu ra chưa được sử dụng với 'Z'
giá trị mặc định bao gồm (nghĩa là, 'Z'
cổng đầu ra có tác vụ ba trạng thái trong khai báo thực thể nhưng không chuyển nhượng rõ ràng cho tín hiệu trong thiết kế). Khi sự cố xảy ra, bất kỳ logic ba trạng thái được suy luận nào được mô tả bằng các tuyên bố hành vi trong kiến trúc bao gồm sẽ được suy luận không chính xác là bộ ghéi số. Sự cố này bị giới hạn ở hệ thống phân cấp duy nhất trong kiến trúc và không có bất kỳ hệ thống phân cấp tức thì nào, 'Z'
trừ khi các thực thể khác có cùng loại cổng đầu ra chưa sử dụng với giá trị mặc định bao gồm . Tham khảo ví dụ ở cuối Giải pháp này để có một thiết kế nhỏ minh họa vấn đề này.
Nếu tín hiệu ba trạng thái bị ảnh hưởng là kết nối ba trạng thái nội bộ, cần phải suy luận bội số bởi vì không có logic ba trạng thái nội bộ trong các Altera thiết bị. Tuy nhiên, nếu các cổng thực thể ba trạng thái cung cấp các chân I/O trên thiết bị, hành vi phần mềm này có thể khiến chân đầu ra chưa sử dụng ổ đĩa ra bo mạch thay vì hoạt động như một đầu ra ba trạng thái, có thể gây ra sự cạnh nhau về tín hiệu trong hệ thống.
Để giải quyết vấn đề và suy ra hành vi ba trạng thái được xác định, chỉ định rõ ràng các chân đầu ra chưa sử dụng vào một giá trị ba trạng thái bằng cách sử dụng một gán tín hiệu trong thiết kế, thay vì dựa vào tuyên bố mặc định. Ví dụ: sử dụng một tuyên bố như hoặc unused_output <= 'Z';
unused_output <= (others => 'Z');
Một bản vá có sẵn để khắc phục vấn đề này trong phần mềm Quartus II phiên bản 8.1. Tải xuống bản vá Windows 0.34 hoặc bản vá Linux 0.34, sau đó cài đặt bản vá và biên dịch lại thiết kế.
Vấn đề phần mềm này cũng sẽ được khắc phục trong phiên bản phần mềm Quartus II trong tương lai.
Dưới đây là một thiết kế ví dụ bị ảnh hưởng bởi sự cố này:
library ieee;
use ieee.std_logic_1164.all;
entity example is
port (
en : in std_logic;
data : in std_logic;
unused_output: out std_logic := 'Z';
other_output : out std_logic);
end example;
architecture rtl of example is
begin
-- other_output should be tri-state but won't be tri-state due to this problem
other_output <= data when en = '1' else 'Z';
end rtl;
Để suy ra hành vi ba trạng thái chính xác cho cả hai chân đầu ra trong ví dụ thiết kế ở trên với phần mềm Quartus II phiên bản 8.1 , thêm tuyên bố sau trong kiến trúc: unused_output <= 'Z';