FC2カウンター FPGAの部屋 AXI4マスタIPの作製3(インプリメント)
FC2ブログ

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

FPGAの部屋

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

AXI4マスタIPの作製3(インプリメント)

AXI4マスタIPの作製2(単体シミュレーション)”の続き。
単体シミュレーションを行なって大丈夫そうだったので、XPSでAXI4マスタIPをAddして、ISEでインプリメントしてみた。

・Atlys_XPS_CDC_SVGA_134\pcores\cdctest_axi_master_v1_00_a\dataフォルダのcdctest_axi_master_v2_1_0.mpd の名前を変更して、wr_error, rd_error ポートを追加した。

BEGIN cdctest_axi_master

...............


PORT wr_error = "", DIR = O
PORT rd_error = "", DIR = O


・Atlys_XPS_CDC_SVGA_134\pcores\cdctest_axi_master_v1_00_a\dataフォルダのcdctest_axi_master_v2_1_0.pao ファイルにcdctest_axi_master.v の項目を書いた。

lib cdctest_axi_master_v1_00_a cdctest_axi_master.vhd vhdl


・Atlys_XPS_CDC_SVGA_134\pcores\cdctest_axi_master_v1_00_a\hdl\vhdlフォルダにcdctest_axi_master.vhd をコピーした。

・XPSのPoject メニューからRescan User Repositoriesを選択し、リポジトリを更新した。

・CDCTEST AXI Master で右クリックメニューからAdd IPを選択する。
cdctest_axi_master_6_120402.png

・XPS Core Config ダイアログが立ち上がる。Userタブの画面。wr_error, rd_error信号が見える。
cdctest_axi_master_7_120402.png

・Systemタブの内容
cdctest_axi_master_8_120402.png

・Interconnect Settings for BUSIFタブの内容。
cdctest_axi_master_9_120402.png

すべてデフォルトにしてみた。

・次のInstantiate and Connect IPダイアログは、User will make necessary connections and settings のラジオボタンをクリックした。(独自のAXI4バスを新規作成して接続する予定だ)
cdctest_axi_master_10_120402.png

・cdc_axi_slave_0 のmicroblaze_0 へのAXIバス接続を解除した。

・microblaze_0のデータキャッシュの設定の設定を元に戻した。Hight Address 0xcfffffff → 0xc7fffffff

・AXI Interconnect v1.05a をAdd IPした。

・axi4_1 という名前を付けて生成した。(設定はデフォルトのまま)
cdctest_axi_master_12_120403.png

・cdctest_axi_master_0 のM_AXI とcdc_axi_slave_0 のS_AXI をaxi4_1 に接続した。
cdctest_axi_master_13_120403.png

・cdctest_axi_master_0のwr_error, rd_error ポートをExternal Ports に指定した。
・cdctest_axi_master_0のM_AXI のACLKをclock_generator_0::CLKOUT2 に接続した。
cdctest_axi_master_14_120403.png

・axi4_1 のACLK とARESETN を接続した。
cdctest_axi_master_16_120403.png

・Addressタブでcdc_axi_slave_0 のアドレスを0x00000000 番地から0x00007fff 番地の32Kバイトに変更した。
cdctest_axi_master_15_120403.png

・cdctest_wr_error とcdctest_rd_error ポート用の制約をUCFファイルに書き加えた。LEDはIPにすでに使われているので、PMODコネクタのピンとして割り当てた。

NET "cdctest_wr_error" LOC = "T3"; #PMOD for test
NET "cdctest_rd_error" LOC = "R3"; #PMOD for test



・ProjectメニューからDesign Rule Check を行ったがエラーはなかった。
cdctest_axi_master_17_120403.png

・念のため、ProjectメニューからClean All Generated Files を実行した。(この時、SDKのフォルダの中身も全て消えてしまうので注意)

・XPSを終了して、Project Navigator に戻りインプリメントを行った。(Project Navigator でも念のため、ProjectメニューからClenup Project Files を実行した)

・インプリメントが終了した。ビットファイルをダウンロードしてみた。

・0.2秒間隔でランダムな数のキャラクタが表示された。
cdctest_axi_master_19_120404.jpg

・これでうまく行ったと思っていた。しかしある所で止まってしまう。それはなぜだろうか?ChipScope でトラブルシュートする。

・ChipScope で問題の部分を捉えたのが下の図だ。
cdctest_axi_master_18_120403.png

これは、cdc_axi_slave.vhd つまりAXI4スレーブIPにChipScope をかけた時のタイミングチャートを表す。S_AXI_ARLENがFFの時に、S_AXI_RREADY が1のままで、全くReadされていない。

cdc_axi_slave.vhd のソースを見る。rd_cdc_count の処理の部分を下に示す。

    -- rd_cdc_count の処理(CDC側のデータカウント)
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                rd_cdc_count <= (others => '0');
            else
                if rdt_cs=arr_accept then -- ロード
                    rd_cdc_count <= S_AXI_ARLEN + 1;
                elsif rdt_cs=rd_burst and rdfifo_almost_full='0' and rd_cdc_count/=0 then -- FIFOに余裕がある
                    rd_cdc_count <= rd_cdc_count - 1;
                end if;
            end if;
        end if;
    end process;


ロードの時にrd_cdc_countにS_AXI_ARLEN + 1を入れている。S_AXI_ARLENが0xFF の時は1つ桁が上がって、0x100になる。rd_cdc_countの宣言は下に示すように、7 downto 0と宣言してあった。

signal rd_cdc_count : std_logic_vector(7 downto 0);


上の宣言を下に書き換えた。

signal rd_cdc_count : std_logic_vector(8 downto 0);


ビット幅が合わないので、rd_cdc_countの処理もロードの部分を以下の様に書き換えた。

                if rdt_cs=arr_accept then -- ロード
                    rd_cdc_count <= ('0'& S_AXI_ARLEN) + 1;


これでうまく行きました。
前に貼ったcdc_axi_slave.vhd のVHDLコードを修正します。
  1. 2012年04月03日 05:31 |
  2. AXI4 Master IPの作製
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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