まず、この質問をアルテラ フォーラム ( http://www.alteraforum.com/forum/showthread.php?t=40494 ) に提出したことを認めなければなりません。私はここでも質問しています。それは、まったく異なる聴衆である可能性が高いと思うからです。この重複した投稿がスタック オーバーフローのルールやエチケットに反する場合はお知らせください。削除します。そうでない場合は、ここで受け取った回答でフォーラムの投稿を更新し、その逆も行います。
I2C コアをオープンコアから Cyclone IV デバイスに統合しようとしています。どうやら私が使用しているバージョンは、SOPC にドロップして、いくつかの出力 ( alterawiki.com/wiki/I2C_(OpenCores) ) に接続した後に動作するはずです。コアは、エラーや警告なしでコンパイルされます。
コアの I2C ドキュメントには、6 つの関連レジスタが次々にアドレス指定されていることが示されています (PRERlo、PRERhi、CTR、TXR、RXR、CR、SR)。ただし、これらのレジスタに書き込もうとすると、コードから、またはデバッグ メモリ ウィンドウで手動で、間違ったアドレスに書き込みが行われます。
これを調査するために、VHDL でレジスタを初期値に設定し、デバッグ ウィンドウで結果を確認しました。これは、TXR と CR のレジスタ アドレスがドキュメントで提案されているものではないことを示しています。
Address 0 1 2 3
09866160 AA 00 00 00 -- PRERlo
09866164 00 00 00 00 -- PRERhi
09866168 BB 00 00 00 -- CTR
0986616C DD 00 00 00 -- RXR
09866170 FA 00 00 00 -- SR
09866174 CC 00 00 00 -- TX
09866174 EE 00 00 00 -- CR
これで問題ありませんが、アドレス 09866174 (TXR) に書き込もうとすると、値が 09866164 (PRERhi) に挿入されます。同様に、09866178 (CR) に書き込むと、値が 09866168(CTR) に挿入されます。これは、書き込みがコードから行われた場合でも、デバッグ ウィンドウから手動で行われた場合でも発生します。これらのレジスタへの書き込みは VHDL で正常に機能するため、これは特に混乱を招きます。
#define IOWR(base,offset,value) __builtin_stwio ((unsigned int*)BASE + OFFSET, (DATA));
IOWR(I2C_MASTER_BASE, 5, 0x1D);
シグナルタップからもこれをデバッグしようとしました。ただし、いずれのレジスタのトリガーも実装されていません。
ここで誰かが私を正しい方向に向けることができれば、本当に感謝しています。
ありがとう!
- 更新: コアの VHDL バージョンを使用しています。しかし、私は今のところタオルを捨てて、配線するとすぐに動作する Verilog バージョンを使用することにしました。アプリケーションが完成したら VHDL コアに戻るつもりで、そのときにもう一度更新します。