FC2カウンター FPGAの部屋 2011年08月09日
FC2ブログ

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

FPGAの部屋

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

AXIバスのEDKでキャラクタ・ディスプレイ・コントローラのカスタムIPを作る6

前回でMicroBlazeシステムにSVGAのキャラクタ・ディスプレイ・コントローラを実装できたので、ソフトウェアを書いて、制御してみることにした。

最初に画面を'A'で埋めてみることにした。empty_applicaion_0を作成して、ここを参考にしながら、monitor.c を書いた。下にリストを示す。

// Monitor
// 2011/08/07

#include "xparameters.h"

void write_data(unsigned int address, unsigned int data)
{
    *(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
    *(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
}

int read_data(unsigned int address)
{
    *(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
    return(*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4));
}

int main()
{
    unsigned int addr;

    for(addr=0; addr < 100*75; addr++){
        write_data(addr, 0x3C1);
    }

    return 0;
}


これで、ビットファイルをSP605にダウンロードして、デバックモードにSDKを変更した。
SP605_AXI_CDC_36_110809.png

Resumeボタンをクリックして、実行してみた。'A'が全面に表示されるはずが、所々抜けてしまっている。
SP605_AXI_CDC_37_110809.jpg

あれれ?なんでだろう?思いがけない展開になってしまった。書けていないかもしれないので、試しにデータを書くところを増やしてみた。

*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;


欠損は減ってきた気がする。
SP605_AXI_CDC_38_110809.jpg

データの書き込みを増やして行った。増やすごとに欠損が減っていった。4つデータを書いたときに正常になった。

*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;


SP605_AXI_CDC_39_110809.jpg

不思議だ?なぜ?
Write enableは、フレームバッファ用のBRAMのWEに直結しているはずなんだけど。。。Out of Order実行でアドレスを先にWriteしていることがあるわけでもないですよね?それともデータキャッシュが入ってしまっているとか?
そういえば、以前もSMMで2回書かないと上手くいかないということがあったな?
ChipScope Proで本当に4回書いているかを確かめてみたい。
  1. 2011年08月09日 05:15 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0