2

ここで以前の質問を参照すると、私はトライステートを利用して一般的なバスを操作してきました。まだいくつかの実装上の問題があるようです。

トライステートは、次のタイプのコードを使用します。

assign io [幅-1:0] = (re)?rd_out [幅-1:0]:{幅{1'bz}};

合成と翻訳はうまくいきます。予期していなかった警告やエラーは発生しませんでした (これは試験的な実行にすぎず、ほとんどのコンポーネントは何も実行せず、未接続のままになるため、警告やエラーが発生することを予期していました)。しかし、実際に実装しようとすると、すべてのバス (3 つある) が 1111111111111111 または -1 を出力し、バイナリから BCD コンバーターに変換されます。バス上で受信した命令が -1 の場合に停止するように制御マトリックスに指示することで、実際にそうであるかどうかを確認したところ、停止しました。

トライステートがロジックに変換されたときに受け取る警告は次のとおりです。

Xst:2040 - ユニット Neptune_I: 16 個のマルチソース信号がロジックに置き換えられます (プルアップあり)

Xst:2042 - ユニット alu: 16 個の内部トライステートがロジックに置き換えられます (プルアップあり):

等々。Neptune_I は最上位のモジュールであり、それが参照しているマルチソース信号はバスだと思います。

プルアップのイエスがこの問題の根源であるかどうかは疑問です。それは単にすべてを引き上げて、常に-1になっているのでしょうか? しかし、これは私には意味がありません。なぜなら、トライステートがアクティブになると、信号は制御されるはずのエンティティによって制御されなければならないからです。

時間をかけてトライステートではなくロジックにコードを置き換えたいのですが、どうすればよいかわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

3

これらの信号はチップの外に出ていますか? それとも、FPGA の内部にあるのでしょうか? 答えが後者の場合は、コードを変更する必要があります。最新の FPGA (Spartan 6 など) は、内部トライステート バッファーをサポートしなくなりました。それらはオフチップ信号用にのみ存在します。

トライステート バッファを回避するには、すべての内部コードを記述する必要があります。コンポーネント間に専用パスを作成し、双方向インターフェースは作成しません。

于 2014-07-29T13:06:57.497 に答える