FPGAの部屋 2012年02月05日
FC2ブログ

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

FPGAの部屋

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

MicroBlaze MCSをテストする6(FITを使用する)

MicroBlaze MCSをテストする5(Project Navigatorでシミュレーション編)”の続き。

前回、GPOは動いているということがわかった。PITはその後のシミュレーションでも動作させることができなかった。
そこで、FITを使用することにした。今回もProject Navigator 13.4 でテストを行った。

・MicroBlaze MCSのIPをダブルクリックして、設定用のダイアログを出して、FITタブをクリックする。Use Timerをチェックして、Number of Clocks Between Strobes をシミュレーションのために100をセットする。Generate Interruptにチェックを入れた。
MB_MCS_76_120204.png

・これでもう一度、MicroBlaze MCSを生成した。結構長い時間が掛かる。30分くらいかかる感じ?

・FITが入っていたので、トップのVerilogファイル (MicroBlaze_MCS_Test.v) を書き換えた。下にソースを示す。

module MicroBlaze_MCS_Test(
    input     wire clk,
    input    wire reset,
//     input    wire UART_Rx,
//     output    wire UART_Tx,
    output    wire [7:0] LED_out
    );
    
    wire PIT1_Interrupt;
    wire PIT1_Toggle;
    wire INTC_IRQ;
     wire [7:0]    GPI1;
     wire FIT1_Interrupt;
     wire FIT1_Toggle;
    
    assign GPI1 = {6'd0, FIT1_Toggle, PIT1_Toggle};
    
    MB_MCS mcs_0 (
      .Clk(clk), // input Clk
      .Reset(reset), // input Reset
//        .UART_Rx(UART_Rx), // input UART_Rx
//        .UART_Tx(UART_Tx), // output UART_Tx
      .FIT1_Interrupt(FIT1_Interrupt), // output FIT1_Interrupt
      .FIT1_Toggle(FIT1_Toggle), // output FIT1_Toggle
      .PIT1_Enable(1'b1), // input PIT1_Enable
      .PIT1_Interrupt(PIT1_Interrupt), // output PIT1_Interrupt
      .PIT1_Toggle(PIT1_Toggle), // output PIT1_Toggle
      .GPO1(LED_out), // output [7 : 0] GPO1
        .GPI1(GPI1), // input [7 : 0] GPI1
      .INTC_IRQ(INTC_IRQ) // output INTC_IRQ
    );
endmodule


・これで、インプリメントを行った。なお、”source ipcore_dir/microblaze_mcs_setup.tcl”は、BMMファイルのマージとngdbuild "-bm" option の付加を行うようだ。今回のBMMファイルは1つだけなので、最初に一回やれば良いようだ。(コメントで教えて頂きました)ただ、MicroBlaze MCS IPを2つ入れていて、少なくともその内の1つの内蔵のRAM領域を変更した場合には(8Kバイトから16Kバイトとか)、BMMファイルを再度マージするために、もう一度、実行する必要があると思う。

#インプリメント後のFF使用数は728 out of 54,576、LUT使用数は944 out of 27,288、RAMB16BWERs使用数は4 out of 116だった。

・”microblaze_mcs_data2mem SDK/Atlys_LED_Test/Debug/Atlys_LED_Test.elf”を実行して、ソフトウェアをビットファイルやシミュレーション用の記述に入れた。

・ISimでシミュレーションを行った。その際のソフトウェアを下に示す。GPI1の2ビット目の反転を見てLED+1するソフトウェアだ。GPI1の2ビット目はFIT1_Toggle だ。

#define    GPO1_ADDR            0x80000010
#define GPI1_ADDR            0x80000020
#define COUNT_VALUE            100

int main()
{
    unsigned int b_GPI1 = 0;
    unsigned int c_GPI1 = 0;
    unsigned int led = 0x55;
    
    *(volatile unsigned int *)(GPO1_ADDR) = led;
    
    while(1){
        c_GPI1 = 0x2 & (*(volatile unsigned int *)(GPI1_ADDR));
        if (c_GPI1 != b_GPI1){
            *(volatile unsigned int *)(GPO1_ADDR) = led++;
        }
        b_GPI1 = c_GPI1;
    }
}


・ISimのシミュレーション結果を下に示す。FITは動作している。
MB_MCS_78_120205.png

・今度は実機でLEDの動作を見るために、正規の状態にMicroBlaze MCSの設定を戻した。MicroBlaze MCSのIPをダブルクリックして、設定用のダイアログを出して、FITタブをクリックする。Number of Clocks Between Strobesに100000000をセットした。
MB_MCS_77_120204.png

すると、LEDが1秒ごとに+1されて動作した。やっと動いた。。。それにしてもPITは動かないのだろうか?どなたかPITが動いた方がいらしたらお知らせ下さい。よろしくお願いします。

(2011/02/05:追記)どうやら、カウンタの値はリードできないけれど、トグル出力と割り込み出力は皆さん、出ているようです。もう一度確かめてみます。。
  1. 2012年02月05日 05:20 |
  2. MicroBlaze MCS
  3. | トラックバック:0
  4. | コメント:4