FC2カウンター FPGAの部屋 キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする13(Writeはうまく行った)
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする13(Writeはうまく行った)

windyさんから、貴重なアドバイスを頂いてキャラクタ・ディスプレイ・コントローラ AXI4バス・スレーブIPにMicroBlazeからアクセスすることができた。windyさん、ありがとうございました。助かりました。windyさんのアドバイスは”キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする11(インプリメント3)”のコメント欄を参照ください。

そうか、M_AXI_DCとM_AXI_IC は、キャッシュ直結のインターコネクトだったのか?そう言われてみれば、構成とすれば、そうなるか。MicroBlaze Processor Reference Guide Embedded Development Kit EDK 13.4 UG081 (v13.4) のFigure 2-1: MicroBlaze Core Block Diagram を見るとよく分かる。図を下に引用する。
CDC_axi_slave_53_120324.png

・M_AXI_DCとM_AXI_IC はD-CacheとI-Cache に接続されている。cdc_axi_slave をM_AXI_DC のみに接続した。
CDC_axi_slave_52_120324.png

・microblaze_0 をダブルクリックして、設定ダイアログを表示させて、CacheタブのData Cache Featureで、High Address を0xc7ffffff から0xcfffffff に変更した。
CDC_axi_slave_54_120324.png

・cdc_axi_slave_0 のベースアドレスを0xc8000000 に変更した。つまり、D-Cache の範囲に入れた。(2012/04/02:下図でcdc_axi_slave_0 のメモリ・サイズを16Kbytes にしているが、計算の結果これでは足りない。800/8 * 600/8 *4 ≒ 30Kbytes 必要だ)
CDC_axi_slave_55_120324.png

・これでインプリメントした。SDKのProgram FPGAが使えないので、ChipScope からFPGAをコンフィグレーションした。

・Project Navigator からExport Hardware Design To SDK with Bitstream でSDKを立ち上げて、Cプロジェクトを作成した。

・SDKで.elf ファイルの右クリックメニューからDebug As を選択して、デバックモードへ。

・XMDでキャラクタ・ディスプレイ・コントローラ AXI4バス・スレーブIPに mwr コマンドでデータを書き込んだ。
CDC_axi_slave_56_120324.png

・ディスプレイにも表示された。
CDC_axi_slave_57_120324.png

・mwr 0xc800000c 0x0000fc45 のAXI4バスのタイミングチャートを下に貼っておく。
CDC_axi_slave_58_120324.png

抜けいてる信号もあるが、今ある信号を見るかぎりは大丈夫そうだ。

Writeは大丈夫そうだが、Readがおかしいみたいだ。

・mrd 0xc8000000 を実行すると、ERROR: Cannot Read from targetになって、Readすることができない。
CDC_axi_slave_59_120324.png

ChipScope でS_AXI_ARVALID でトリガをかけてもトリガがかからない。キャラクタ・ディスプレイ・コントローラ AXI4バス・スレーブIPにアクセスが来ないみたいだ。

これで、AXI4スレーブIPはとりあえず終了として、次は、このキャラクタ・ディスプレイ・コントローラ AXI4バス・スレーブIPをテストするAXI4バス・マスタIPを作ろうと思う。
  1. 2012年03月24日 09:22 |
  2. AXI4 Slave IPの作製
  3. | トラックバック:0
  4. | コメント:2

コメント

うまく行って良かったです。
リードだけ出来ないのはなぜでしょうね
XMDでアクセスしてエラーになっているという事はトランザクションが始まったままで終わっていないという事になりますが、ライトできているというのは変ですね。
WRAPバーストに対応していないという事ですが、CIPウィザードで生成したSlave BurstならINCRとWRAPは同じ扱いになるので曲がりなりに動くはずですが。
もしかしてこのIPってフルスクラッチで作ってますか?
MBのキャッシュが有効になっているとWRAPバーストでリードしてくるのでWRAPバーストに応答しない作りになっていればバスが固まってしまうのは納得です。
SDKが生成したinit_platform()でmain()の最初にキャッシュを有効化しているので、そのまま使っているならこれが原因かもしれません。
  1. 2012/03/25(日) 11:20:58 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

IPはフルスクラッチで作っています。
バスが固まる前に、S_AXI_ARVALIDが来ないので、自作スレーブIPは応答しようがありません。何かがおかしいみたいです。
という訳で、MicroBlaze につないでいても、良くわからないので、今度は自作マスタIPを作って、つないで検証することにします。
いろいろ、教えて頂いてありがとうございました。またよろしくお願いします。

  1. 2012/03/25(日) 17:57:24 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/2093-ca2859e4
この記事にトラックバックする(FC2ブログユーザー)