FC2カウンター FPGAの部屋 AtlysボードでXPSプロジェクトを試す2(ソフトウェアを試す)
FC2ブログ

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

FPGAの部屋

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

AtlysボードでXPSプロジェクトを試す2(ソフトウェアを試す)

AtlysボードでXPSプロジェクトを試す1(XPSのプロジェクト作成、インプリメント)”の続き。

今回は、axi_timerの割り込みを使用して、8ビットのLEDを点滅させてみることにした。これでMicroBlazeがちゃんと動作していることが分かるだろう。”axi_timerを使う2(割り込みを使用した)”のCコードをテンプレートとして使用する。

10.左のNavigatorウインドウからExport Designを選択する。
Atlys_15_120101.png

11.Exprot to SDK / Launch SDKダイアログが開く。Export & Launch SDKボタンをクリックする。これで、ハードウェア・コンフィグレーションをSDKに引き継ぐことが出来る。
Atlys_16_120101.png

12.Workspace Launcherが起動する。WorkspaceをBrowse...ボタンで、Atlys_XPS_CamDisp\SDK\SDK_Exportに設定して、OKボタンをクリックする。
Atlys_17_120101.png

13.SDKが起動した。
Atlys_18_120102.png

14.FileメニューのNew -> C Xilinx Projectを選択して、Cプロジェクトを作成する。

15.New Projectダイアログが立ち上がる。Project name:にaxi_timer_testと入力し、Select Project TemplateからEmpty Applicationを選択した。Next->ボタンをクリックした。
Atlys_19_120102.png

16.Create a new Board Support Package projcetのProject name:をAtlys_bsp_0に変更した。Finishボタンをクリックした。
Atlys_20_120102.png

17.Project ExplorerにAtlys_bsp_0とaxi_timer_testが追加された。
Atlys_21_120102.png

18.axi_timer_testの下のsrcにaxi_timer_test.cをドラッグアンドドロップした。まだ、Altys用に変更していないので、エラーが出ている。
Atlys_22_120102.png

19.axi_timer_test.cをAltysボードで、8個のLEDを点滅させるように変更した。

20.Xilinx ToolsメニューからProgram FPGAを選択した。

21.Program FPGAダイアログでSoftware Configuratioで、ElF File to Initialize in Block RAMで、axi_timer_test.elfを選択した。Programボタンを押して、Atlysボードにソフトウェア入りのビットファイルをダウンロードする。
Atlys_23_120102.png

22.Program FPGA failedダイアログが出てしまった。
Atlys_24_120102.png

23.エラー内容としては、”ERROR:EDK:3165 - elfcheck failed!”だそうだ。linker script generation toolsを使ってELFファイルを生成するということだ。エラーのログを下に貼っておく。

Command Line: elfcheck -hw
H:/HDL/FndtnISEWork/Spartan6/Atlys/Atlys_XPS_CamDisp/SDK/SDK_Export/Atlys_XPS_Ca
mDisp_hw_platform/system.xml -mode bootload -mem BRAM -pe microblaze_0
H:/HDL/FndtnISEWork/Spartan6/Atlys/Atlys_XPS_CamDisp/SDK/SDK_Export/axi_timer_te
st/Debug/axi_timer_test.elf 

ELF file    :
H:/HDL/FndtnISEWork/Spartan6/Atlys/Atlys_XPS_CamDisp/SDK/SDK_Export/axi_timer_te
st/Debug/axi_timer_test.elf
ERROR:EDK:3165 - elfcheck failed!
The following sections did not fit into Processor BRAM memory:
    Section .jcr (0xC0000944 - 0xC0000947)
    Section .eh_frame (0xC0000940 - 0xC0000943)
    Section .data (0xC0000818 - 0xC000093F)
    Section .rodata (0xC000080C - 0xC0000811)
    Section .dtors (0xC0000804 - 0xC000080B)
    Section .ctors (0xC00007FC - 0xC0000803)
    Section .fini (0xC00007E0 - 0xC00007FB)
    Section .init (0xC00007A4 - 0xC00007DF)
    Section .text (0xC0000000 - 0xC00007A3)

Try using the linker script generation tools to generate an ELF that maps
correctly to your hardware design.
Programming the FPGA failed due to errors from elfcheck


24.”SDKでNo source available for "" が出てソースコード・デバックできないときの対処方法”を参考にlinker scriptを作りなおしてから、ProjectメニューからBuild Allを行った。再度、Program FPGAを行ったところ成功した。

うまく動作しなかったのでデバックを行うことにした。
・”AXIバスのEDKチュートリアルを試す5(SDK2)”を参考に、Software ConfigurationのELF File to Intialize in Block RAMの所はbootloopにした状態でFPGAにダウンロードして、axi_timer_test.elfで右クリックして、右クリックメニューからDebug As -> Lanunch on Hardware を選択した。

・Debugパースペクティブにはなったが、ソースコードデバックができない。
Atlys_25_120102.png

Process STDIO not connected to console.
If you'd like to see UART output in this console, please modify STDIO settings in the Run/Debug configuration.


・どうやら、Run/Debug configurationのSTDIO設定を変更すれば良いようだ。RunメニューからDebug Configuration...を選択する。

・Debug ConfigurationダイアログのSTDIO Connectionタブをクリックして、Connect STDIO to Consoleにチェックを入れる。Applyボタンをクリックしてから、Debugボタンをクリックした。
Atlys_26_120102.png

・それでもやはり、SDKでNo source available for "" が出てソースコード・デバックできない。SDKのWarningsを見ると、Invalid project pathになっていた。
Atlys_26_120102.png

・システムプロパティの環境変数のCPLUS_INCLUDE_PATHを削除して、もう一度SDKを再起動してやってみた。(リンカー・スクリプトを再生成したかも?)
Atlys_28_120102.png

・なんとか、ソースコード・デバックを出来るようになったが、今度はwhile(interrupt==0);でループして割り込みがかからないみたいだ。(理由はmicroblaze_0_intcのソフトウェア処理を書き忘れていたためだった)

・XPSで確認してみたが、axi_timer_0の割り込みは、microblaze_0_intcを通って、microblaze_0に接続されている。

・axi_timerのレジスタを読んでみたが、割り込みは出力しているようだ。

次は、Chipscopeで確認してみようと思う。

(2012/01/02:追記)
最後はソフトウェアが間違っていました。いやー、だいぶ手間取りましたが、LED+1ソフトウェア完成しました。
LED+1ソフトウェアの全ソースファイルを下に示します。

/* * axi_timer_test.c * *  Created on: 2012/01/02 *      Author: Masaaki */

#include "xbasic_types.h"
#include "xio.h"
#include "mb_interface.h"
#include "xparameters.h"

// MICROBLAZE_INTC define
#define MICROBLAZE_0_INTC_ISR        XPAR_MICROBLAZE_0_INTC_BASEADDR        // Interrupt Status Register
#define MICROBLAZE_0_INTC_IPR        XPAR_MICROBLAZE_0_INTC_BASEADDR+0x4    // Interrupt Pending Register
#define MICROBLAZE_0_INTC_IER        XPAR_MICROBLAZE_0_INTC_BASEADDR+0x8    // Interrupt Enable Register
#define MICROBLAZE_0_INTC_IAR        XPAR_MICROBLAZE_0_INTC_BASEADDR+0xC    // Interrupt Acknowledge Register
#define MICROBLAZE_0_INTC_SIE        XPAR_MICROBLAZE_0_INTC_BASEADDR+0x10    // Set Interrupt Enable Bits
#define MICROBLAZE_0_INTC_CIE        XPAR_MICROBLAZE_0_INTC_BASEADDR+0x14    // Clear Interrupt Enable Bits
#define MICROBLAZE_0_INTC_IVR        XPAR_MICROBLAZE_0_INTC_BASEADDR+0x18    // Interrupt Vector Register
#define MICROBLAZE_0_INTC_MER        XPAR_MICROBLAZE_0_INTC_BASEADDR+0x1C    // Master Enable Register

// LED 8bits
#define XPAR_LEDS_8BITS_DATA    XPAR_LEDS_8BITS_BASEADDR
#define XPAR_LEDS_8BITS_TRI        XPAR_LEDS_8BITS_BASEADDR+0x4

// AXI_TIMER define
#define AXI_TIMER_0_TCSR0    XPAR_AXI_TIMER_0_BASEADDR    // Control/Status Register 0
#define AXI_TIMER_0_TLR0    XPAR_AXI_TIMER_0_BASEADDR+0x4    // Load Register 0
#define AXI_TIMER_0_TCR0    XPAR_AXI_TIMER_0_BASEADDR+0x8    // Timer/Counter Register 0
#define AXI_TIMER_0_TCSR1    XPAR_AXI_TIMER_0_BASEADDR+0x10    // Control/Status Register 1
#define AXI_TIMER_0_TLR1    XPAR_AXI_TIMER_0_BASEADDR+0x14    // Load Register 1
#define AXI_TIMER_0_TCR1    XPAR_AXI_TIMER_0_BASEADDR+0x18    // Timer/Counter Register 1

#define ENABLE_ALL_TIMERS                (0x1<<10)
#define ENABLE_PULSE_WIDTH_MODULATION    (0x1<<9)
#define    TIMER_INTERRUPT                    (0x1<<8)
#define ENABLE_TIMER                    (0x1<<7)
#define ENABLE_INTERRUPT                (0x1<<6)
#define LOAD_TIMER                        (0x1<<5)
#define AUTO_RELOAD_HOLD_TIMER            (0x1<<4)
#define ENABLE_EXT_CAPTURE_TRIG            (0x1<<3)
#define ENABLE_EXT_GENERATE_SIG            (0x1<<2)
#define DOWN_UP_COUNT_TIMER                (0x1<<1)
#define TIMER_MODE_CAP_GENE                (0x1)

int interrupt = 0;

void axi_intc_init() {
    *(volatile unsigned int *)(MICROBLAZE_0_INTC_IER) = 0x1;    // int0 enable
    *(volatile unsigned int *)(MICROBLAZE_0_INTC_MER) = 0x3;    // IRQ Enable
}

void axi_timer_init(){
    *(volatile unsigned int *)(AXI_TIMER_0_TLR0) = 100000000// 100MHzで1秒
    *(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード
    *(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり
}

void timer_int_handler(void * arg) {
    interrupt = 1;
}

int main()
{
    unsigned int data;

    *(volatile unsigned int *)(XPAR_LEDS_8BITS_TRI) = 0;    // 出力設定
    *(volatile unsigned int *)(XPAR_LEDS_8BITS_DATA) = 1;

    axi_timer_init();    // axi_timerの初期化
    axi_intc_init();     // axi_intcの初期化

    // 割り込みハンドラ登録、割り込み許可
    microblaze_register_handler(timer_int_handler, (void *) 0);
    microblaze_enable_interrupts();

    for(data=0; data>=0; data++){
        *(volatile unsigned int *)(XPAR_LEDS_8BITS_DATA) = data;
        // axi_timter割り込み待ち
        interrupt = 0;
        while(interrupt==0);
        *(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER | TIMER_INTERRUPT;    // 割り込みクリア
        *(volatile unsigned int *)(MICROBLAZE_0_INTC_IAR) = 0x1;    // int0 clear

        *(volatile unsigned int *)(AXI_TIMER_0_TLR0) = 100000000// 1秒 1000,000,000ns/10ns = 100,000,000
        *(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード、割り込みクリア
        *(volatile unsigned int *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり
    }

    return 0;
}


MCBの管理するDDR2 SDRAMにXMDで書き込みと読み出しをテストしてみました。すべて正常でした。

XMD% mwr 0xC0000000 0x56789ABC
XMD% mrd 0xC0000000
C0000000: 56789ABC

XMD% mwr 0xC0000008 0x55667788
XMD% mrd 0xC0000008
C0000008: 55667788

  1. 2012年01月02日 10:58 |
  2. Atlysボード
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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