2

私は私のクラスの構造VHDLでROMを書いています。このデザインは6ビットアドレスを取り、6対64のバイナリデコーダーを介して実行します。各デコーダー出力は、トライステートインバーターで構成された単一の6ビットワードラインを有効または無効にします。ワードラインビット入力は、各ビットに対して「1」または「0」のいずれかです。最も重要なことは、すべてのワード行が同じ出力ベクトルに書き込むことです。

ザイリンクス9.2で構文を確認すると問題ありませんが、合成すると次のエラーが発生します。

ERROR:Xst:528 - Multi-source in Unit <ufm6bit> on signal <N0>
Sources are: 
   Output signal of BUFT instance <rom/word63rom/tri0/Z>
   Output signal of BUFT instance <rom/word62rom/tri0/Z> 
   Output signal of BUFT instance <rom/word...rom/tri0/Z> 
   Output signal of BUFT instance <rom/word00rom/tri0/Z> 

プログラムを使用してデコーダーVHDLを記述したため、ポートマップが大きすぎてここに配置できません(必要に応じてペーストビンに配置します)。単語行は次のようになります。

entity tribuffer6 is
  PORT (
    A : in  std_logic_vector(5 downto 0);
    E : in  std_logic;
    Z : out std_logic_vector(5 downto 0));
end tribuffer6;

使用する6つのトリバッファーは次のようになります。

entity tribuffer is
  Port ( A : in  std_logic;
         E : in  std_logic;
         Z : out std_logic);
end tribuffer;

architecture Behav of tribuffer is
begin

  z <= not a after 120 ps when e = '1' else
         'Z' after 120 ps;

end Behav;

最後に、ワードラインは次のように結び付けられます。

SIGNAL dataline : std_logic_vector(5 downto 0);

word00rom : tribuffer6 PORT MAP (
                         A=>"000000",
                         Z=>dataline,
                         E=>word00en );
word01rom : tribuffer6 PORT MAP (
                         A=>"000000",
                         Z=>dataline,
                         E=>word01en );

エラーから、VHDLがその行に複数のドライバーを配置することに満足していないことは明らかですが、64個のバッファーベクトルを作成し、それらをチェーンしてチェックを無効にする方法はありません。また、64層の深さのORツリーも実用的ではありません。これでVHDLを正常にするには、何をする必要がありますか?

更新:いくつかのことを明確にする必要があります。ザイリンクス9.2は無料で、私の大学は安いので、クラスの要件です。唯一の基本的なゲート(および、または、nand、tristateではない)は動作可能であり、他のすべては構造的である必要があります。そして、CでVHDLを生成したのはROMでした。それ以外の場合は、多くの入力が必要だったからです。

4

2 に答える 2

1

これを合成したい場合は、ORツリーのコードを記述したほうがよいでしょう。

私が知っている(現在の)デバイスは、内部トライステートに満足することはありません。シンセサイザーは(あなたのように見えるように)窒息するか、(多かれ少なかれ静かに)あなたのためにそれを粘液の木に変換します。

このスレッドを参照してください:

http://forums.xilinx.com/t5/Spartan-Family-FPGAs/What-is-BUFT-in-this-RTL/td-p/111838

于 2012-10-05T12:31:15.533 に答える
-1

std_ulogic_vectorではなくstd_logic_vectorを使用しているため、複数のソースが「データライン」信号を駆動することは合法です。これは有効なVHDLであり、シミュレーションで正常に機能するはずです。割り当てが承認されるには、これで十分だと思います。

FPGAには通常、内部トライステートバッファがありません。つまり、合成しようとしているFPGA内に値「Z」の概念はありません。(ただし、通常、ピンにはトライステートバッファがあるため、出力ピンを「Z」に駆動することができます。)これが、合成が失敗する理由です。ASIC用の合成ツール(Synopsys DesignCompilerなど)にアクセスできる場合は、それを試してみることができます。これはおそらく機能します。

また、FPGAでもASICでも、明示的な遅延(待機、後)は合成できないことに注意してください。

于 2012-10-05T09:22:07.320 に答える