FC2カウンター FPGAの部屋 2012年01月
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

2011年のFPGAの部屋のアクセス数

あけましておめでとうございます。

2011年のFPGAの部屋のアクセス数は522,286アクセスでした。
皆さん見て頂いてありがとうございました。今年もよろしくお願いします。

FPGA_room_2011_120101.png

今年は、ISE14が出るという噂なので、どのように変わっているか楽しみです。Alteraも触ってみたいと思っていますが、なかなかXilinxのツールを覚えるのに大変で、そこまで行きません。とりあえずはXilinx用にAXI4バスのカスタム・マスタIPを作ってみようと思っています。
  1. 2012年01月01日 04:28 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

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

Atlysボードを使用した2つのAXI4バスのマスタIPを作ろうと思っている。それは、カメラのピクセルデータをDDR2 SDRAMに書きこむカメラ制御回路とDDR2 SDRAMからカメラのピクセルデータを取得して表示するディスプレイ表示回路だ。

その前段階として、XPS(バージョンは13.3)を使ってAltysボードのプロジェクトを作ってみた。
Atlys™ Spartan-6 FPGA Development BoardのWebページにあるProject Peripheral Repositoryサンプルを使用した。それは、DSD-0000282、”Atlys board support files for EDK BSB wizard. Supports EDK 13.2 for both AXI and PLB buses.”(ZIPファイル)だ。
このファイルを予めダウンロードし、展開しておく。展開するとAtlys_BSB_Support_v_3_2というフォルダが作られる。

1.XPSを立ち上げる。Create New Project Using Base System Builder をクリックしてBSBウィザードを起動する。
Atlys_8_111231.png

2.BSB Wizardが起動する。Project Fileを指定して、Select an Interconnect TypeをAXI Systemに指定する。Set Project Peripheral Repository Search PathをAtlys_BSB_Support_v_3_2\Atlys_AXI_BSB_Support\libに指定する。OKボタンをクリックする。
Atlys_9_111231.png

3.BSBダイアログが起動した。Boardには、Digilent Spartan-6 Atlysと入っていた。デフォルトのSigle MicroBlaze Processer System とOptimization StrategyにはAreaを選択した。Next->ボタンをクリックした。
Atlys_10_111231.png

4.Processor, Cache, and Peripheral Configuration では、デフォルトからmicroblaze_0のLocal Memory Sizeを16KBに変更した。axi_timerをAddして、Use Interruptにチェックを入れた。Finishボタンをクリックした。
Atlys_11_111231.png

5.XPSプロジェクトが生成できた。
Atlys_12_111231.png

6.HardwareメニューからGenerate Bitstreamを選択して、ビットファイルを生成した。

7.インプリメント終了。ビットファイルが生成できた。
Atlys_13_111231.png

8.各モジュールのリソース使用量の見積もり値を下に示す。
Atlys_14_120101.png

9.全リソース使用状況を下に示す。

Release 13.3 Map O.76xd (nt)
Xilinx Mapping Report File for Design 'system'

Design Information
------------------
Command Line   : map -o system_map.ncd -w -pr b -ol high -timing -detail
system.ngd system.pcf 
Target Device  : xc6slx45
Target Package : csg324
Target Speed   : -2
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : SAT 31 DEC 18:42:38 2011

Design Summary
--------------
Number of errors:      0
Number of warnings:   28
Slice Logic Utilization:
  Number of Slice Registers:                 3,484 out of  54,576    6%
    Number used as Flip Flops:               3,475
    Number used as Latches:                      0
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:                9
  Number of Slice LUTs:                      4,149 out of  27,288   15%
    Number used as logic:                    3,837 out of  27,288   14%
      Number using O6 output only:           2,903
      Number using O5 output only:             104
      Number using O5 and O6:                  830
      Number used as ROM:                        0
    Number used as Memory:                     236 out of   6,408    3%
      Number used as Dual Port RAM:             96
        Number using O6 output only:             4
        Number using O5 output only:             1
        Number using O5 and O6:                 91
      Number used as Single Port RAM:            4
        Number using O6 output only:             4
        Number using O5 output only:             0
        Number using O5 and O6:                  0
      Number used as Shift Register:           136
        Number using O6 output only:            43
        Number using O5 output only:             1
        Number using O5 and O6:                 92
    Number used exclusively as route-thrus:     76
      Number with same-slice register load:     58
      Number with same-slice carry load:        12
      Number with other load:                    6

Slice Logic Distribution:
  Number of occupied Slices:                 1,800 out of   6,822   26%
  Nummber of MUXCYs used:                      652 out of  13,644    4%
  Number of LUT Flip Flop pairs used:        5,065
    Number with an unused Flip Flop:         1,860 out of   5,065   36%
    Number with an unused LUT:                 916 out of   5,065   18%
    Number of fully used LUT-FF pairs:       2,289 out of   5,065   45%
    Number of unique control sets:             278
    Number of slice register sites lost
      to control set restrictions:           1,082 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                        89 out of     218   40%
    Number of LOCed IOBs:                       89 out of      89  100%
    IOB Flip Flops:                             20

Specific Feature Utilization:
  Number of RAMB16BWERs:                        20 out of     116   17%
  Number of RAMB8BWERs:                          0 out of     232    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 1 out of      32    3%
    Number used as BUFIO2s:                      1
    Number used as BUFIO2_2CLKs:                 0
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       2 out of      16   12%
    Number used as BUFGs:                        2
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                  12 out of     376    3%
    Number used as ILOGIC2s:                    12
    Number used as ISERDES2s:                    0
  Number of IODELAY2/IODRP2/IODRP2_MCBs:        24 out of     376    6%
    Number used as IODELAY2s:                    0
    Number used as IODRP2s:                      2
    Number used as IODRP2_MCBs:                 22
  Number of OLOGIC2/OSERDES2s:                  52 out of     376   13%
    Number used as OLOGIC2s:                     7
    Number used as OSERDES2s:                   45
  Number of BSCANs:                              1 out of       4   25%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         1 out of       4   25%
  Number of DSP48A1s:                            3 out of      58    5%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                1 out of       2   50%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            1 out of       4   25%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%

Average Fanout of Non-Clock Nets:                3.95


次はSDKを立ち上げて、簡単なソフトウェアを作って動作を確かめる。
  1. 2012年01月01日 04:10 |
  2. Atlysボード
  3. | トラックバック:0
  4. | コメント:0