มีปัญหาในซอฟต์แวร์ Quartus® II เวอร์ชั่น 8.1 ที่อาจทําให้สัญญาณ Tri-State VHDL ถูกอนุมานอย่างไม่ถูกต้องในฐานะตัวกล้ําสัญญาณแบบมัลติเพล็กซ์ หากเชื่อมต่อสัญญาณเข้ากับพินเอาต์พุตของอุปกรณ์ ผลการคอมไพล์อาจทําให้เกิดพินที่จะขับออกจากบอร์ดแทนที่จะทําหน้าที่เป็นเอาต์พุต Tri-State
ปัญหาซอฟต์แวร์เกิดขึ้นก็ต่อเมื่อหน่วยงานออกแบบ VHDL มีพอร์ตเอาต์พุตที่ไม่ได้ใช้โดยมีค่าเริ่มต้นที่รวม 'Z'
อยู่ (กล่าวคือ พอร์ตเอาต์พุตมีการ 'Z'
มอบหมาย tri-state ในการประกาศของหน่วยงาน แต่ไม่มีการมอบหมายอย่างชัดแจ้งไปยังสัญญาณในการออกแบบ) เมื่อปัญหาเกิดขึ้น ตรรกะ Tri-State ที่ป้อนเข้ามาใดๆ ที่อธิบายโดยคําแถลงพฤติกรรมในสถาปัตยกรรมที่ปิดล้อมจะถูกป้อนเข้าอย่างไม่ถูกต้องในฐานะตัวกล้ํา ปัญหาดังกล่าวจะถูกจํากัดไว้ที่ลําดับชั้นเดียวในสถาปัตยกรรมและไม่ใช่ลําดับชั้นที่เกิดขึ้นทันที เว้นแต่ว่าหน่วยงานอื่นๆ จะมีพอร์ตเอาต์พุตประเภทเดียวกันกับพอร์ตเอาต์พุตที่ไม่ได้ใช้โดยมีค่าเริ่มต้นรวม 'Z'
โปรดดูตัวอย่างที่ตอนท้ายของโซลูชันนี้สําหรับการออกแบบขนาดเล็กที่แสดงให้เห็นถึงปัญหานี้
หากสัญญาณ Tri-State ที่ได้รับผลกระทบเป็นการเชื่อมต่อ Tri-State ภายใน การคาดว่าจะมีตัวคูณที่ป้อนเข้ามา เนื่องจากไม่มีตรรกะ tri-state ภายในในอุปกรณ์ Altera อย่างไรก็ตาม หากพอร์ตนิติบุคคลที่ Tri-state ป้อนพิน I/O บนอุปกรณ์ ลักษณะการทํางานของซอฟต์แวร์นี้อาจทําให้เกิดพินเอาต์พุตที่ไม่ได้ใช้เพื่อขับเคลื่อนไปยังบอร์ดแทนที่จะทําหน้าที่เป็นเอาต์พุต Tri-State ซึ่งอาจทําให้เกิดการคอนเทนต์สัญญาณในระบบ
ในการแก้ไขปัญหาและอนุมานพฤติกรรม tri-state ที่กําหนด ให้กําหนดพินเอาต์พุตที่ไม่ได้ใช้อย่างชัดแจ้งไปยังค่า Tri-State โดยใช้การกําหนดสัญญาณในการออกแบบ แทนที่จะพึ่งพาคําสั่งเริ่มต้น ตัวอย่างเช่น ใช้คําสั่งเช่น unused_output <= 'Z';
หรือ unused_output <= (others => 'Z');
มีโปรแกรมแก้ไขเพื่อแก้ไขปัญหานี้ในซอฟต์แวร์ Quartus II เวอร์ชั่น 8.1 ดาวน์โหลด Windows patch 0.34 หรือ Linux patch 0.34 แล้วติดตั้งโปรแกรมแก้ไขและคอมไพล์การออกแบบใหม่
ปัญหาซอฟต์แวร์นี้จะได้รับการแก้ไขในเวอร์ชันในอนาคตของซอฟต์แวร์ Quartus II
ต่อไปนี้เป็นการออกแบบตัวอย่างที่ได้รับผลกระทบจากปัญหานี้:
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;
หากต้องการอนุมานพฤติกรรม Tri-State ที่ถูกต้องสําหรับพินผลลัพธ์ทั้งสองในตัวอย่างการออกแบบด้านบนด้วยซอฟต์แวร์ Quartus II เวอร์ชั่น 8.1 ให้เพิ่มคําสั่งต่อไปนี้ในสถาปัตยกรรม: unused_output <= 'Z';