ここで以前の質問を参照すると、私はトライステートを利用して一般的なバスを操作してきました。まだいくつかの実装上の問題があるようです。
トライステートは、次のタイプのコードを使用します。
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になっているのでしょうか? しかし、これは私には意味がありません。なぜなら、トライステートがアクティブになると、信号は制御されるはずのエンティティによって制御されなければならないからです。
時間をかけてトライステートではなくロジックにコードを置き換えたいのですが、どうすればよいかわかりません。
どんな助けでも大歓迎です。