Quartus® II ソフトウェア・バージョン 8.1 に問題があり、VHDL トライステート信号がマルチプレクサーとして誤って推論される可能性があります。信号がデバイスの出力ピンに接続されている場合、コンパイル結果、ピンがトライステート出力として機能するのではなく、ボードにドライブアウトする可能性があります。
このソフトウェアの問題は、VHDL デザイン・エンティティーにデフォルト値が含まれている未使用の出力ポートが含まれている場合にのみ発生します 'Z'
(つまり、出力ポートには 'Z'
エンティティー宣言にトライステートの割り当てが存在しますが、デザインの信号に明示的な割り当てはありません)。問題が発生した場合、外側のアーキテクチャーの動作ステートメントで記述された推論されたトライステート・ロジックは、正しくマルチプレクサーとして推論されません。この問題はアーキテクチャー内の単一の階層に限定され、インスタンス化されたグループは存在しません。ただし、他のエンティティーにデフォルトの値を含む未使用の出力ポートが同じタイプでない限り、 'Z'
この問題を説明する小さなデザインについては、このソリューションの最後にある例を参照してください。
影響を受けるトライステート信号が内部トライステート接続の場合、Alteraデバイスに内部トライステート・ロジックがないため、マルチプレクサーの推論が期待されます。ただし、トライステート・エンティティー・ポートがデバイス上の I/O ピンを供給する場合、このソフトウェア動作により、未使用の出力ピンがトライステート出力として動作する代わりにボードにドライブアウトし、システムの信号競合を引き起こす可能性があります。
問題を回避し、定義されたトライステート動作を推論するには、デフォルトのステートメントに依存するのではなく、デザインの信号割り当てを使用して、未使用の出力ピンをトライステート値に明示的に割り当てます。例えば、次のようなステートメントを使用 unused_output <= 'Z';
するか、 unused_output <= (others => 'Z');
Quartus® II ソフトウェア・バージョン 8.1 でこの問題を解決するためのパッチが利用可能です。 Windows* パッチ 0.34 または Linux* パッチ 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;
上記のデザイン例の Quartus® II ソフトウェア・バージョン 8.1 で両出力ピンの正しいトライステート動作を推論するには、アーキテクチャーに次のステートメントを追加します。 unused_output <= 'Z';