FC2カウンター FPGAの部屋 Atlysボード

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

FPGAの部屋

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

Atlysボードで3.3Vレベルの信号を使った時のVCCAUXの設定

Atlysボードで”Atlys board support files for EDK BSB wizard. Supports EDK 13.2 - 14.2 for both AXI and PLB buses.(ZIPファイルへのリンクです。注意)の Atlys_AXI_BSB_Support の中の、axi_hdmi_v1_00_a IPコアを使用して、HDMIのアプリを作っている。使用しているISEのバージョンは14.2。Project Navigator を使用している。

PlanAheadでTMDS信号をTML_33とTMDS_33(TML_33は出力用に直列に抵抗が入るそうです)に割り当てているが、下のエラーが出て、MAPが通らない。下にエラーを示す。

ERROR:Place:1413 - The following IOBs have an IO Standard that requires VCCAUX =
 3.300v. This is incompatible with the device's current setting of VCCAUX =
 2.500v. By default, VCCAUX = 2.5v but it can be specified to a different
 value in your user constraints file (UCF). Please refer to the Spartan6 FPGA
 SelectIO Resources User's Guide for more information on VCCAUX and the
 requirements of each IO Standard.
 IO Standard: TMDS_33
 List of IOB's:
  TMDS_RX_0_N
  TMDS_RX_0_P
  TMDS_RX_1_N
  TMDS_RX_1_P
  TMDS_RX_2_N
  TMDS_RX_2_P
  TMDS_RX_CLK_N
  TMDS_RX_CLK_P
ERROR:Pack:1654 - The timing-driven placement phase encountered an error.


関連する部分のUCFを下に示す。

NET "TMDS_RX_0_P" IOSTANDARD = TMDS_33;
NET "TMDS_RX_1_P" IOSTANDARD = TMDS_33;
NET "TMDS_RX_2_P" IOSTANDARD = TMDS_33;
NET "TMDS_RX_SCL" IOSTANDARD = LVCMOS33;
NET "TMDS_RX_SDA" IOSTANDARD = LVCMOS33;
NET "TMDS_TX_0_P" IOSTANDARD = TML_33;
NET "TMDS_TX_1_P" IOSTANDARD = TML_33;
NET "TMDS_TX_2_P" IOSTANDARD = TML_33;
NET "TMDS_TX_CLK_P" IOSTANDARD = TML_33;
NET "CLK100M" IOSTANDARD = LVCMOS33;
NET "RESET" IOSTANDARD = LVCMOS33;
NET "TMDS_RX_CLK_P" IOSTANDARD = TMDS_33;


エラーの内容を読んでもわかるが、VCCAUXがデフォルトでは、2.5v で、それを 3.3v にする必要があるそうだ。
更に、関連するアンサーがあった。”Spartan-6 および Spartan-3A Extended ジェネレーション FPGA - VCCAUX 電圧を変更する場合は CONFIG VCCAUX 制約を使用する必要がある
このアンサーに従って、

CONFIG VCCAUX = 3.3;


をUCFファイルの先頭に書いたところ、MAPが通った。

(追加)
Atlysボードの回路図、10ページ目を見ると、VCCAUXにVCC3V3 が入っているのがわかる。

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

AtlysボードのXPSプロジェクトでのMCBの使用

ビットマップ・ディスプレイ・コントローラの作製21(PlanAheadプロジェクトで画面にキャラクタを描画)”からの続きだけれど、AXI Master IPの作製からは離れて、XPSプロジェクトでのMCBの使用の話なので、カテゴリを変更した。

さて、PlanAheadプロジェクト内のXPSプロジェクトでaxi_s6_ddrx IPをAdd IPしてもDDR2 SDRAMにアクセスすることができなかった。今度はISEプロジェクト内のXPSプロジェクトででaxi_s6_ddrx IPをAdd IPしてDDR2 SDRAMにアクセスしてみることにした。
ISEプロジェクトを作成して、XPSプロジェクトを新規作成した。BSBウィザートでおおまかに作って、axi_s6_ddrx をAdd IPした。その際の設定は動作しているプロジェクトの設定をみながらMIGの設定を行った。
インプリメント終了後のISEプロジェクトを下に示す。
BitMapDispCont_137_120830.png

MCBの入出力ポートはUCFには書いていないが、Project Navigator のPinout Report を見ると正常に配置されているようだ。
BitMapDispCont_138_120830.png

これで、SDKにハードウェアをエクスポートして、デバックモードにしてからXMDでDDR2 SDRAMのアドレスの0x20000000 をReadしてみたがReadすることができなかった。
BitMapDispCont_139_120830.png

BitMapDispCont_140_120830.png

という訳で、自分でAdd IPしたaxi_s6_ddrx が動作した試しがない!困った。何か情報がある方はお知らせください。
結局、Digilent社のWebサイトにあるProject Peripheral Repositoryサンプルを使用すれば、問題なくaxi_s6_ddrx (MCB) が使用出来る。(”AtlysボードでXPSプロジェクトを試す1(XPSのプロジェクト作成、インプリメント)”参照、現在はAtlys_BSB_Support_v_3_4 だった)とりあえず、これを使ったほうが良さそうだ。
なお、Atlys_BSB_Support_v_3_4では、axi_hdmi も付いていた。Supported Interface はAXI4-Lite, AXI4-Stream だそうだ。その他、全部で11個のIPコアが付いている。
  1. 2012年08月30日 04:43 |
  2. Atlysボード
  3. | トラックバック:0
  4. | コメント:0

AtlysボードのUSB-UARTチップのドライバのインストール

AtlysボードのUSB-UARTを使おうと、AtlysボードのUARTとマーキングされているミニUSB BコネクタからパソコンにUSBケーブルを接続したらドライバのインストールでドライバがないと言われてしまった。
Digilent社のAtlysボードのマニュアルの16ページにUSB-UART Bridge (Serial Port) があって、それによると、EXAR社の“XR21V1410”というチップを使っているということだった。“XR21V1410”のページを見ると、Windows Drivers Version 1.8.0.0 があったので、これをダウンロードして解凍した。もう一度、パソコンにUSBケーブルを接続して、ドライバのインストール・ウィザードから位置を指定してインストールしたら使えるようになった。
  1. 2012年06月02日 06:03 |
  2. Atlysボード
  3. | トラックバック:0
  4. | コメント:0

SPI FLASH ROMでFPGAにコンフィギュレーション2(Atlys ボード)

SPI FLASH ROMでFPGAにコンフィギュレーション(Atlys ボード)”の続き。

コンフィギュレーションの失敗の原因は、FLASH のIDがオール0で読めないというものだった。そこでSPI FLASH ID で検索すると、BRAVO FPGAさんの”SPIコントローラの作成 3”がヒットした。それによると、やはりSPI FLASHのIDが読めずにQIO-SPIモードでRDIDコマンド(MIORDID)を発行したら読めたそうだ。
QIO-SPIモードというのは何?ということで、もう一度検索すると、Micron社の”Software Device Drivers for Micron® N25Q Serial NOR Flash Memory”がヒットした。それによるとQuad SPI (QIO-SPI) protocolとうことで、4ビットデータバスがあるので、それをフルに使ってデータをやりとりするモードのようだ。

iMPACTではx4モードが選べず、AtlysボードのSPI FLASH に書けないようなので、Digilent社の専用ソフトDigilent Adeptを試して見ることにした。Digilent AdeptのWebサイトに行って、Adept 2.9.4 System, 32/64-bit Windowsを落としてきた。
インストールし、起動したが、うまく動かない。Windows XPを再起動してから、Digilent Adeptを起動したらAtlysボードを検出できた。
Atlys_SPI_Config_24_120424.png

SPI FLASHに書き込もう。Flash タブをクリックし、FPGA programming file をBrows...ボタンで選択する。ここではビットファイルを選択することができるので選択した。Verify のチェックボックスをチェックしてから、Programボタンをクリックしたところコンフィギュレーションが完了した。
Atlys_SPI_Config_25_120424.png

Atlysボードの電源をOFFしてからONすると、キャラクタ・ディスプレイ・コントローラの表示が出た。うまくSPI FLASHからコンフィギュレーション出来ているようだ。
cdctest_axi_master_19_120404.jpg

AtlysボードのSPI FLASHにFPGAのコンフィギュレーション・データを書き込む場合は、iMPACTでは書き込むことが出来ない。Digilent Adeptを使用するとAtlysボードのSPI FLASHにFPGAのコンフィギュレーション・データを書き込む事ができることがわかった。
  1. 2012年04月25日 05:50 |
  2. Atlysボード
  3. | トラックバック:0
  4. | コメント:2

SPI FLASH ROMでFPGAにコンフィギュレーション(Atlys ボード)

Atlys ボード(Spartan-6)には、SPI FLASH ROMが実装されていて、電源ON時にSPI FLASH ROMからFPGAをコンフィギュレーションすることができる。今回はこのSPI FLASH ROMにFPGAのコンフィギュレーションデータを書き込むことにした。(使用しているISEのバージョンは13.4、これではSPI FLASH ROM に書き込むことができなかったが、ISE14.4 では書き込むことができた。追記参照)

Xilinx FPGAに接続されたSPI FLASH ROMはiMPACTから書き込む事ができる。今回はその手順を書いておく。
接続はUSBケーブルでAtlysボードのPROGコネクタへ接続した。ちなみに、XUP USB-JTAG Programming Cable で接続しても同じ結果だった。

・Project Navigator のProcessesウインドウのConfigure Target Device を展開して、Generate Target PROM/ACE File をダブルクリックする。
Atlys_SPI_Config_1_120423.png

・私の環境ではワーニングが出るが、OKボタンをクリックする。
Atlys_SPI_Config_2_120423.png

・iMPACT が立ち上がる。Create PROM File (PROM File Formatter) をダブルクリックする。
Atlys_SPI_Config_3_120423.png

・PROM File Formatterが立ち上がる。SPI FlashのConfigure Single FPGA をクリックしてから、矢印をクリックする。(Step 1.)
Atlys_SPI_Config_4_120423.png

・Step 2.では、SPI FLASH ROMの容量を選択する。Atlysボードには128MビットのSPI FLASH ROMが実装されていると書いてあるので、Storage Device (bits) で128Mを選択し、Add Storage Device ボタンをクリックする。
Atlys_SPI_Config_5_120423.png

・Step 2.に128MのSPI FLASH ROMが入ったので、2番目の矢印をクリックする。
Atlys_SPI_Config_6_120423.png

・Step 3.でOutput File NameとOutput File Location を設定し、OKボタンをクリックした。
Atlys_SPI_Config_7_120423.png

・iMPACT の画面に戻って、SPI FLASH ROMに入れるビットファイルを指定する。Add Deviceダイアログが表示されるので、OKボタンをクリックする。まずは最初のビットファイルを指定する。(注:ここでは、1つのビットファイルのみを指定することになる)
Atlys_SPI_Config_8_120423.png

・Add Device ダイアログが開くので、ビットファイルをクリックして開くボタンをクリックする。
Atlys_SPI_Config_9_120423.png

・Add Deviceダイアログが表示される。もう追加するビットファイルが無いのでNoボタンをクリックする。
Atlys_SPI_Config_10_120423.png

・もうビットファイルの指定は終了した。OKボタンをクリックする。
Atlys_SPI_Config_11_120423.png

・iMPACTに戻るので、iMPACT Processes ウインドウからGenerate File...をダブルクリックする。
Atlys_SPI_Config_12_120423.png

・Generate Succeeded が表示されて、SPI FLASHのダウンロード用ファイルの生成が成功した。
Atlys_SPI_Config_13_120423.png

・次にSPI FLASH をコンフィギュレーションする。iMPACT のInitialize Chain アイコンをクリックして、JTAG Chain につながっているFPGAなどを検索する。
Atlys_SPI_Config_14_120423.png

・Spartan-6 FPGAが見つかった。コンフィギュレーション・ファイルを指定するため、ダイアログのYes ボタンをクリックする。
Atlys_SPI_Config_15_120423.png

・コンフィギュレーション・ファイルを指定する。
Atlys_SPI_Config_16_120423.png

・次にSPI FLASH のコンフィギュレーション・ファイルを指定するため、ダイアログのYes ボタンをクリックする。
Atlys_SPI_Config_17_120423.png

・先ほど生成したSPI FLASHのコンフィギュレーション・ファイルを指定して、開くボタンをクリックする。
Atlys_SPI_Config_18_120423.png

・Select Attached SPI/BPI が開く。SPI PROM のN25Q128, Data Width 1 を選択する。(Atlys の回路図(PDFです)では25Q12 と表示されていた)
Atlys_SPI_Config_19_120423.png

・Device Programming Properties が開く。OKボタンをクリックする。
Atlys_SPI_Config_20_120423.png

・Boundary Scan タブのFLASH をクリックし、iMPACT Processes ウインドウでProgram をダブルクリックする。
Atlys_SPI_Config_21_120423.png

・Device Programming Properties が開く。OKボタンをクリックする。
Atlys_SPI_Config_22_120423.png

・Program Failed になってしまった。
Atlys_SPI_Config_23_120423.png

実際に基板に搭載されているSPI FLASH ROMの型番は、25Q2813B40 だった。25Q128 じゃないのか?データシートを検索しても出てこない。情報があったら教えて下さい。

(2012/04/25:追記)
Digilent Adeptソフトウェアを使用して、AtlysボードのSPI FLASHにFPGAのコンフィギュレーション・データを書き込む事ができました。詳しくは、"SPI FLASH ROMでFPGAにコンフィギュレーション2(Atlys ボード)"を御覧ください。

(注)
Spatan-3A Starter Kit などでしたら、SPI FLASH の型番は違うかも知れませんが、今回の手順でコンフィギュレーション・データをSPI FLASH に書くことができると思います。

(2013/01/30:追記)
ISE14.4でSPI FLASH ROM に書き込んだところ、Passして書き込めました
Atlys_SPI_Config_24_130130.png 
  1. 2012年04月24日 05:54 |
  2. Atlysボード
  3. | トラックバック:0
  4. | コメント:2

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

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
»