FC2カウンター FPGAの部屋 2012年06月

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

FPGAの部屋

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

Raspberry Pi を購入しました

6月1日にRaspberry Pi の購入ページにエントリしておいたんですが、今日購入できるというメールが来まして購入しました。
しまった。購入ページのスクリーンショット取っておけばよかったけど、消しちゃいましたね。

購入はポンド、ユーロ、ドルの3つの支払いを選べて、PayPalで支払いました。ドルの価格は35ドルでした。注文内容を下に貼ります。

RS Stock No.   Qty      Description                               Unit Price      Goods Value
756-8308        1       Raspberry Pi Type B Single Board Computer US$35.00       US$35.00
Case-CLR        1       Raspberry Pi Type B Case - Clear          US$6.47        US$6.47
                                                                  Running Total  US$41.47      
Standard Delivery (Despatch expected within 11 week(s))                          US$8.02     
                                                                  Order total    US$49.49     


クリアケースがあったので頼みました。電源はヨーロッパ規格だったようなのでやめました。5V 1.2Aでした。
PayPalで支払って、支払額は \4,054 JPY でした。
来るのが楽しみですが、11週後ですよね?ほぼ3ヶ月後です。。。9月の真ん中か終わりの頃来るのかな?

P.S. いま bitmap_disp_cont_axi_master.v のVerilogファイルを書いているところです。bitmap_disp_cont_axi_master.v は書き終わって、axi_master_interface.v のAXI4 バスのインターフェース部分を書いているところです。今週末は仙台に行って来るので、完成は少し遅れると思います。
  1. 2012年06月30日 03:29 |
  2. マイコン関連
  3. | トラックバック:0
  4. | コメント:0

2012年6月28日の近況

風邪を引いてしまって、なかなか風邪が抜けません。咳は出ないのですが、鼻が出ます。声が鼻声になっています。治るまで養生します。

そう言えば昨日、FPGAの部屋のメールでお仕事の依頼が来ちゃいました。これで2回目ですが、兼業は一応禁止じゃないけど、申請が必要で面倒だし、仕事自体もドツボにはまりそうな仕事だったので、お断りしました。

現在は、”AXI4バスに接続するビットマップ・ディスプレイ・コントローラの作製1(仕様)”の最初の図のbitmap_disp_engine.v を書き終わりました。EDKのpcore に下に実装ですが、非同期FIFOをCORE Generator で生成するために、その辺りのフォルダにISE Project Navigator のプロジェクトを作っています。ここで、bitmap_disp_cont_axi_master.v まで実装して、BFM(Bus Function Model) を使って単体シミュレーションをしようと思っています。
BitMapDispCont_1_120626.png

  1. 2012年06月28日 05:10 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

AXI4バスに接続するビットマップ・ディスプレイ・コントローラの作製1(仕様)

Atlysボードを使用して、AXI4バスに接続するビットマップ・ディスプレイ・コントローラ (BDC) を作製しようと思う。BDCはDDR2 SDRAMから画像のピクセルデータを適宜読んできて、HDMI端子にDVI信号を出力する回路だ。(2012/06/27:下図と説明文を書き換えた)
Spartan-3A Starter Kit などでカメラをディスプレイに表示する回路を作成してきたが、そのディスプレイに表示する部分を作成しようと思う。
具体的な回路ブロックを下に示す。
BitMapDispCont_1_120626.png

青の太い線の四角い箱のAXI Master Interface、bitmap_disp_engine、bitmap_disp_engineDVI信号変換回路などで構成される。bitmap_disp_engineの中には、非同期FIFO、ビクセルデータ管理モジュール、水平カウンタ、垂直カウンタで構成される。非同期FIFOはコア・ジェネレータで生成させた別モジュールとする。
水平カウンタ、垂直カウンタはすでにご存知のように、ピクセルデータの横縦位置のカウントをするカウンタだ。
ピクセルデータ管理モジュールは、非同期FIFOに画像のピクセルデータが無くならないようにAXI Master IPを駆動して、DDR2 SDRAMに保存してあるピクセルデータをReadする。
DVI信号変換回路は、”キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする”の回路を流用して改造することにする。
ピクセルデータはRGB各8ビットずつの24ビットとするが、リザーブビットを含めて32ビットとする。
BitMapDispCont_2_120626.png

AXI Master IPのAXI4バスのバス幅は64ビットにしようと思っている。これは、非同期FIFOに頻繁にReadするのを防ぐためと、SXGAに対応するためだ。
  1. 2012年06月26日 05:35 |
  2. AXI4 Master IPの作製
  3. | トラックバック:0
  4. | コメント:0

Zynq-7000(ZC702)のチュートリアル2をやってみた3(PSの設定、インプリメント)

Zynq-7000(ZC702)のチュートリアル2をやってみた2(IPの接続)”の続き。

今回はXPSのZynq タブで設定を行った後、PlanAheadに戻って論理合成、インプリメントした。

・XPSのZynqタブで、緑色の32b GP AXI Master Portsボタンをクリックした。
ZC702_60_120624.png

・processing_system7のダイアログが開いた。Generalを展開した。

・Enable GPIO on EMIO Interface にチェックを付けた。

・Width of GPIO on EMIO Interface を1にセットした。OKボタンをクリックした。
ZC702_61_120624.png

・System Assembly Viewタブをクリックし、Portsタブをクリック。processing_system7_0を展開する。

・(IO_IF)GPIO_0 のConnected Port のNot connected to External Ports をクリックしてプルダウンメニューからMake Ports External を選択した。
ZC702_62_120624.png

・(IO_IF)GPIO_0 のConnected Port がConnected to External Ports に変更された。
ZC702_63_120624.png

・External Ports を展開すると、axi_gpio_GPIO_IO_pin とprocessing_system7_0_GPIO_pin が外部ポートに出力されている。
ZC702_72_120624.png

・ProjectメニューからDesign Rule Check を実行した。エラーはなかった。
ZC702_64_120624.png

・XPSを閉じた。

・PlanAheadでトップファイルを作成する。Sources ウインドウでsystem.xmp を選択し、右クリックメニューからCreate Top HDL をクリックした。
ZC702_65_120624.png

・system_stub.v が生成され、トップファイルとなった。

・今度は制約ファイルを生成する。Sources ウインドウで右クリックメニューからAdd Sources を選択する。
ZC702_66_120624.png

・Add Sources ダイアログが開いた。Add or Create Constraints のラジオボタンを選択する。
ZC702_67_120624.png

・ダイアログでCreate File... ボタンをクリックした。
ZC702_68_120624.png

・Create constraints file ダイアログでFile name をsystem に変更した。
ZC702_69_120624.png

・ダイアログにsystem.ucf が入っているのが見える。Finish ボタンをクリックした。
ZC702_70_120624.png

・PlanAhead Project Manager のSources ウインドウにsystem.ucf が入った。
ZC702_71_120624.png

・下の制約を書いた。(チュートリアルから転載)

# Connect to Push Button "SW5"
NET axi_gpio_0_GPIO_IO_pin IOSTANDARD=LVCMOS25 | LOC=G19;
# Connect to Push Button "SW7"
NET processing_system7_0_GPIO_pin IOSTANDARD=LVCMOS25 | LOC=F19;


ZC702_73_120624.png

・PlanAhead のFlow Navigator でBitstream generation completes の下のGenerate Bitstream をクリックして、論理合成、インプリメントを行った。

・ダイアログが出るので、Yesボタンをクリックした。
ZC702_74_120624.png

・論理合成後にCritical warning が出たが無視する。
ZC702_75_120625.png

・ビットストリーム生成まで終了した。PLのリソースはほとんど使用していない。
ZC702_76_120625.png

・デバイス表示。PSの領域は案外小さいのかも、PLの方が圧倒的に本当に大きいのか?実際のチップではどうなんだろうか?
ZC702_77_120625.png

・FPGA Editor を開いてみた。UCFで設定したIOピンが見えた。
ZC702_78_120625.png

・最大動作周波数は、95.238MHzだった。クリティカル・パスを見てみた。
ZC702_79_120625.png

ZC702ボードを持っていないので、これで終了。

#もしかすると、続きをやることが出来るかもしれない。

Zynq-7000(ZC702)のチュートリアル2をやってみた4(実機でテストの準備)”に続く。

  1. 2012年06月25日 05:18 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

Zynq-7000(ZC702)のチュートリアル2をやってみた2(IPの接続)

Zynq-7000(ZC702)のチュートリアル2をやってみた1(XPSプロジェクトの生成)”の続き。

今回は前回生成したXPSプロジェクトにIPを接続してProgrammable Logic (PL) を完成させる。

・左のIP Catalog のGeneral Purpose IOを展開して AXI General Purpose IOをダブルクリックした。
ZC702_31_120623.png

・ダイアログが出るのでOKボタンをクリックした。
ZC702_32_120623.png

・axi_gpio_0 の設定ダイアログが開く。UserタブのChannel 1 を開き、GPIO Data Channel Width を 32 から 1 に変更する。
ZC702_33_120623.png

・どこのAXIバスに接続するか?設定するダイアログが出てくる。デフォルトのprocessing_system7_0 を確認して、OKボタンをクリックした。
ZC702_34_120623.png

・axi_gpio_0 がXPSに表示された。
ZC702_35_120623.png

・左のIP Catalog のDMA and Timer を展開して AXI Timer/Counter をダブルクリックした。
ZC702_36_120623.png

・ダイアログが出るのでOKボタンをクリックした。
ZC702_37_120623.png

・axi_timer_0 のの設定ダイアログが開く。デフォルト値のままOKボタンをクリックした。
ZC702_38_120623.png

・どこのAXIバスに接続するか?設定するダイアログが出てくる。デフォルトのprocessing_system7_0 を確認して、OKボタンをクリックした。
ZC702_39_120623.png

・axi_timer_0 がXPSに表示された。
ZC702_40_120623.png

・左のIP Catalog のDebug を展開して、ChipScope AXI Monitor をダブルクリックした。
ZC702_41_120623.png

・ダイアログが出るのでOKボタンをクリックした。
ZC702_42_120623.png

・chipscope_axi_monitor_0 の設定ダイアログが開く。デフォルト値のままOKボタンをクリックした。
ZC702_43_120623.png

・chipscope_axi_monitor_0 がXPSに表示された。
ZC702_44_120623.png

・先ほど同様、左のIP Catalog のDebugからChipScope Integrated Controller をダブルクリックした。
ZC702_45_120623.png

・ダイアログが出るのでOKボタンをクリックした。
ZC702_46_120623.png

・chipscope_icon_0 の設定ダイアログが開く。デフォルト値のままOKボタンをクリックした。
ZC702_47_120623.png

・chipscope_icon_0 がXPSに表示された。
ZC702_48_120623.png

これで、axi_interconnect_1, axi_gpio_0, axi_timer_0, chipscope_axi_monitor_0, chipscope_icon_0がXPSに入った。

・chipscope_axi_monitor_0 のCHIPSCOPE_ICON_CONTROL と、chipscope_icon_0 のcontrol0 が接続されていない。入れる順番を間違ったかもしれない。これから手動で接続する。
ZC702_49_120623.png

・chipscope_axi_monitor_0 のCHIPSCOPE_ICON_CONTROL のConnected Ports をクリックすると接続の選択が出来る。chipscope_icon_0 のcontrol0 を選択した。
ZC702_50_120623.png

・chipscope_axi_monitor_0 のCHIPSCOPE_ICON_CONTROL と、chipscope_icon_0 のcontrol0 が接続された。他の接続は大丈夫そうだ。GPIOの外部ポートも接続されていた。
ZC702_51_120623.png

・Processing_system7_0 を展開して、(BUS_IF) M_AXI_GP0::M_AXI_GPO_ACLK にprocessing_system7_0 :: FCLK_CLK0 が接続されていることを確認した。
ZC702_52_120623.png

・Processing_system7_0 のIRQ_F2P がNo Connection なのでaxi_timer_0のInterrupt に接続する。 L to H: No Connection をクリックする。
ZC702_53_120623.png

・Interrupt Connection Dialog が開く。Unconnected Interrrpt(s) ペインの axi_timer_0のInterrupt が選択されているので右向き矢印をクリックする。
ZC702_55_120623.png

・Unconnected Interrrpt(s) ペインの axi_timer_0のInterrupt が Connected Interrrpt(s) ペインに移動した。OKボタンをクリックした。
ZC702_56_120623.png

・Processing_system7_0 のIRQ_F2P がL to H: axi_timer_0_Interrupt に接続された。
ZC702_57_120624.png

・Bus Interfacesタブをクリックした。chipscope_axi_monitor_0 のMON_AXIはNo Connetion になっている。No Connetion をクリックするとプルダウンメニューが出てくる。そこから、axi_gpio_0.S_AXIを選択した。
ZC702_58_120624.png

・chipscope_axi_monitor_0 のMON_AXIがaxi_gpio_0.S_AXI に接続された。これで、axi_gpio_0 のスレーブAXIバスのトランザクションがChipScope Analyzer で観察することが出来る。
ZC702_59_120624.png

Zynq-7000(ZC702)のチュートリアル2をやってみた3(PSの設定、インプリメント)”に続く。

  1. 2012年06月24日 04:46 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

Zynq-7000(ZC702)のチュートリアル2をやってみた1(XPSプロジェクトの生成)

今回はチュートリアルの”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の19ページからの”Embedded System Design Using the Zynq Processing System and Programmable Logic”チュートリアルをやってみることにした。Programmable Logic (PL) 領域を使用して、XPSでIPを繋いで、Processing System (PS) と接続して動作させるチュートリアルだ。このチュートリアルの20ページ、Figure 3-1: Block Diagramを下に引用する。PL部分にはAXI Timer とAXI Interconnect, AXI GPIO, Chipscope AXI Moniter が実装される。
ZC702_54_120623.png

さて始めよう。最初に”Zynq-7000(ZC702)のチュートリアルをやってみた1(PlanAheadプロジェクト、XPS)”と”Zynq-7000(ZC702)のチュートリアルをやってみた2(XPS、SDK)”の図はなるべく共用で使用するので、プロジェクト名やファイル名などは異なる場合があるので、ご了承ください。

・PlanAheadを立ちあげて、Create New Project をクリックし、New Projectウィザードを立ち上げる。
ZC702_1_120621.png

・Project name はZC702_example とした。Project location を設定した。
ZC702_27_120623.png

・Project Type はRTL Project を選択した。
ZC702_3_120621.png

・FPGAチップかボードを選択する。Specify でBoards を選択し、Family からZynq-7000 を選択すると、今のところ選択できるのは、ZC702 Evaluation Board のみだ。
ZC702_4_120621.png

・New Project Summary が出て、Finishボタンをクリックした。
ZC702_5_120621.png

・PlanAheadのプロジェクトが出来上がって、PlanAheadが立ち上がった。
ZC702_28_120623.png

・Project Manager のSourcesウインドウで右クリックメニューからAdd Sources... を選択する。
ZC702_29_120623.png

・Add or Create Embedded Sourcesを選択した。
ZC702_8_120621.png

・Create Sub-Design をクリックした。
ZC702_9_120621.png

・Module name にsystem と入力した。
ZC702_10_120621.png

・system.xmp がエントリに入った。Finishボタンをクリックした。
ZC702_30_120623.png

・XPSが立ち上がって、Platform Studio のダイアログが出た。Processing System7 をシステムに加えるか?と聞いてきたので、Yesボタンをクリックした。
ZC702_12_120621.png

・XPSが立ち上がった。Bus Interface タブをクリックすると、Processing System7が入っているのがわかる。
ZC702_13_120621.png

Zynq-7000(ZC702)のチュートリアル2をやってみた2(IPの接続)”に続く。

  1. 2012年06月23日 20:50 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

アメイジング・スパイダーマンを見てきました

今日は、奥さんと娘とアメイジング・スパイダーマンを先行上映で見てきました。新作スパイダーマンです。蜘蛛に刺されるところからです。


面白かったです。スパイダーマンは青春映画とSF映画が混ざっているというか、SF映画に青春の苦悩と喜びが付加されていて好きです。エンドロールは最後まで出ないほうが良いです。最後に第2弾の予告が入っています。私は、とにかく面白かったですよ。娘は面白かったと言ってました。奥さんは普通と言ってました。
  1. 2012年06月23日 20:04 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Zynq-7000(ZC702)のチュートリアルをやってみた2(XPS、SDK)

Zynq-7000(ZC702)のチュートリアルをやってみた1(PlanAheadプロジェクト、XPS)”の続き。

・XPSのZynqタブでImportアイコンをクリックした。
ZC702_15_120621.png

・Import Zynq Processing System Configurationsダイアログが開いた。System Template のZC702 Development Board Template をクリックすると、Summary of selected ConfigurationにZynq PS Configuration が表示された。
ZC702_16_120621.png

・ダイアログが開くので、Yesボタンをクリックした。Zynq MIO Configurationとデザインのアップデートをするそうだ。
ZC702_17_120621.png

・I/O Peripherals の所に色が付いた。I/O Peripheralsのなかをクリックした。
ZC702_18_120621.png

・Zynq PS MIO Configurationsダイアログが開いた。例えば、USB0はイネーブルだけど、USB1はディスエーブルということがわかる。MIO Configuration からは、どのピンを使っていて、IOタイプやPullup情報なども見て取れる。
ZC702_19_120621.png

・Zynq PS MIO Configurationsダイアログを閉じ、XPSも閉じる。

・PlanAheadでsystemの右クリックメニューからCreate Top HDLを選択して、systemのトップのHDLを作成する。
ZC702_20_120621.png

・system_stub.v が生成された。今度はハードウェアをエクスポートして、SDKを立ち上げる。FileメニューからExport -> Export Hardware... を選択する。
ZC702_21_120621.png

・Export Hardware ダイアログで、Launch SDK にチェックを入れて、OKボタンをクリックした。
ZC702_22_120621.png

・SDKが立ち上がった。system.xml が表示されていて、cortexa9 のAddress Mapが表示された。
ZC702_23_120621.png

ここで、チュートリアルはZC702ボードの設定を行なっているが、私は持っていなので飛ばす。残念だ。
次にHello Worldプロジェクトを作成する。

・FileメニューからNew -> Xilinx C Projectを選択した。

・New Projectダイアログが開いた。Hello Worldが選択されている。Zynq FSBLが増えている。First Stage Bootloader (FSBL) for Zynq. だそうだ。
ZC702_24_120622.png

・次のダイアログが開いた。Finishボタンをクリックした。
ZC702_25_120622.png

・Hello Worldプロジェクトがビルドされた。トータルでは0x12C10 (76.8KBytes) メモリを使用している。さすがに大きい。
ZC702_26_120622.png

次はZC702ボードにダウンロードして動作なんだけど、ZC702ボードを持っていないので終了。

#Xilinxで貸し出ししてくれないかな。。。

Zynq-7000(ZC702)のチュートリアルをやってみた3(実機でテスト)”に続く。

  1. 2012年06月22日 05:01 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

Zynq-7000(ZC702)のチュートリアルをやってみた1(PlanAheadプロジェクト、XPS)

Zynq-7000シリーズのxc7z020clg484-1を使用したZC702ボードを残念ながら持ってはいないのだが、チュートリアルの”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”を見つけたので、実機で試す部分を抜いて、やってみることにした。Zynq-7000の雰囲気だけでも味わってみようという企画だ。ISE14.1を使用しているが、確かISE14.1 WebPACKでも実行可能だと思う。
それでは、ZC702ボードのPlanAheadプロジェクトを作るところから始めよう。

・PlanAheadを立ちあげて、Create New Project をクリックし、New Projectウィザードを立ち上げる。
ZC702_1_120621.png

・Project name はZC702_example とした。Project location を設定した。
ZC702_2_120621.png

・Project Type はRTL Project を選択した。
ZC702_3_120621.png

・FPGAチップかボードを選択する。Specify でBoards を選択し、Family からZynq-7000 を選択すると、今のところ選択できるのは、ZC702 Evaluation Board のみだ。
ZC702_4_120621.png

・New Project Summary が出て、Finishボタンをクリックした。
ZC702_5_120621.png

・PlanAheadのプロジェクトが出来上がって、PlanAheadが立ち上がった。
ZC702_6_120621.png

・Project Manager のSourcesウインドウで右クリックメニューからAdd Sources... を選択する。
ZC702_7_120621.png

・Add or Create Embedded Sourcesを選択した。
ZC702_8_120621.png

・Create Sub-Design をクリックした。
ZC702_9_120621.png

・Module name にsystem と入力した。
ZC702_10_120621.png

・system.xmp がエントリに入った。Finishボタンをクリックした。
ZC702_11_120621.png

・XPSが立ち上がって、Platform Studio のダイアログが出た。Processing System7 をシステムに加えるか?と聞いてきたので、Yesボタンをクリックした。
ZC702_12_120621.png

・XPSが立ち上がった。Bus Interface タブをクリックすると、Processing System7が入っているのがわかる。
ZC702_13_120621.png

・Zynq タブをクリックすると、Processing System(PS) のブロック図が見えた。
ZC702_14_120621.png

Zynq-7000(ZC702)のチュートリアルをやってみた2(XPS、SDK)”に続く。

  1. 2012年06月21日 05:31 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

イイヤマの23インチワイド液晶ディスプレイを購入しました

今まで使ってきた19インチの液晶ディスプレイに音量の設定画面が表示されっぱなしになるという不具合が生じたので、液晶ディスプレイを買い換えることにしました。PlanAheadやISimを表示した時に画面の広さが小さいと感じていたので、23インチのHDの液晶ディスプレイにすることにしました。
価格コムで調べたところ、IIYAMA ProLite XB2374HDS-B PLXB2374HDS-B1が満足度1位だったので、これを買って見ることにしました。価格を調べてみるとアマゾンが安いみたいなのでアマゾンから購入しました。
昨日来て、設置しましたが、大きいです。IPS液晶なので、視野角が広いですね。満足ですが、輝度が高い。最低くらいに設定しいます。まだ明るいかな?
不満というか、買う前からわかっていたことなんですが、19インチのSXGAよりも23インチワイドのHDは字の大きさが小さいです。ブログ書く時の文字が小さく感じます。ディスプレイと目の距離を近づけることにしました。
iiyama23inch_120621.jpg
  1. 2012年06月21日 04:05 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する8(SDK2)

キャラクタROMをAXI4 Lite Slave として実装する7(SDK1)”の続き。

前回はXMDを使用してキャラクタROMのドットデータをReadしたが、今度はソフトウェアを作成して表示した。前回確認できたがaxi_uartlite がstdin, stdoutに割り振られていたので、TeraTerm を起動してXPAR_CHAR_ROM_AXI_LITE_0_S_AXI_RNG00_BASEADDRからのアドレスのオフセット値を入力して、そのアドレスのキャラクタROMのドットデータを表示した。
TeraTermの設定メニューの端末の設定は以前と同様とした。下の図に示す。
AXI_P_Monitor_19_120605.png

TeraTermを立ちあげてシリアルに接続して前回同様にアドレスオフセット0x600, 0x604をReadした。
AXI_Lite_Slave_44_120619.png

XMDでReadした時と同様に、0x18, 0x24をRead出来た。

下にソフトウェアを示す。

/* * char_rom_axi_lite_test.c * *  Created on: 2012/06/17 *      Author: Masaaki */

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

int main()
{
    unsigned char c;
    unsigned char hex_char[20];
    unsigned int addr, cr_data;
    int j;

    for(;;){
        xil_printf("Please input Character ROM Address ");
        for(j=0; j<19; j++){
            c = getc(stdin);
            if (c == '\r'){
                hex_char[j] = c;
                break;
            }else
                hex_char[j] = c; // 文字列に代入
        }
        addr = 0;
        for(j=0; j<19; j+=2){ // 文字の解析
            if (hex_char[j] == '\r')
                break;
            else{
                addr = addr << 4// 4ビット左シフト
                if (hex_char[j]>=0x30 && hex_char[j]<=0x39// 数字
                    addr += hex_char[j] - 0x30;
                else if (hex_char[j]>=0x41 && hex_char[j]<=0x46// A ~ F
                    addr += hex_char[j] - 0x41 + 10;
                else if (hex_char[j]>=0x61 && hex_char[j]<=0x66// a ~ f
                    addr += hex_char[j] - 0x61 + 10;
            }
        }
        xil_printf("\n");
        cr_data = *(volatile unsigned int *)(XPAR_CHAR_ROM_AXI_LITE_0_S_AXI_RNG00_BASEADDR+addr);
        xil_printf("Character ROM Data = %x\n", cr_data);
    }
}


なぜ文字の解析で j を +2 するかというと、getc()で1文字読んだ後に必ず 0 が入っているからだ。6、0と入力すると、'6', 0, '0', 0 と文字列に入っている。
  1. 2012年06月19日 04:50 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:2

Xilinx Simulation Library Compilation Wizard でQuesta 用のライブラリをコンパイル

Questa をISE14.1 のシミュレータとして使用するには、XilinxのプリミティブやCoregen 用のライブラリをコンパイルする必要がある。そのためにXilinxからSimulation Library Compilation Wizard が提供されている。今回はこの使い方を説明用に書いておく。(Windows7 pro 64ビット版使用)

・Windows のスタートメニューからXilinx Design Tools -> ISE Design Suite 14.1 -> ISE Design Tools -> 64-bit Tools -> Simulation Library Compilation Wizard を起動する。
compxlib_1_120618.png

・Xilinx Simulation Library Compilation Wizard が起動した。Select Simulator でQuesta Simulator を選択する。
compxlib_2_120618.png

・次の画面は、VHDL, Verilog どちらのライブラリを生成するかを選択するが、両方を選択しておく。
compxlib_3_120618.png

・どのデバイス・ファミリのライブラリを生成するかを選択する画面だが、チェックの外し方によっては不正終了してしまったので、そのままとする。
compxlib_4_120618.png

・Launch Compile Process > ボタンをクリックする。
compxlib_6_120618.png

・ライブラリのコンパイルが開始された。
compxlib_7_120618.png

・コンパイルが終了した。
compxlib_8_120618.png

・Summary を表示で終了。
compxlib_9_120618.png

・Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64の下と、Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64の下にQuestaのライブラリができた。
compxlib_10_120618.png
compxlib_11_120618.png

・、Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64にmodelsim.ini があるので、これを開いた。
compxlib_12_120618.png

・[Library] 部分のパスをQuesta のインストールフォルダのmodelsim.ini にコピーして追加する。

これで終了だが、ライブラリパスが多すぎるので、最初は下に示すくらいのライブラリパスを書いておけば良いと思う。ないと言われたら追加すれば?と思う。

unisim = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/unisim
unimacro = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/unimacro
unisims_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/unisims_ver
unimacro_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/unimacro_ver
simprim = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/simprim
simprims_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/simprims_ver
xilinxcorelib = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/xilinxcorelib
xilinxcorelib_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/xilinxcorelib_ver
uni9000_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/uni9000_ver
cpld = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/cpld
cpld_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/cpld_ver


  1. 2012年06月18日 13:10 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する7(SDK1)

キャラクタROMをAXI4 Lite Slave として実装する6(シミュレーション)”の続き。

前回、PlanAheadで論理合成、インプリメントが終了したが、microblaze_0 のメモリ領域が8Kバイトだったので、getc() を使用するため32Kバイトまで増やした。これで論理合成、インプリメントが終了した。
次に、ハードウェア情報をExportしてSDKを起動する。

・PlanAheadのFileメニューからExport -> Export Hardware... を選択した。

・ダイアログが開く。Launch SDKにチェックを入れて、OKボタンをクリックした。
PlanAhead141_82_120518.png

・SDKが起動する。以前のプロジェクトが入っている。”XPS入りのPlanAhead14.1プロジェクトを作る3(SDK)”参照。
AXI_Lite_Slave_32_120617.png

system_hw_platform -> system.xml はchar_rom_axi_lite_0 の項目が入っているが、以前作成したAtlys_bsp_0 のxparameters.h にはchar_rom_axi_lite_0 の情報はない。もう一度、NewメニューからXilinx Board Support Package を作る必要があるようだ。

・FileメニューからNew -> Xilinx Board Support Package を選択する。

・New Board Support Package Project ダイアログが出る。Project name にAtlys_CharR_bsp_0 と入力して、Finishボタンをクリックした。
AXI_Lite_Slave_33_120617.png

・Board Support Package Settings ダイアログが開いた。
AXI_Lite_Slave_34_120617.png

・左のペインからstandalone をクリックすると、stdin, stdout にaxi_uartlite_0 が割り当てられていることがわかる。OKボタンをクリックした。
AXI_Lite_Slave_35_120617.png

・Atlys_CharR_bsp_0 が生成された。こちらのxparameters.h を開くと、CHAR_ROM_AXI_LITE_0の定義が見つかった。
AXI_Lite_Slave_36_120617.png

・次にCプロジェクトを作成する。FileメニューからNew -> Xilinx C Project を選択する。

・New Xilinx C Project でSelect Project Templete でEmpty Application を選択し、Project Name にchar_rom_axi_lite_test と入力して、Next > ボタンをクリックした。
AXI_Lite_Slave_37_120617.png

・Target an existing Board Support Package のラジオボタンをクリックして、Atlys_CharR_bsp_0 を指定した。Finishボタンをクリックした。
AXI_Lite_Slave_38_120617.png

・char_rom_axi_lite_test のプロジェクトが作成された。
AXI_Lite_Slave_39_120617.png

・次にCファイルを新規作成する。FileメニューからNew -> Source File を選択した。

・New Source File ダイアログのSource file にchar_rom_axi_lite_test.c を入力して、Finishボタンをクリックした。
AXI_Lite_Slave_40_120617.png

・char_rom_axi_lite_test.c が生成された。Cコードを書いてみた。
AXI_Lite_Slave_41_120617.png

SDKのProgram FPGAダイアログからFPGAをコンフィグ使用としたが、やはりエラーだったので、PlanAheadでiMPACTを立ちあげてコンフィグした。(”AXI Performance Monitor IPを試してみた2(SDK)”参照)

・SDKのProject Explorerで、char_rom_axi_lite_testの下のBinariesの下のchar_rom_axi_lite_test.elfで右クリックして、右クリックメニューからDebug As -> Lanunch on Hardware を選択する。
AXI_Lite_Slave_42_120618.png

・ダイアログが2つ出てOKバタンをクリックしていくと、デバック画面になる。

・真ん中上のウインドウにXMDウインドウがあるので、そのタブをクリックしてXMDウインドウにした。

・mrd 0x7f800600, mrd 0x7f800604 コマンドを入れてキャラクタROMをReadしてみた。
AXI_Lite_Slave_43_120618.png

結果は0x00000018と0x00000024で、”キャラクタROMをAXI4 Lite Slave として実装する6(シミュレーション)”の最後のシミュレーション波形の結果と同様になった。
AXI_Lite_Slave_31_120616.png
  1. 2012年06月18日 05:34 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

スノーホワイト(映画)を見てきました

今日、スノーホワイト(映画)(音注意)を奥さんと下の娘と見てきました。なかなか良かったですよ。CGも良かったし、見応えがありました。しかし、白雪姫では無いような?(ネタバレ有り)



毒リンゴを食べてキスで目を覚ますところが白雪姫なんでしょうか?主役のクリステン・スチュワートも良かったし、おどろおどろしい魔女役のシャーリーズ・セロンも良かったです。
  1. 2012年06月17日 10:49 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する6(シミュレーション)

キャラクタROMをAXI4 Lite Slave として実装する5(インプリメント)”の続き。
(2012/06/18:修正)char_rom_axi_lite.v を32ビット幅データバスのアドレスに変更しました。

前回でインプリメントは終了したが、まだchar_rom_axi_lite の単体テストを行ってなかった。今回はchar_rom_axi_lite の単体でのシミュレーションを行う。

・まずは、ISEのプロジェクトを作成して、char_rom_axi_lite.v とchar_gen_rom.v をプロジェクトに加えた。
AXI_Lite_Slave_30_120616.png

・New Source... を使って、char_rom_axi_lite.v のテストベンチchar_rom_axi_lite_tb.v のテンプレートを作成した。

・char_rom_axi_lite_tb.v にVerilog コードを書き足して、テストベンチを完成させた。char_rom_axi_lite_tb.v を下に示す。

`timescale 100ps / 1ps
`default_nettype wire

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   18:53:35 06/14/2012
// Design Name:   char_rom_axi_lite
// Module Name:   H:/HDL/FndtnISEWork/Spartan6/Atlys/test/Atlys_EDK_test_PA/Atlys_EDK_test_PA.srcs/sources_1/edk/system/pcores/char_rom_axi_lite_v1_00_a/char_rom_axi_lite/char_rom_axi_lite_tb.v
// Project Name:  char_rom_axi_lite
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: char_rom_axi_lite
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module char_rom_axi_lite_tb;

    // Inputs
    wire ACLK;
    wire ARESETN;
    reg [31:0] S_AXI_AWADDR = 0;
    reg [2:0] S_AXI_AWPROT = 0;
    reg S_AXI_AWVALID = 0;
    reg [31:0] S_AXI_WDATA = 0;
    reg [3:0] S_AXI_WSTRB = 0;
    reg S_AXI_WVALID = 0;
    reg S_AXI_BREADY = 0;
    reg [31:0] S_AXI_ARADDR = 0;
    reg [2:0] S_AXI_ARPROT = 0;
    reg S_AXI_ARVALID = 0;
    reg S_AXI_RREADY = 0;

    // Outputs
    wire S_AXI_AWREADY;
    wire S_AXI_WREADY;
    wire [1:0] S_AXI_BRESP;
    wire S_AXI_BVALID;
    wire S_AXI_ARREADY;
    wire [31:0] S_AXI_RDATA;
    wire [1:0] S_AXI_RRESP;
    wire S_AXI_RVALID;

    parameter    DELAY = 10;
    
    // Instantiate the Unit Under Test (UUT)
    char_rom_axi_lite uut (
        .ACLK(ACLK), 
        .ARESETN(ARESETN), 
        .S_AXI_AWADDR(S_AXI_AWADDR), 
        .S_AXI_AWPROT(S_AXI_AWPROT), 
        .S_AXI_AWVALID(S_AXI_AWVALID), 
        .S_AXI_AWREADY(S_AXI_AWREADY), 
        .S_AXI_WDATA(S_AXI_WDATA), 
        .S_AXI_WSTRB(S_AXI_WSTRB), 
        .S_AXI_WVALID(S_AXI_WVALID), 
        .S_AXI_WREADY(S_AXI_WREADY), 
        .S_AXI_BRESP(S_AXI_BRESP), 
        .S_AXI_BVALID(S_AXI_BVALID), 
        .S_AXI_BREADY(S_AXI_BREADY), 
        .S_AXI_ARADDR(S_AXI_ARADDR), 
        .S_AXI_ARPROT(S_AXI_ARPROT), 
        .S_AXI_ARVALID(S_AXI_ARVALID), 
        .S_AXI_ARREADY(S_AXI_ARREADY), 
        .S_AXI_RDATA(S_AXI_RDATA), 
        .S_AXI_RRESP(S_AXI_RRESP), 
        .S_AXI_RVALID(S_AXI_RVALID), 
        .S_AXI_RREADY(S_AXI_RREADY)
    );

    // clk_gen のインスタンス
    clk_gen #(
        .CLK_PERIOD(100),    // 10nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(ACLK)
    );
     
    // reset_gen のインスタンス
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(ARESETN)
    );
     
    initial begin
        // Initialize Inputs
        S_AXI_AWADDR = 0;
        S_AXI_AWPROT = 0;
        S_AXI_AWVALID = 0;
        S_AXI_WDATA = 0;
        S_AXI_WSTRB = 0;
        S_AXI_WVALID = 0;
        S_AXI_BREADY = 0;
        S_AXI_ARADDR = 0;
        S_AXI_ARPROT = 0;
        S_AXI_ARVALID = 0;
        S_AXI_RREADY = 0;

        // Wait Reset rising edge
        @(posedge ARESETN);
        
        // Add stimulus here
        @(posedge ACLK);    // 次のクロックへ
        #DELAY;
        AXI_MASTER_RAC(32'h0000_0100);
        AXI_MASTER_RDC;
        #DELAY;
        @(posedge ACLK);    // 次のクロックへ        
        #DELAY;
        AXI_MASTER_RAC(32'h0000_0180);
        AXI_MASTER_RDC;
        #DELAY;
        AXI_MASTER_RAC(32'h0000_0181);
        @(posedge ACLK);    // 次のクロックへ        
        #DELAY;
        AXI_MASTER_RDC;

    end
    
    // Read Address Channel    
    task AXI_MASTER_RAC;
        input    [31:0]    araddr;
        begin
            S_AXI_ARADDR    = araddr;
            S_AXI_ARVALID     = 1'b1;
            @(posedge ACLK);    // 次のクロックへ

            while (~S_AXI_ARREADY) begin    // S_AXI_ARREADY が1になるまで待つ
                #DELAY;
                @(posedge ACLK);    // 次のクロックへ
            end
            
            #DELAY;
            S_AXI_ARADDR    = 0;
            S_AXI_ARVALID     = 1'b0;
            @(posedge ACLK);    // 次のクロックへ
            #DELAY;
        end
    endtask
    
    // Read Data Channel
    task AXI_MASTER_RDC; 
        begin
            S_AXI_RREADY = 1'b1;

            @(posedge ACLK);    // 次のクロックへ
            #DELAY;

            S_AXI_RREADY = 1'b0;
        end
    endtask

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire


そう言えば、char_rom_axi_lite.v も貼ってなかったと思うので、下に示す。

`timescale 1ns/1ps

module char_rom_axi_lite #
    (
    parameter integer C_S_AXI_ADDR_WIDTH            = 32,
    parameter integer C_S_AXI_DATA_WIDTH            = 32
    )
    (
    // System Signals
    input wire ACLK,
    input wire ARESETN,

    // Slave Interface Write Address Ports
    input  wire [C_S_AXI_ADDR_WIDTH-1:0]   S_AXI_AWADDR,
    input  wire [3-1:0]                  S_AXI_AWPROT,
    input  wire                          S_AXI_AWVALID,
    output wire                          S_AXI_AWREADY,

    // Slave Interface Write Data Ports
    input  wire [C_S_AXI_DATA_WIDTH-1:0]   S_AXI_WDATA,
    input  wire [C_S_AXI_DATA_WIDTH/8-1:0] S_AXI_WSTRB,
    input  wire                          S_AXI_WVALID,
    output wire                          S_AXI_WREADY,

    // Slave Interface Write Response Ports
    output wire [2-1:0]                 S_AXI_BRESP,
    output wire                         S_AXI_BVALID,
    input  wire                         S_AXI_BREADY,

    // Slave Interface Read Address Ports
    input  wire [C_S_AXI_ADDR_WIDTH-1:0]   S_AXI_ARADDR,
    input  wire [3-1:0]                  S_AXI_ARPROT,
    input  wire                          S_AXI_ARVALID,
    output wire                          S_AXI_ARREADY,

    // Slave Interface Read Data Ports
    output wire [C_S_AXI_DATA_WIDTH-1:0]  S_AXI_RDATA,
    output wire [2-1:0]                 S_AXI_RRESP,
    output wire                         S_AXI_RVALID,
    input  wire                         S_AXI_RREADY

    );

    // RESP の値の定義
    parameter    RESP_OKAY =        2'b00;
    parameter    RESP_EXOKAY =    2'b01;
    parameter    RESP_SLVERR =     2'b10;
    parameter    RESP_DECERR =    2'b11;
    
    parameter    IDLE_RD    =        3'b001,
                AR_DATA_WAIT =    3'b010,
                AR_DATA_VALID =    3'b100;
    reg        [2:0]    rdt_cs;
    
    wire    [7:0]    char_data;
    reg        [31:0]    char_data_1d;
    reg        rvalid;
    
    // char_gen_rom のインスタンス
    char_gen_rom char_gen_rom_inst (
        .clk(ACLK),
        .reset(~ARESETN),
        .char_addr(S_AXI_ARADDR[11:5]),
        .row_addr(S_AXI_ARADDR[4:2]),
        .dout(char_data)
    );
    
    // AXI4 LITEのReadトランザクション用ステートマシン
    always @(posedge ACLK) begin
        if (~ARESETN) begin
            rdt_cs <= IDLE_RD;
            rvalid <= 1'b0;
        end else begin
            case (rdt_cs)
                IDLE_RD :
                    if (S_AXI_ARVALID)
                        rdt_cs <= AR_DATA_WAIT;
                AR_DATA_WAIT : begin
                    rdt_cs <= AR_DATA_VALID;
                    rvalid <= 1'b1;
                end
                AR_DATA_VALID :
                    if (S_AXI_RREADY) begin
                        rdt_cs <= IDLE_RD;
                        rvalid <= 1'b0;
                    end
            endcase
        end
    end
    assign S_AXI_RVALID = rvalid;
    
    always @(posedge ACLK) begin
        if (~ARESETN)
            char_data_1d <= 8'd0;
        else begin
            if (rdt_cs == AR_DATA_WAIT)
                char_data_1d <= {24'd0, char_data};
        end
    end
    assign S_AXI_RDATA = char_data_1d;

    assign S_AXI_ARREADY = 1'b1;
    assign S_AXI_RRESP = RESP_OKAY;
    
    // Writeポートの処理、Writeが間違ってきた時にデッドロックしないように、すべてイネーブルとした
    assign S_AXI_AWREADY = 1'b1;
    assign S_AXI_WREADY = 1'b1;
    assign S_AXI_BRESP = RESP_OKAY;
    assign S_AXI_BVALID = 1'b1;
endmodule


・ISimでシミュレーションを行った。後ろ2つのAXI4 Lite Readトランザクションを下に示す。
AXI_Lite_Slave_31_120616.png

シミュレーションはうまく行ったが、やはり最初にシミュレーションした時にはバグがあった。バグを修正した。
もう一度、PlanAheadで論理合成、インプリメントを行なって、今度はSDKでソフトウェアを作成する。
  1. 2012年06月16日 04:28 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する5(インプリメント)

キャラクタROMをAXI4 Lite Slave として実装する4(UARTをXPSプロジェクトに追加する)”の続き。

今回はPlanAheadでインプリメントを行う。

最初に、XPSプロジェクトのsystem にUARTのピンを追加したので、トップのVerilog ファイルを再生成する。
・XPSプロジェクトのsystem の右クリックメニューからCreate Top HDLを選択した。

・system_stub.v が再生成された。再生成されたsystem_stub.v を下に示す。

//-----------------------------------------------------------------------------
// system_stub.v
//-----------------------------------------------------------------------------

module system_stub
  (
    RESET,
    Led,
    CLK,
    axi_uartlite_0_RX_pin,
    axi_uartlite_0_TX_pin
  );
  input RESET;
  output [0:7] Led;
  input CLK;
  input axi_uartlite_0_RX_pin;
  output axi_uartlite_0_TX_pin;

  (* BOX_TYPE = "user_black_box" *)
  system
    system_i (
      .RESET ( RESET ),
      .Led ( Led ),
      .CLK ( CLK ),
      .axi_uartlite_0_RX_pin ( axi_uartlite_0_RX_pin ),
      .axi_uartlite_0_TX_pin ( axi_uartlite_0_TX_pin )
    );

endmodule


・次に、system_stub.ucf ファイルに、UARTのピンの制約を追加した。system_stub.ucf ファイルを下に示す。

NET "CLK" LOC = "L15" | IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L42P_GCLK7_M1UDM, Type = GCLK, Sch name = GCLK
NET "RESET" LOC = "T15" | IOSTANDARD = LVCMOS33; # Bank = 2, Pin name = IO_L1N_M0_CMPMISO_2, Sch name = M0/RESET
NET "Led<0>" LOC = "U18" | IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L52N_M1DQ15, Sch name = LD0
NET "Led<1>" LOC = "M14" | IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L53P, Sch name = LD1
NET "Led<2>" LOC = "N14" | IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L53N_VREF, Sch name = LD2
NET "Led<3>" LOC = "L14" | IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L61P, Sch name = LD3
NET "Led<4>" LOC = "M13" | IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L61N, Sch name = LD4
NET "Led<5>" LOC = "D4" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L1P_HSWAPEN_0, Sch name = HSWAP/LD5
NET "Led<6>" LOC = "P16" | IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L74N_DOUT_BUSY_1, Sch name = LD6
NET "Led<7>" LOC = "N12" | IOSTANDARD = LVCMOS33; # Bank = 2, Pin name = IO_L13P_M1_2, Sch name = M1/LD7
NET "axi_uartlite_0_RX_pin" IOSTANDARD = LVCMOS33;
NET "axi_uartlite_0_RX_pin" LOC = A16;
NET "axi_uartlite_0_TX_pin" IOSTANDARD = LVCMOS33;
NET "axi_uartlite_0_TX_pin" LOC = B16;


これでインプリメントの準備は完了したので、論理合成、インプリメントを行ったところ成功した。
AXI_Lite_Slave_29_120614.png
  1. 2012年06月14日 04:49 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

インカ帝国展を見に行きました

今日は休暇を取って、奥さんと東京・上野国立科学博物館でインカ帝国展を見てきました。
朝10時ころ東京・上野国立科学博物館に着きました。結構空いているじゃない!と思ってチケットを購入。レディスデーだったので、奥さんは1000円、私は1400円でした。チケット買う時には空いていると思っていたのですが、中にはいってみると結構混んでいましたね。展示物の前は結構人で一杯でした。休みの日に見るのはとっても大変だと思います。

インカ帝国展に入ったらインカの秘宝がいっぱいというわけではなく、黄金製品は侵略者のスペインに延べ棒にされて持っていかれてしまって、あまり残ってないそうです。インカの木杯は結構おいてありました。こんな土器が展示されていました。中でも凄いのはミイラが4体ほど展示されていました。袋をかぶせてあったそうなんですが、その内の3体は袋が取れていてミイラがむき出しでよく見えました。少し不気味でしたね。大きさは小さかったです。人種的に小さいでしょうかね?
更に、良くテレビで紹介がある手術跡のある頭蓋骨が展示されていました。生で見るのはもちろん初めてなので、これが展示されていたのかと、びっくりしました。
見所としては、仙台で見てきたポンペイ展の方が見所があったというか?文明が進んでいたような気がします。紀元前と15~16世紀くらいの違いがあるんですけど。。。

昼食に科学技術館のレストランで、インカ帝国展記念特別メニューのエストファド・デ・ポジョ風、鶏もも肉のスパイシー焼きペルー風を食べました。辛くなくて、しかもスパイシーで美味しかったです。オススメです。
食事後に科学技術館の地球館を見て回りました。いや~凄いです。見どころいっぱいですね。動物の剥製から化石から、TK-80、4004、ロケット何でもありです。ゼロ戦がありました。海から引き上げたもののようです。
kagakukan_1_120613.jpg

下の写真はゼロ戦の後部部分です。空母着艦用のフックと後輪が見えます。後輪はとっても小さかったです。
kagakukan_2_120613.jpg

地球館は大体見たんですが、日本館を全く見ることができませんでした。今度行ったら日本館が見たいですね。

最後に、@Vengineer さんに教えて頂いた近くのスタバでカフェラテを飲んで帰りました。とっても楽しかったです。
kagakukan_3_120613.jpg
  1. 2012年06月13日 23:07 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する4(UARTをXPSプロジェクトに追加する)

キャラクタROMをAXI4 Lite Slave として実装する3(IPをXPSプロジェクトに追加する)”の続き。

今回は、前回XPSプロジェクトに追加したキャラクタROMをAXI4 Liteバスに接続するIPをテストするために、UARTをXPSプロジェクトに追加しようと思う。こうすることで、TeraTermでアドレスを入力したらキャラクタコードを返すアプリが作れるはずだ。

・IP Catalog のCommunication Low-Speed -> AXI UART(Lite) の右クリックメニューからAdd IPを選択した。
AXI_Lite_Slave_17_120612.png

・Add IP Instance to Desgin ダイアログが出る。Yesボタンをクリックした。
AXI_Lite_Slave_18_120612.png

・XPS Core Config ダイアログが出た。Userタブはビットレートの設定だった。これはこのままとした。
AXI_Lite_Slave_19_120612.png

・XPS Core Config ダイアログのSystemタブの設定項目を示す。
AXI_Lite_Slave_20_120612.png

・XPS Core Config ダイアログのInterconnect Settings for BUSIFタブの設定項目を示す。結局デフォルトのままOKボタンをクリックした。
AXI_Lite_Slave_21_120612.png

・Instantiate and Connect IPダイアログが出るので、OKボタンをクリックした。microblaze_0 のAXI4 Liteバスに接続する。
AXI_Lite_Slave_22_120612.png

・XPSプロジェクトでaxi_uartlite_0 が追加された。Bus Interfaceタブではmicroblaze_0 のAXI4 Liteバスに接続されていた。
AXI_Lite_Slave_23_120612.png

・Portsタブをクリックした。ここでは、axi_uartlite_0 のInterrupt が未接続だったので、これを接続する。Interrupt の空いているピンクの四角の部分をダブルクリックすると、Interrupt Connection Dialog が出てくる。Unconnected Interrupt(s) のaxi_uartlite_0 を選択して、→をクリックすると、axi_uartlite_0 がConnected Inerrruput に移動した。これでaxi_uartlite_0 Interrupt が割り込みコントローラに接続できたので、Interrupt Connection Dialog をOKボタンで閉じる。
AXI_Lite_Slave_24_120612.png

・axi_uartlite_0 のInterrupt がmicroblaze_0_intc::Intr に接続された。
AXI_Lite_Slave_25_120612.png

・axi_uartlite_0 の外部入出力ピンの設定だが、すでにaxi_uartlite_0_RX_pin とaxi_uartlite_0_TX_pin がExternal Ports に接続されていた。
AXI_Lite_Slave_26_120612.png

・Addressesタブをクリックした。ここでもaxi_uartlite_0 に64Kバイトのアドレス空間が割り当てられ、0x40600000 というアドレスが割り当てられていた。
AXI_Lite_Slave_27_120612.png

・Hardware メニューからGenerate Netlist を選択して論理合成し、char_rom_axi_lite のVerilogのバグを取った。

・ProjectメニューからDesign Rule Check を選択した。エラーは無かった。
AXI_Lite_Slave_28_120612.png

・最後に、ProjectメニューからClear All Generated Files を行った。これをしておかないとPlanAheadに戻った時にエラーになることがある。

・XPSを終了し、PlanAheadに戻った。次にすることは、UARTのTX, RXポートが増えているので、トップファイルの作りなおしと、制約ファイルにUARTのTX, RXポートの制約を書くことだ。

XPSにおけるUARTの追加は、ほとんど自動化されていて、Interrupt の追加だけは自分でやったが、他は自動で接続された。結構便利だと思う。
  1. 2012年06月13日 05:50 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する3(IPをXPSプロジェクトに追加する)

キャラクタROMをAXI4 Lite Slave として実装する2(AXI4 Lite バスの勉強2)”の続き。

前回、AXI4 Liteバスのプロトコルを検討したので、実際にVerilog でキャラクタROMをAXI4 Liteバスに接続するIPを作ってみた。ファイル名は char_rom_axi_lite.v とした。使用するPlanAheadプロジェクトは、”XPS入りのPlanAhead14.1プロジェクトを作る1(プロジェクトの生成)”、”XPS入りのPlanAhead14.1プロジェクトを作る2(XPSの設定、インプリメント)”、”XPS入りのPlanAhead14.1プロジェクトを作る3(SDK)”で新規作成したXPSプロジェクト入りのPlanAheadプロジェクトを使用する。(PlanAhead14.1を使用している)

・”12.3 EDK、12.3 ISE - カスタム AXI IP コアの作成方法”に書いてあるar37425.zipをダウンロードした。

・ar37425\axi_lite_slave_v1_00_a フォルダをAtlys_EDK_test_PA\Atlys_EDK_test_PA.srcs\sources_1\edk\system\pcores にコピーした。

・フォルダ名をaxi_lite_slave_v1_00_a から char_rom_axi_lite_v1_00_a に変更した。

・Atlys_EDK_test_PA\Atlys_EDK_test_PA.srcs\sources_1\edk\system\pcores\char_rom_axi_lite_v1_00_a\data の下のファイル名を下図のように変更した。
AXI_Lite_Slave_5_120611.png

・char_rom_axi_lite_v2_1_0.mpd のBEGIN からの行を下のように変更した。

BEGIN char_rom_axi_lite

## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION STYLE = HDL
OPTION DESC = CharROM AXI Lite Slave
OPTION LONG_DESC = Character ROM AXI4-Lite Slave
OPTION HDL = MIXED
OPTION RUN_NGCBUILD = FALSE


・char_rom_axi_lite_v2_1_0.pao の内容を下の2行に書き換えた。(コメントは残してあります)
lib char_rom_axi_lite_v1_00_a char_gen_rom.v verilog
lib char_rom_axi_lite_v1_00_a char_rom_axi_lite.v verilog

・PlanAheadプロジェクトを立ちあげて、XPSプロジェクトを起動した。まだ、IP Catalog のProject Local PCores -> USER にはCharROM AXI Lite Slave がエントリされていない。
AXI_Lite_Slave_6_120611.png

・XPSのProject メニューからRescan User Repositories を実行した。

・IP Catalog のProject Local PCores -> USER にCharROM AXI Lite Slave がエントリされた。
AXI_Lite_Slave_7_120611.png

・CharROM AXI Lite Slave を右クリックしてAdd IPした。

・Add IP Instance to Desgin ダイアログが出る。Yesボタンをクリックした。
AXI_Lite_Slave_8_120611.png

・XPS Core Config ダイアログが出るが壊れている。Cancelボタンをクリックした。
AXI_Lite_Slave_9_120611.png

やはり壊れていた。前にも”キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする9(インプリメント1)”で XPS Core Config ダイアログが壊れていたが、C_USE_ADVANCED_PORTS のENTITYを追加した覚えがある。

ウィザードが先に進むので進めてからCharROM AXI Lite Slave を削除することにする。

・Instantiate and Connect IPダイアログが出るので、OKボタンをクリックした。
AXI_Lite_Slave_10_120611.png

・CharROM AXI Lite Slave が追加されたので、右クリックメニューからDelete Instance を選択する。

・Delete IP Instance ダイアログでDelete instance and all its connections(デフォルト)を選択して、OKボタンをクリックすると、CharROM AXI Lite Slaveが消えた。
AXI_Lite_Slave_11_120611.png

・Atlys_EDK_test_PA\Atlys_EDK_test_PA.srcs\sources_1\edk\system\pcores\char_rom_axi_lite_v1_00_a\data の char_rom_axi_lite_v2_1_0.mui にC_USE_ADVANCED_PORTS のENTITYを追加した。

    <!ENTITY C_S_AXI_RNG03_HIGHADDR '
    <widget id="C_S_AXI_RNG03_HIGHADDR">
        <key>C_S_AXI_RNG03_HIGHADDR</key>
        <label>Slave AXI RNG03 High Address </label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY C_USE_ADVANCED_PORTS '
    <widget id="C_USE_ADVANCED_PORTS">
        <key>C_USE_ADVANCED_PORTS</key>
        <label>C_USE_ADVANCED_PORTS </label>
        <tip></tip>
    </widget>
    '>
]>


・XPSのProject メニューからRescan User Repositories を実行した。

・CharROM AXI Lite Slave を右クリックしてAdd IPした。Add IP Instance to Desgin ダイアログが出てから、XPS Core Config ダイアログが出た。今度はエラーはない。
AXI_Lite_Slave_12_120612.png

・XPS Core Config ダイアログのSystemタブで、S_AXI -> Slave AXI Supports Write の手のマークをクリックしてAutoを外してチェックを外した。CharROM AXI Lite Slave では、ReadのみでWriteは使用しないためだ。
AXI_Lite_Slave_13_120612.png

・前と同様に、Instantiate and Connect IPダイアログが出るので、OKボタンをクリックした。

・XPSプロジェクトにCharROM AXI Lite Slave が追加された。ポートの接続もされているし、アドレスも割り振られていた。
AXI_Lite_Slave_14_120612.png

AXI_Lite_Slave_15_120612.png

AXI_Lite_Slave_16_120612.png
  1. 2012年06月11日 05:41 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する2(AXI4 Lite バスの勉強2)

キャラクタROMをAXI4 Lite Slave として実装する1(AXI4 Lite バスの勉強)”の続き。

今回はAXI4 Lite バスのWriteとReadトランザクションのタイミングチャートを書いてみた。

最初にWriteの2つのトランザクションのタイミングチャートを書いてみた。下の図に示す。
AXI_Lite_Slave_3_120609.png

最初のWriteアクセスは最速の場合を示している。次のWriteアクセスはWrite address channel が1クロックWaitして、Writeデータ出てくるまでに1クロック遅延し、Writeデータが出てきた後も1クロック遅延している。

次にReadの2つのトランザクションのタイミングチャートを書いてみた。下の図に示す。
AXI_Lite_Slave_4_120609.png

Write同様、最初のReadアクセスは最速の場合を示している。次のReadアクセスはRead address channel が1クロックWaitして、Readデータ出てくるまでに1クロック遅延し、Readデータが出てきた後も1クロック遅延している。

AXI4 LiteはAXI4のシングル転送しか出来ない簡易版と言う感じだ。次からは、キャラクタROMをインスタンスしてAXI4 Lite Slave IPを作っていこうと思う。
  1. 2012年06月09日 18:10 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

画像センシング展(画像センシングシンポジウム)での展示

今日、明日と画像センシング展のデモンストレーションゾーンで展示を行い、説明員として行っています。画像センシング展に居らっしゃる方はブースにお越しください。”画像センシング展(画像センシングシンポジウム)に仕事の内容を展示します”を参照。
それでは会場でお会いしましょう。

(追加)
画像センシングシンポジウムから帰って来ました。画像センシング展に展示と書いてあったので、てっきり画像センシングシンポジウムの参加費は要らないと思っていたのですが、アネックスホールに展示していると参加費が必要だそうです。勘違いからご迷惑をかけたことをお詫びします。

画像センシングシンポジウムの展示ブースはこんな感じです。奥にポスターがあって、画像のボケ復元を表示するディスプレイと画像の4倍拡大ボケ復元画像を表示するディスプレイが見えます。
G_sensing_sym_1_120608.jpg

中央にサンプル画像があり、Virtex-5LX110Tの搭載されたボードが2台あります。2台ともカメラが付いていてディスプレイに表示しています。
G_sensing_sym_2_120608.jpg

ポスターです。字が見えますかね?上のほうがボケちゃってますね。(日曜日の夜に下のポスターの写真を削除します) ポスターの写真を消しました。

この研究は先生の研究で、私はFPGAに実装するお手伝いをしています。
  1. 2012年06月07日 04:49 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

キャラクタROMをAXI4 Lite Slave として実装する1(AXI4 Lite バスの勉強)

だいぶ間が開いてしまったが、”AXI4バスでDVI表示回路を作る(仕様の検討)”でキャラクタ・ディスプレイ・コントローラのキャラクタROMをAXI4 Lite Slave として実装することにした。今回はそのためのAXI4 Liteバスの仕様を勉強することにする。

AXI4バスに対してのAXI4 Liteバスの特徴を下に示す。(AMBA ® AXI ™ and ACE ™ Protocol Specification ARM IHI 0022D (ID102711) を参考にしている)

・すべてのトランザクションの転送長が1
・データバス幅は32または64ビット、Xilinxの仕様では32ビット幅
・すべてのアクセスが Non-modifiable, Non-bufferable
・排他的アクセスは無し


下にaxi_slave_v1_00_aのVerilogのテンプレートとaxi_lite_slave_v1_00_aのVerilogテンプレートをWinMerge で比較した結果を下に示す。
AXI_Lite_Slave_1_120606.png
AXI_Lite_Slave_2_120606.png

左がaxi_slave_v1_00_aのVerilogのテンプレート、右がaxi_lite_slave_v1_00_aのVerilogテンプレートだ。左に比べて、右が格段に信号が少ないことがわかる。例えば、S_AXI_AWLENやS_AXI_AWSIZE、S_AXI_AWBURST、S_AXI_ARLENやS_AXI_ARSIZE、S_AXI_ARBURST は転送数が1と決まっていれば必要ないはずだ。この様に、AXI4 Lite は、AXI4の簡易版になっているようだ。
  1. 2012年06月06日 21:22 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

AXI Performance Monitor IPを試してみた3(SDKでCソフトを作成)

AXI Performance Monitor IPを試してみた2(SDK)”の続き。

前回はXMDで直接アドレスを入力してAXI Performance Monitor を試してみたが、今回はCでソフトウェアを作成して1秒あたりのRead/Writeトランザクションのパラメータを取得することにする。
Cソフトウェアでは、標準入出力を使用する。この場合の標準入出力にはシリアルが割り当てられている。そこで、”SDKでstdio.h の関数を使う手順”を参考にxil_printf()とgetc()を使用した。
シリアル出力を見る手段としては、TeraTermを使用した。シリアルの設定値はデフォルトの9600bps, 1stop bit, no parity を使用している。TeraTermの設定メニューの端末の設定を下に示す。
AXI_P_Monitor_19_120605.png

Cソフトウェアのaxi_perf_mon_test.cの全ソースを下に示す。

/* * axi_perf_mon_test.c * *  Created on: 2012/05/31 *      Author: Masaaki */

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

// AXI Performance Monitor define
#define AXIPM_CONTROL_REGISTER                XPAR_AXI_PERF_MON_0_BASEADDR
#define AXIPM_READ_LATENCY_A_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0004
#define AXIPM_READ_LATENCY_B_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0008
#define AXIPM_READ_LATENCY_C_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x000C
#define AXIPM_READ_LATENCY_D_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0010
#define AXIPM_WRITE_LATENCY_A_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0014
#define AXIPM_WRITE_LATENCY_B_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0018
#define AXIPM_METRIC_SELECTOR_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0024
#define AXIPM_SAMPLE_INTERVAL_MSB            XPAR_AXI_PERF_MON_0_BASEADDR+0x0028
#define AXIPM_SAMPLE_INTERVAL_LSB            XPAR_AXI_PERF_MON_0_BASEADDR+0x002C
#define AXIPM_SAMPLE_INTERVAL_CONTROL_REG    XPAR_AXI_PERF_MON_0_BASEADDR+0x0030    
#define AXIPM_GLOBL_INTERRPUT_ENABLE_REG    XPAR_AXI_PERF_MON_0_BASEADDR+0x0040
#define AXIPM_INTERRUPT_ENABLE_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0044
#define AXIPM_INTERRUPT_STATUS_REG            XPAR_AXI_PERF_MON_0_BASEADDR+0x0048
#define AXIPM_METRIC_COUNTER_0_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1000
#define AXIPM_METRIC_COUNTER_0_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x1004
#define AXIPM_METRIC_COUNTER_1_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1008
#define AXIPM_METRIC_COUNTER_1_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x100C
#define AXIPM_METRIC_COUNTER_2_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1010
#define AXIPM_METRIC_COUNTER_2_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x1014
#define AXIPM_METRIC_COUNTER_3_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1018
#define AXIPM_METRIC_COUNTER_3_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x101C
#define AXIPM_METRIC_COUNTER_4_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1020
#define AXIPM_METRIC_COUNTER_4_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x1024
#define AXIPM_METRIC_COUNTER_5_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1028
#define AXIPM_METRIC_COUNTER_5_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x102C
#define AXIPM_METRIC_COUNTER_6_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1030
#define AXIPM_METRIC_COUNTER_6_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x1034
#define AXIPM_METRIC_COUNTER_7_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1038
#define AXIPM_METRIC_COUNTER_7_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x103C
#define AXIPM_METRIC_COUNTER_8_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1040
#define AXIPM_METRIC_COUNTER_8_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x1044
#define AXIPM_METRIC_COUNTER_9_H            XPAR_AXI_PERF_MON_0_BASEADDR+0x1048
#define AXIPM_METRIC_COUNTER_9_L            XPAR_AXI_PERF_MON_0_BASEADDR+0x104C
#define AXIPM_GLOBL_CLOCK_COUNTER_3            XPAR_AXI_PERF_MON_0_BASEADDR+0x0800
#define AXIPM_GLOBL_CLOCK_COUNTER_2            XPAR_AXI_PERF_MON_0_BASEADDR+0x0804
#define AXIPM_GLOBL_CLOCK_COUNTER_1            XPAR_AXI_PERF_MON_0_BASEADDR+0x0808
#define AXIPM_GLOBL_CLOCK_COUNTER_0            XPAR_AXI_PERF_MON_0_BASEADDR+0x080C
#define AXIPM_SAMPLED_METRIC_COUNTER_0_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2000
#define AXIPM_SAMPLED_METRIC_COUNTER_0_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x2004
#define AXIPM_SAMPLED_METRIC_COUNTER_1_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2008
#define AXIPM_SAMPLED_METRIC_COUNTER_1_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x200C
#define AXIPM_SAMPLED_METRIC_COUNTER_2_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2010
#define AXIPM_SAMPLED_METRIC_COUNTER_2_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x2014
#define AXIPM_SAMPLED_METRIC_COUNTER_3_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2018
#define AXIPM_SAMPLED_METRIC_COUNTER_3_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x201C
#define AXIPM_SAMPLED_METRIC_COUNTER_4_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2020
#define AXIPM_SAMPLED_METRIC_COUNTER_4_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x2024
#define AXIPM_SAMPLED_METRIC_COUNTER_5_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2028
#define AXIPM_SAMPLED_METRIC_COUNTER_5_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x202C
#define AXIPM_SAMPLED_METRIC_COUNTER_6_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2030
#define AXIPM_SAMPLED_METRIC_COUNTER_6_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x2034
#define AXIPM_SAMPLED_METRIC_COUNTER_7_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2038
#define AXIPM_SAMPLED_METRIC_COUNTER_7_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x203C
#define AXIPM_SAMPLED_METRIC_COUNTER_8_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2040
#define AXIPM_SAMPLED_METRIC_COUNTER_8_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x2044
#define AXIPM_SAMPLED_METRIC_COUNTER_9_H    XPAR_AXI_PERF_MON_0_BASEADDR+0x2048
#define AXIPM_SAMPLED_METRIC_COUNTER_9_L    XPAR_AXI_PERF_MON_0_BASEADDR+0x204C

// 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

// 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 axi_perf_mon_init(){
    *(volatile unsigned int *)(AXIPM_CONTROL_REGISTER) = 0x303// Reg Reset and Enable
    *(volatile unsigned int *)(AXIPM_CONTROL_REGISTER) = 0x101// Reg and Enable
}

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

// 結果表示文字配列の初期化
const char mean_metric[8][10][30] = {
    {"Read Latency Range 1","Read Latency Range 2""Read Latency Range 3","Read Latency Range 4","Read Latency Range 5","Read Latency Range 6","Read Latency Range 7","Read Latency Range 8""Read Latency Range 9","Total Read Latency"},
    {"Write Latency Range 1""Write Latency Range 2","Write Latency Range 3""Write Latency Range 4""Write Latency Range 5""Write Transaction Count","Read Transaction Count","Write Byte Count","Read Byte Count","Total Write Latency"},
    {"Write Transaction Count","Read Transaction Count","Slv_Wr_Idle_Cnt","Mst_Rd_Idle_Cnt","Num_BValids","Num_WLasts","Num_RLasts","Num_Wr_Bursts_Len0","Num_Rd_Bursts_Len0","Total Write Latency"},
    {"Read Latency Range 1","Read Latency Range 2","Read Latency Range 3","Read Latency Range 4","Read Latency Range 5","Read Transaction Count","Num_RLasts","Num_Rd_Bursts_Len0","Read Byte Count","Total Read Latency"},
    {"Write Latency Range 1","Write Latency Range 2","Write Latency Range 3","Write Latency Range 4","Write Latency Range 5","Write Transaction Count","Num_WLasts","Num_BValids","Write Byte Count","Total Write Latency"},
    {"Write Transaction Count","Read Transaction Count","Slv_Wr_Idle_Cnt","Mst_Rd_Idle_Cnt","Num_BValids","Num_WLasts","Num_RLasts","Num_BValids","Num_Rd_Bursts_Len0","Total Write Latency"},
    {"Transfer Cycle Count","Packet Count","Transfer Cycle Count","Mst_Idle_Cnt","Slv_Idle_Cnt","Packet Count","Transfer Cycle Count","Data Byte Count","Position Byte Count","Null Byte Count"},
    {"Transfer Cycle Count","Packet Count","Transfer Cycle Count","Mst_Idle_Cnt","Slv_Idle_Cnt","Packet Count","Transfer Cycle Count","Data Byte Count","Position Byte Count","Null Byte Count"}
};

void interrupt_clear(){
    *(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カウント、割り込みあり
}

int main()
{
    unsigned char c,d;
    int j;
    unsigned int metric_reg[10];
    
    axi_timer_init();        // axi_timerの初期化
    axi_intc_init();         // axi_intcの初期化
    
    // 割り込みハンドラ登録、割り込み許可
    microblaze_register_handler(timer_int_handler, (void *) 0);
    microblaze_enable_interrupts();

    for(;;){
        xil_printf("Please input Metric_Set_Sel numbler 0 - 7 \n");
        c = getc(stdin);
        d = getc(stdin); // CRを読み飛ばす
        xil_printf("\n");
        if (c < 0x30 || c > 0x37// 0 ~ 7でないので入力待ち
            continue;
        c = c - 0x30;
        
        // axi_timter割り込み待ち
        interrupt_clear();
        interrupt = 0;
        while(interrupt==0);
        *(volatile unsigned int *)(AXIPM_CONTROL_REGISTER) = 0x303// Reg Reset and Enable
        *(volatile unsigned int *)(AXIPM_METRIC_SELECTOR_REG) = c << 16;
        *(volatile unsigned int *)(AXIPM_CONTROL_REGISTER) = 0x101// Reg Reset and Enable
        interrupt_clear(); // 一度、空読みする
        
        // axi_timter割り込み待ち
        interrupt = 0;
        while(interrupt==0);
        // Metric Register の読み出し
        metric_reg[0] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_0_L);
        metric_reg[1] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_1_L);
        metric_reg[2] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_2_L);
        metric_reg[3] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_3_L);
        metric_reg[4] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_4_L);
        metric_reg[5] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_5_L);
        metric_reg[6] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_6_L);
        metric_reg[7] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_7_L);
        metric_reg[8] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_8_L);
        metric_reg[9] = *(volatile unsigned int *)(AXIPM_METRIC_COUNTER_9_L);
        for(j=0; j<10; j=j++)
            xil_printf("%s = %d/sec\n", mean_metric[c][j], metric_reg[j]);
        xil_printf("\n");
        interrupt_clear(); 
    }
        
    return 0;
}


これをSDKでコンパイル実行するとTeraTermに”Please input Metric_Set_Sel numbler 0 - 7”と表示が出るので、Metric Selector Register(C_BASEADDR + 0x0024)のMetric_Set_Selの番号を入力すると、対応するAXI4バスのパラメータが出てくるという寸法だ。
TeraTermの表示を下に示す。これは 3を入力して、Read Transaction のパラメータを数回取っている。
AXI_P_Monitor_20_120605.png

Read Transaction Countは常に 5/sec になっている。これは0.2秒ごとにRead Transaction を行なっているからだ。一方、Read Byte Countの値は毎回違っている。これは、M系列による擬似乱数でバースト数を決定しているためだ。
次にWrite Transaction のパラータを下に示す。WriteもRead同様になっている。
AXI_P_Monitor_21_120605.png

これで、AXI4バスの各パラータを一応モニタすることができるようになった。

最後に現在のAXI Performance Monitorで観測しているcdctest_axi_master_v1_00_aの概要を再度示す。
cdctest_axi_master_v1_00_aは、キャラクタ・ディスプレイ・コントローラAXI4スレーブIPを駆動するAXI4マスタIPとして作られている。仕様や作成過程については下のブログ記事を参照のこと。
AXI4マスタIPの作製(仕様の策定)
AXI4マスタIPの作製2(単体シミュレーション)"
"AXI4マスタIPの作製3(インプリメント)"

  1. 2012年06月05日 05:44 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

SDKでstdio.h の関数を使う手順

AXI Performance Monitor を使ったアプリをSDKで作っているが、printf() とscanf() かgetc() が使いたかった。
printf() はxil_printf() があったので、stdio.h をインクルードせずに使うことが出来た。xil_printf() は、”OS and Libraries Document Collection”の2ページに書いてあった。でもxil_scanf() は無いみたいだった。stdin からの入力が使いたいので、getc() が使いたかったので、stdio.h をインクルードして、getc() を使ってみたがリンカでエラーだった。7KBytes ほどメモリが足りないようだった。
現在のMicroBlaze のメモリ容量は16KBytes だったので、32KBytes まで増やすことにした。

・XPSを立ちあげて、Addresses タブをクリックして、microblaze_0_d_bram_ctrl のSizeを16Kから32Kに変更した。
SDK_stdio_1_120604.png

・microblaze_0_i_bram_ctrl のSizeが16Kから32Kに変更された。

・ ProjectメニューからDesign Rule Check を実行したらエラー無しだった。

・XPSを終了して、PlanAheadで論理合成、インプリメント、ビットストリームの生成を行った。

・PlanAheadのFileメニューからExport -> Export Hardware... を選択し、ダイアログでLaunch SDKにチェックを入れてSDKを立ち上げた。

・もう一度ビルドしてみると、やはり同じようにリンカでメモリが足りないと言われる。

これはリンカスクリプトを作り直す必要があると思った。

・Xilinx Tools メニューからGenerate linker script を選択した。

・ダイアログで、Output script にXPS_CDC_SVGA_141_PA.sdk\SDK\SDK_Export\axi_perf_mon_test\src\lscript.ld を指定して、Generate ボタンをクリックして、リンカスクリプトを再生成した。
SDK_stdio_2_120604.png

・再度ビルドして成功した。メモリ使用状況を下に示す。

mb-size axi_perf_mon_test.elf  |tee "axi_perf_mon_test.elf.size"
   text       data        bss        dec        hex    filename
  19824       1364       2196      23384       5b58    axi_perf_mon_test.elf
Finished building: axi_perf_mon_test.elf.size


メモリを23KBytes程度使用している。
SDK_stdio_3_120604.png

現在、作ったソフトウェアが動作するかどうか?まだ確かめられていないので、動作するかどうかは分からないが、とりあえずビルドの通し方として書いておくことにする。

(追加)
getc() の代わりにscanf() をCソースに入れたらメモリ容量を32Kにしてもオーバーフローしてしまった。標準入出力関数のコード量はかなり多いみたいだ。

(追加2)
scanf() をCソースに入れたらメモリ容量を64Kにしてもオーバーフローしてしまった。使えない。@hypermac6502 さん、教えてくれてありがとうございました。
  1. 2012年06月04日 22:08 |
  2. EDK
  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

ZedBoard Zynq™-7000 Development Board

ZedBoard Zynq™-7000 Development Board の情報がDegilentに出てました
Digilent社のFeaturesを引用させていただきます。

Zynq-7000 EPP XC7Z020-CLG484-1
Memory:
 512 MB DDR3
 256 Mb Quad-SPI Flash
 4 GB SD card
Onboard USB-JTAG Programming
10/100/1000 Ethernet
USB OTG 2.0 and USB-UART
PS & PL I/O expansion (FMC, Pmod™, XADC)
Multiple displays (1080p HDMI, 8-bit VGA, 128 x 32 OLED)
I2S Audio CODEC


ZC702 評価ボードのメモリは128MBZC702 評価ボードのメモリは1GBでした。リンクの情報が間違っていました。@hypermac6502さん情報ありがとうございました)だったので、4倍のメモリが載っていて安いということになります。しかも、ISE® WebPACK™ with device-locked ChipScope licenseなので、ChipScopeのライセンスも付いています。WebPACKでXC7Z020のXPSとSDKは使えるはずなので、ChipScopeも使えるということは完璧ですね。

同時にZedBoard.orgのサイトもリニューアルされていて、いろいろな情報が載っています。
Buyのページでは価格が出ています。Avnetで$395、Digilentで$299(アカデミック価格)でした。
ZedBoardの回路図がここ(PDF)にあります。Digilentで設計しているようです。

DigilentのサイトではShipping Aug 01, 2012 になってました。8月が楽しみです。
  1. 2012年06月02日 05:02 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:2

画像センシング展(画像センシングシンポジウム)に仕事の内容を展示します

2012年6月7日、8日に画像センシング展のデモンストレーションゾーンで仕事の内容を展示します。私はFPGAへの実装のまとめを担当しています。
DS2-15 「複数の劣化要因に対応可能な動画像の高品質復元ハードウェア」 ~ボケた動画、拡大した動画をリアルタイムできれいに復元~です。展示会場 2F アネックスホールでやってます。

内容は、デモンストレーションセッション 7日(木)~8日(金)10:00~17:00に大体書いてありますが、FPGAにニューラルネットワークを入れて、画像のボケ復元を復元したり、更にボケ復元しながら解像度変換をリアルタイムにするという内容です。ニューラルネットワークのパラメータからRubyスクリプトでVHDL記述を生成させています。

ベースとなる回路は、FPGAの部屋のブログで書いたこの辺の内容を、Virtex-5ボード用に変更して作ってあります。

もし画像センシング展にいらした折には、立ち寄っていただけると嬉しいです。よろしくお願いします。

  1. 2012年06月01日 13:12 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0