FC2カウンター FPGAの部屋 2014年08月

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

FPGAの部屋

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

ZYBO用のEmbedded Linux チュートリアル5(U-Bootのビルド)

ZYBO用のEmbedded Linux チュートリアル4(IP追加、インプリメント)”の続き。

前回までで、PL部のハードウェアを構築した。今回は、U-Bootをビルドする。

Embedded Linux® Hands-on Tutorial for the ZYBO™”の”2 Compile U-Boot (Optional)”をやってみる。

2.2

・U-bootのソースコードをDigilent社のリポジトリから取得する。ZYBO用のソースコードが入っているのは、Figure 32. Next-repository.だった。

1.次のgit コマンドで、U-BootのソースコードをDigilent社のリポジトリから取得した。
git clone -b master-next https://github.com/DigilentInc/u-boot-Digilent-Dev.git
ZYBO_EM_Linux_62_140830.png

2.cd u-boot-Digilent-Dev コマンドで、u-boot-Digilent-Dev ディレクトリに入る。

3.ZYBO用のコンフィギュレーションを行う。チュートリアルはZYBOが大文字だが、小文字でないと通らない。
make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zybo_config
ZYBO_EM_Linux_63_140830.png

4.U-Bootのビルドを行う。
make CROSS_COMPILE=arm-xilinx-linux-gnueabi-
ZYBO_EM_Linux_64_140830.png

5.u-boot ができた。成功。
ZYBO_EM_Linux_65_140830.png

6.u-boot を Windows7 のZ:\ZYBO_BS_emlx\sd_image フォルダに、u-boot をコピーして、u-boot.elf に名前を変更した。
ZYBO_EM_Linux_66_140831.png

ZYBO用のEmbedded Linux チュートリアル6(BOOT.bin の生成)”に続く。
  1. 2014年08月31日 04:47 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用のEmbedded Linux チュートリアル4(IP追加、インプリメント)

ZYBO用のEmbedded Linux チュートリアル3(myLed IPコアの作製2)”の続き。

・myLed IP をブロック・デザインで追加する。

51.Diagramウインドウに空いている所で、右クリックし、右クリックメニューから Add IP... を選択した。
ZYBO_EM_Linux_39_140830.png

52.myと入力すると、myLed_v1.0 が出てくるので、クリックしてからリターン・キーを押した。
ZYBO_EM_Linux_40_140830.png

53.調度良い所に、myLed_v1.0 が挿入された。
ZYBO_EM_Linux_41_140830.png

54.引用しているチュートリアルでは、 Run connection automationが出ているようだが、今回は出ていないので、自力で接続する。myLed_0 の S_AXI ポートを右クリックして、右クリックメニューから Make Connection... を選択した。
ZYBO_EM_Linux_42_140830.png

55.Make Connection ダイアログが表示された。processing_system7_0axi_periph の M00_AXI ポートに接続できるようだ。M00_AXI を選択して、OKボタンをクリックした。
ZYBO_EM_Linux_43_140830.png

56.processing_system7_0axi_periph の M00_AXI ポートから、myLed_0 の S_AXI ポートまで接続された。
ZYBO_EM_Linux_44_140830.png

57.残っている LEDs_4BITs ポートを削除して、s_axi_aclk と s_axi_aresetn を手動で接続した。
ZYBO_EM_Linux_45_140830.png

58.myLed_0 の led[3:0] ポートを右クリックして、右クリックメニューから、Create Port... を選択した。
ZYBO_EM_Linux_46_140830.png

59.Create Port ダイアログが表示された。デフォルトのまま、OKボタンをクリックした。
ZYBO_EM_Linux_47_140830.png

60.led[3:0] ポートが作られ、myLed_0 の led[3:0] ポートと接続された。
ZYBO_EM_Linux_48_140830.png

61.”Embedded Linux® Hands-on Tutorial for the ZYBO をやってみた”さんで、

Address Editor上でmyLed_0はUnmapped slavesのままなので,myled_0を選択してAuto Assign Addressを実行する.

ということなので、Addressタブをクリックして、割り当てられているアドレスを見た。
ZYBO_EM_Linux_49_140830.png

・やはり myLed_0 はアドレスが割り当てられていない。

62.myled_0 を右クリックして、右クリックメニューから Auto Assign Address を選択した。
ZYBO_EM_Linux_50_140830.png

63.myLed_0 は、0x43C30000 番地にマップされた。
ZYBO_EM_Linux_51_140830.png

・本当はブロック・デザインをバリデーションした方が良いが、今回は忘れてしまった。

64.ブロック・デザインをセーブする。

65.Sourcesウインドウで、base.xdc を開く。7行目から11行目の制約が古いポート名になっているので、それを led に変更する。
ZYBO_EM_Linux_55_140830.png

66.置換する leds_4bits_tri_o を選択して、右クリックし、右クリックメニューから Replace in Files... を選択した。
ZYBO_EM_Linux_56_140830.png

67.base.xdc の leds_4bits_tri_o を含んだ行が表示された。Replace All ボタンをクリックした。
ZYBO_EM_Linux_57_140830.png

68.すべて led に置換された。
ZYBO_EM_Linux_58_140830.png

69.base.xdc をセーブした。

70.Generate Bitstream をクリックして、ビットストリームを生成する。
ZYBO_EM_Linux_53_140830.png

71.ダイアログが出て、論理合成とインプリメントをやるかというので、Yesボタンをクリックした。
ZYBO_EM_Linux_53_140830.png

72.論理合成の途中で、2つほど、Critical Message が出たが、OKボタンをクリックした。
ZYBO_EM_Linux_54_140830.png

73.論理合成、インプリメント、ビットストリームの生成が終了した。問題なく成功した。
ZYBO_EM_Linux_59_140830.png

ZYBO_EM_Linux_60_140830.png

ZYBO_EM_Linux_61_140830.png

ZYBO用のEmbedded Linux チュートリアル5(U-Bootのビルド)”に続く。
  1. 2014年08月30日 05:38 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用のEmbedded Linux チュートリアル3(myLed IPコアの作製2)

ZYBO用のEmbedded Linux チュートリアル2(myLed IPコアの作製1)”の続き。

35.Sources ウインドウで、myLed_v1_0 を展開して、myLed_v1_0_S_AXI.v を選択した。
ZYBO_EM_Linux_24_140829.png

36.myLed_v1_0_S_AXI.v の18行目に”output wire [3:0] led,”を追加した。
ZYBO_EM_Linux_25_140829.png

37.myLed_v1_0_S_AXI.v の400行目に”assign led = slv_reg0[3:0];”を追加した。
ZYBO_EM_Linux_26_140829.png

38.myLed_v1_0.v の18行目に”output [3:0] led,”を追加した。
ZYBO_EM_Linux_27_140829.png

39.myLed_v1_0.v の51行目に、Ledのポート接続を追加した。
ZYBO_EM_Linux_28_140829.png

40..myLed_v1_0_S_AXI.v と myLed_v1_0.v をセーブして、追加した Verilog HDL コードをテストするため、論理シミュレーションのコンパイルを行う。
ZYBO_EM_Linux_29_140829.png

41.正常にコンパイルされた。エラーは無かった。なお、テストベンチを作成していないため、波形は X や Z ばかりとなる。
ZYBO_EM_Linux_30_140829.png

42.次は、myLed のIP化だ。Package IP の IP Identification 画面は、”ZYBO用のEmbedded Linux チュートリアル2(myLed IPコアの作製1)”の34.にすでに示してある。

43.IP Compatibility 画面。
ZYBO_EM_Linux_31_140829.png

44.IP File Groups 画面。ここで、IPのファイル構成がわかる。
ZYBO_EM_Linux_32_140829.png

45. IP customization Parameters 画面。上の Merge changes from IP Customization Parameters Wizard をクリックした。
ZYBO_EM_Linux_33_140829.png

46.処理後のIP customization Parameters 画面。
ZYBO_EM_Linux_34_140829.png

47.IP Ports and Interfaces 画面。Led ポートがあった。
ZYBO_EM_Linux_35_140829.png

48.IP Addressing and Memory 画面。AXI Slave Lite ではなく、AXI Slave だった。
ZYBO_EM_Linux_36_140829.png

49.IP GUI Customization 画面。
ZYBO_EM_Linux_37_140829.png

50.Review and Package 画面。Re-Package IP ボタンをクリックした。
ZYBO_EM_Linux_38_140829.png

myLed IP の作製は完了だ。

”ZYBO用のEmbedded Linux チュートリアル4(IP追加、インプリメント)”に続く。
  1. 2014年08月29日 04:57 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用のEmbedded Linux チュートリアル2(myLed IPコアの作製1)

ZYBO用のEmbedded Linux チュートリアル1(IPのアップグレード)”の続き。

23.DiagramウインドウのLEDs_4Bits を右クリックし、右クリックメニューから Delete を選んで削除する。
ZYBO_EM_Linux_11_140828.png

24.LEDs_4Bits を削除後のDiagramウインドウ。
ZYBO_EM_Linux_12_140828.png

・IPを作る前に、IP Settings のデフォルト設定を Digilent に変更する。

25.Flow Navigator のProject Manager -> Project Settings をクリックした。
ZYBO_EM_Linux_13_140828.png

26.IPをクリックして、Packager タブをクリックすると、Vender が marsee になっていた。
ZYBO_EM_Linux_14_140828.png

27.このままで良いのだが、Digilent に変更した。
ZYBO_EM_Linux_15_140828.png

・myLed IPコアを作製する。

28.Tools メニューからCreate and Package IP ... をクリックした。
ZYBO_EM_Linux_16_140828.png

29.Create and Package New IP ダイアログをが開いた。Next > ボタンをクリックした。
ZYBO_EM_Linux_17_140828.png

30.Create a new AXI4 peripheral のラジオボタンをクリックして、Next > ボタンをクリックした。
ZYBO_EM_Linux_18_140828.png

31.Peripheral Details で、Nameに myLed、 Display name に myLed_v1.0 (これは自動的に入力された)、Dscription に My Led IP と入力した。Next > ボタンをクリックした。
ZYBO_EM_Linux_19_140828.png

32.Add Interfaces で、Name を S00_AXI から S_AXI に変更した。
ZYBO_EM_Linux_20_140828.png

33.Edit IP のラジオボタンをクリックした。Finish ボタンをクリックした。
ZYBO_EM_Linux_21_140828.png

34.edit_myLed_v1_0 プロジェクトが立ち上がった。
ZYBO_EM_Linux_23_140828.png

ZYBO用のEmbedded Linux チュートリアル3(myLed IPコアの作製2)”に続く。
  1. 2014年08月29日 04:03 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用のEmbedded Linux チュートリアル1(IPのアップグレード)

ZYBO用のLinuxをビルドしようと思う。Digilent社のZYBOのWebページに置いてあるPDFファイルの”Embedded Linux® Hands-on Tutorial for the ZYBO™”をやってみようと思っている。一旦、チュートリアルをやってから、好みの設定にしてみようと思っている。

すでに、このチュートリアルを行った”Being a nerd engineer”さんの”Embedded Linux® Hands-on Tutorial for the ZYBO をやってみた”を参考にさせて頂きます。
注:Windows 7, 8 は、パス文字が260文字までの制限があります。Vivado はプロジェクト名を付けてフォルダを掘っていくので、容易に制限を超えてしまいます。その為、パスを短くするために、Windows の subst コマンドでフォルダにドライブを割り当てて、パスの長さを短くしています。詳しくは、”ZYBO用ビットマップ・ディスプレイ・コントローラの作製4(デバック、論理合成)”をご覧ください。)

このチュートリアルは、Digilent社のZYBOのWebページZYBO Base System Design をベースに、my_Ledを追加したハードウェアを使用する。
このチュートリアルで使用しているツールは、CentOS 6 x86_64 上のVivado 2014.1 だが、私はWindows 7 上のVivado 2014.2 とVirtualBox上のUbuntu 14.04 LTS でやってみようと思っている。

1.1
1.ZYBO Base System Designをダウンロードして、Zドライブに置いた。

2.フォルダ名を zybo_base_system から ZYBO_BS_emlx に変更した。

1.2
3.Z:\ZYBO_BS_emlx\source\vivado\hw\zybo_bsd\zybo_bsd.xpr をダブル・クリックして、Vivado 2014.2 を起動した。
ZYBO_EM_Linux_1_140827.png

4.バージョンが違うからなのか、Vivado 2014.2 が立ち上がっただけだった。

5.Quick Start の Open Project をクリックする。
ZYBO_EM_Linux_2_140827.png

6.Open Project ダイアログで、zybo_bsd.xpr をクリックして、OKボタンをクリックした。
ZYBO_EM_Linux_3_140827.png

7.Vivado 2014.2 が立ち上がった。
ZYBO_EM_Linux_4_140827.png

8.Sources ウインドウの system_wrapper.v を展開して、ブロック・デザインの system_i をダブル・クリックして、ブロック・デザインを表示した。

9.この時にブロック・デザインが Read Only になってしまった。

10.Vivado を閉じて、Explorerのプロパティから読み取り専用チェックを外して、サブフォルダまで適用した。

11.もう一度、Vivado 2014.2 を起動して zybo_bsdプロジェクトを開いたがやはり、Read Onlyだった。

12.C:\Users\Masaaki\Documents\Vivado\Zynq\ZYBO\ZYBO_BS_emlx\source\vivado\hw\zybo_bsd\zybo_bsd.xpr を右クリックして、右クリックメニューからプロパティを選ぶ。(注:Z:\ZYBO_BS_emlx\source\vivado\hw\zybo_bsd\zybo_bsd.xpr をダブル・クリックしてもアップグレード出来ないので、Cドライブから起動する必要があるようです。)

13.プロパティ・ダイアログにブロックの解除ボタンがあるので、それをクリックする。
ZYBO_EM_Linux_5_140827.png

これでブロックが解除された。

14.C:\Users\Masaaki\Documents\Vivado\Zynq\ZYBO\ZYBO_BS_emlx\source\vivado\hw\zybo_bsd\zybo_bsd.xprをダブル・クリックして Vivado 2014.2 を立ちあげた。

15.Older Project Version ダイアログが表示された。これで正常だ。

16.Automatically Upgrade to the current version のラジオボタンがクリックされているので、そのままOKボタンをクリックした。
ZYBO_EM_Linux_6_140827.png

17.Project Upgrade ダイアログが表示された。Report IP Status ボタンをクリックした。
ZYBO_EM_Linux_7_140827.png

18.Vivado のIP Status ウインドウにUpgrade Selected ボタンが表示され、クリックした。
ZYBO_EM_Linux_8_140827.png

19.Upgrade IP ダイアログが表示された。OKボタンをクリックした。
ZYBO_EM_Linux_9_140827.png

20.IPのアップグレードが終了し、Diagramウインドウが表示された。
ZYBO_EM_Linux_10_140827.png

21.一旦、Vivado プロジェクトを閉じて、もう一度、Z:\ZYBO_BS_emlx\source\vivado\hw\zybo_bsd\zybo_bsd.xpr をダブル・クリックして、Vivado 2014.2 を起動する。

22.system ブロック・デザインを開いた。
ZYBO_EM_Linux_22_140828.png

ZYBO用のEmbedded Linux チュートリアル2(myLed IPコアの作製1)”に続く。
  1. 2014年08月27日 04:03 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ表示回路の作製6(デバック2、完成)

ZYBO用カメラ表示回路の作製5(デバック1)”の続き。

前回、ビットマップ・ディスプレイ・コントローラのAXI4 Read トランザクションとカメラ・インターフェースのAXI4 Write トランザクションがどちらもDecode Error(RRESP, BRESPが 3)となってしまった。この原因を追求する。

問題だと思ったのは、IPを作製するときにIPのアドレス範囲をHD解像度の画像で良いので、8Mバイトとしたことだ。
ZYBO_Cam_Disp_66_140819.png

bitmap_disp_cntrler_axi_master_0 と mt9d111_inf_axi_master_0 のアドレス範囲が23ビット長になっている。これは、0番地から2の23乗-1番地までのアドレスのみのアクセス範囲になっているじゃないだろうか?と言うことだ。スレーブならば、必要なアドレス領域を指定して、オフセットアドレスを設定できるが、マスタは違うんじゃないだろうか?
Zynqは0番地から0x3FFFFFFFまでの1Gバイトのメモリを持つことができるので、この範囲を指定する必要があるんじゃないだろうか?つまり0番地から2の30乗-1までアクセスできる必要があるので、1Gバイトをアクセス範囲として指定する必要があるんじゃないか?と思った。これが0x80000000~0xBFFFFFFFまでのアドレス領域にアクセスする必要があれば、2の32乗のアドレスをアクセス範囲とする必要がある。
それで、それぞれのIPを呼び出して修正を試みた。

・bitmap_disp_cntrler_axi_master_0 を右クリックして右クリックメニューから、Edit in IP Packager を選択した。
ZYBO_Cam_Disp_118_140823.png

・Edit in IP Packager ダイアログが表示された。これで問題ないのでOKボタンをクリックした。
ZYBO_Cam_Disp_120_140823.png

・IPの編集プロジェクトが開いた。IP Addressing and Memory のRange はpow(2, 23) となっている。
ZYBO_Cam_Disp_121_140823.png

・Range を pow(2, 30) に変更した。
ZYBO_Cam_Disp_122_140823.png

・Review and Package をクリックして、Re-Package IP ボタンをクリックした。
ZYBO_Cam_Disp_123_140823.png

・同様に、mt9d111_inf_axi_master_0 も Range を pow(2, 30) に変更した。
ZYBO_Cam_Disp_124_140823.png

・V_ZYBO_CAMD142 プロジェクトに戻って、Address Editor を見てみると、bitmap_disp_cntrler_axi_master_0 と mt9d111_inf_axi_master_0 のアドレスは0x00000000からの512Mバイトとなっていた。ZYBOは512MバイトのDDR3 SDRAMを搭載しているので、それで制限されてしまっていると思う。
ZYBO_Cam_Disp_125_140823.png

これで、論理合成、インプリメント、ビットストリームの生成を行い、ハードウェアをSDKにエクスポートして、FPGAをコンフィギュレーションし、ソフトウェアを起動したところ、YUVの画面が写るが、再書き換えが無く、静止画の様になってしまった。ちゃんとした画像ではなく、YUVをRGBとして表示した時の画像だ。

もう一度、Vivado Analyzer で見ると、bitmap_disp_cntrler_axi_master_0 は問題ないが、mt9d111_inf_axi_master_0 のアドレスが0xf0000000 番地台にも行ってしまっていた。
またデバックを行ったが、原因は、カメラ・インターフェースIP (mt9d111_inf_axi_master_0) の pixel_fifo のData Counts タブの More Accurate Data Counts のチェックボックスをチェックしていなかったことだ。このチェックを忘れると、Data Count と empty, almost_empty の間で齟齬が生じてしまう。(”ZYBO用カメラ・インターフェースIPの作製1(シミュレーション)”を参照)
ZYBO_Cam_Disp_7_140816.png

これをチェックして、IPを作り直して、再度試したところカメラ画像が表示された。完成~~~。
かなり躓いてしまったが、良かった。。。やった。。。

ZYBOにカメラ(MT9D111)をつけている様子を写真に示す。
ZYBO_Cam_Disp_126_140825.jpg

ZYBO_Cam_Disp_130_140825.jpg

ZYBOのカメラ画像を示す。
ZYBO_Cam_Disp_127_140825.jpg

ビットマップ・ディスプレイ・コントローラIP(bitmap_disp_cntrler_axi_master_0)のAXI4 Read トランザクションを下に示す。RRESPは 0 で、正常だ。
ZYBO_Cam_Disp_128_140825.png

カメラ・インターフェースIP(mt9d111_inf_axi_master_0)のAXI4 Write トランザクションを下に示す。BRESPも 0 で正常だ。
ZYBO_Cam_Disp_129_140825.png
  1. 2014年08月25日 04:49 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ表示回路の作製5(デバック1)

ZYBO用カメラ表示回路の作製4(実機動作)”の続き。

前回、出来上がったZYBO用カメラ表示回路を動作させたら、画面が真っ暗だったので、デバックを行う。

・CamDispブロック・デザインを表示させた。

・ブロック・デザインで、見たいネットを右クリックして、右クリックメニューからMark Debugを選択する。

・見たいネットは、すべてデバックマークを付けた。
ZYBO_Cam_Disp_92_140820.png

・Flow Navigator の Synthesis -> Run Synthesis をクリックして、論理合成をスタートした。(ブロック・デザインをセーブしたと思う。忘れてしまった。。。)

・論理合成が終了し、ダイアログが表示された。Open Synthesized Design のラジオボタンをクリックして、OKボタンをクリックした。

・Window メニューからDebug を選択した。

・Debugウインドウの Set up Debug アイコンをクリックしてDebug ウィザートを実行する。
ZYBO_Cam_Disp_93_140822.png

・Set up Debugダイアログが表示された。Next >ボタンをクリックした。
ZYBO_Cam_Disp_94_140822.png

・Debug を行うネットが出てくる。
ZYBO_Cam_Disp_95_140822.png

・Clock Domain を指定する。Clock Domain の所で右クリックし、Select Clock Domain... を選択する。
ZYBO_Cam_Disp_96_140822.png

・CamDips_i/processing_system7_0_FCLK_CLK0 を選択した。
ZYBO_Cam_Disp_97_140822.png

・Clock Domain を CamDips_i/processing_system7_0_FCLK_CLK0 に設定できた。
ZYBO_Cam_Disp_98_140822.png

・すべてのネットの Clock Domain を CamDips_i/processing_system7_0_FCLK_CLK0 に設定した。
ZYBO_Cam_Disp_99_140822.png

・Set up Debugダイアログの ILA Gneral Options はデフォルトのままOKボタンをクリックした。
ZYBO_Cam_Disp_100_140822.png

・Summary が表示されたので、Finish ボタンをクリックした。
ZYBO_Cam_Disp_101_140822.png

・ILAコアが挿入されて、Debug画面が変わった。
ZYBO_Cam_Disp_102_140822.png

・拡大するとILAコアがインスタンスされて、CamDisp_i と接続されているのが確認できる。
ZYBO_Cam_Disp_103_140822.png

・ビットストリームを生成する。Flow Navigator で Program and Debug -> Generate Bitstream をクリックした。

・Save Project ダイアログが表示された。Save ボタンをクリックした。
ZYBO_Cam_Disp_104_140822.png

・ビットストリームが生成された。
ZYBO_Cam_Disp_105_140823.png

Hardware Manager を立ちあげて、実際の波形を観測する。

・ZYBOの電源をONにしておく。

・SDKでビットストリームをダウンロードし、ソフトウェアを起動しておく。

・Flow Navigator からOpen Hardware Manager を立ち上げる。

・Hardware Manager が立ち上がった。Open a new hardware target をクリックした。
ZYBO_Cam_Disp_106_140823.png

・Open Hardware Target ダイアログが表示された。Next >ボタンをクリックした。
ZYBO_Cam_Disp_107_140823.png

・Hardware Server Settings を設定する。Local server のデフォルトのまま、Next >ボタンをクリックした。
ZYBO_Cam_Disp_108_140823.png

・Select Hardware Target を設定する。デフォルトのまま、Next >ボタンをクリックした。
ZYBO_Cam_Disp_109_140823.png

・Summary が表示された。Finishボタンをクリックした。
ZYBO_Cam_Disp_110_140823.png

・Hardware Managerが起動して、ILAが見えた。

・トリガー条件なしで、トリガーのアイコンをクリックした。
ZYBO_Cam_Disp_111_140823.png

・波形が表示された。
ZYBO_Cam_Disp_112_140823.png

・トリガー条件として、href = 1'b1 を入力して、再度、トリガーを掛けた。
ZYBO_Cam_Disp_113_140823.png

・ビットマップ・ディスプレイ・コントローラのAXI4 Read トランザクションを示す。
ZYBO_Cam_Disp_114_140823.png

・カメラ・インターフェースの AXI4 Write トランザクションを示す。
ZYBO_Cam_Disp_115_140823.png

・カメラ・インターフェースの AXI4 Write トランザクションを拡大してみた。
BRESPが 3 (Decode Error)になっている。これはおかしい。
ZYBO_Cam_Disp_116_140823.png

・ビットマップ・ディスプレイ・コントローラの AXI4 Reasd トランザクションを拡大してみた。
RRESPが 3 (Decode Error)になっている。これもおかしい。
ZYBO_Cam_Disp_117_140823.png

次回はこのバグを修正する。
  1. 2014年08月24日 07:49 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ表示回路の作製4(実機動作)

ZYBO用カメラ表示回路の作製3(インプリメント)”の続き。

Vivado 2014.2 を使用してZYBO用カメラ表示回路を作成している。前回はインプリメントまで終了したので、Vivado でハードウェアをエクスポートしてSDKを立ちあげ、実機で動作を試みる。

・Implemented Design を開いたまま、File メニューから Export -> Export Hardware for SDK... を選択する。
ZYBO_Cam_Disp_81_140820.png

・Export Hardwareダイアログが表示された。OKボタンをクリックした。
ZYBO_Bitmap_DispC_114_140802.png

・File メニューから Launch SDK を選択した。
ZYBO_Cam_Disp_82_140820.png

・Lacunch SDKダイアログが表示された。OKボタンをクリックした。
ZYBO_Bitmap_DispC_116_140802.png

・SDKが起動した。CamDisp_wrapper_hw_platform_0 ができていた。axi_gpio_0, axi_iic_0 もアドレスが表示されている。
ZYBO_Cam_Disp_83_140820.png

Cプロジェクトを作製する。

・File メニューから New -> Application Project を選択する。

・New Project ダイアログが表示された。Project Name に draw_disp と入力して、Next > ボタンをクリックした。
ZYBO_Cam_Disp_84_140820.png

・Template では、Empty Application を選択する。Finish ボタンをクリックした。
ZYBO_Bitmap_DispC_120_140802.png

・Project Explorer 上に、 CamDisp, CamDisp_bsp プロジェクトができている。
ZYBO_Cam_Disp_85_140820.png

・Cソース・ファイルを生成する。CamDisp -> src フォルダを右クリックして、右クリックメニューから New -> Source File を選択する。
ZYBO_Cam_Disp_86_140820.png

・New Source File ダイアログが表示された。Source file に CamDisp.c と入力して、Finish ボタンをクリックした。
ZYBO_Cam_Disp_87_140820.png

・ZedBoard用のカメラ表示ソフトウェアをコピーして、ZYBO用に書き換えた。
ZYBO_Cam_Disp_89_140820.png

・ZYBOの電源をONにする。

・SDKのXilinx Tools メニューから Program FPGA を選択し、Zynqをコンフィギュレーションする。

・ Program FPGA ダイアログが表示された。Program ボタンをクリックした。
ZYBO_Cam_Disp_90_140820.png

・Zynqのコンフィギュレーションが開始され、終了した。

・draw_disp プロジェクトを右クリックして、右クリックメニューから、Run As -> Run Configurations... を選択する。

・Run Configurations ダイアログが表示された。Xilinx C/C++ application (GDB) を右クリックして、右クリックメニューからNew を選択する。

・draw_disp Debug ができた。デフォルトのまま、Run ボタンをクリックした。
ZYBO_Cam_Disp_91_140820.png

実機にHDMIとVGAで表示を見てみたが、真っ暗だった。orz...
ピン配置はあっているので、Vivado Analyzerで動作を調査しようと思う。

ZYBO用カメラ表示回路の作製5(デバック1)”の続き。
  1. 2014年08月22日 04:53 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

2つの AXI4 Master ポートを持つ XPS 用 IP の書き方(ISE14.7 の XPS)

ISE14.7 の XPS で2つのAXI4 Master ポートを持つ XPS 用 IP の書き方の覚書です。

2つのAXI4 Masterポートを下のようにMPDファイルで定義します。

BUS_INTERFACE BUS = M_AXI_0, BUS_STD = AXI, BUS_TYPE = MASTER
BUS_INTERFACE BUS = M_AXI_1, BUS_STD = AXI, BUS_TYPE = MASTER


AXI4バスのパラメータを下のように書いて、M_AXI_0, M_AXI_1 で共用していました。

PARAMETER C_M_AXI_ADDR_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = M_AXI_0:M_AXI_1
PARAMETER C_M_AXI_DATA_WIDTH = 128, DT = integer, RANGE = (32, 64, 128, 256), BUS = M_AXI_0:M_AXI_1


そうすると、一見うまく行っているように見えます。32ビットデータバス幅では、AXIインターコネクトを通して、DDR3 SDRAMへWrite できていましたが、64ビットデータバス幅、128ビットデータバス幅だと、BVALIDが帰って来ません。DDR3 SDRAMへのData Write ができていないようです。
担当するAXIインターコネクトの設定を見ると、Master Information を表示させた時に、該当するAXI4 Master Port が表示されません。論理合成やインプリメントで通っても、おかしくなっているようです。

そこで、同じ2つのAXI4 Masterポートを定義しても、それぞれのパラメータを定義して使用すると問題なく BVALIDが帰ってきました。データ Write も問題ないようです。
こんな感じです。

PARAMETER C_M_AXI_0_ADDR_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = M_AXI_0
PARAMETER C_M_AXI_0_DATA_WIDTH = 64, DT = integer, RANGE = (32, 64, 128, 256), BUS = M_AXI_0
・・・・・
PARAMETER C_M_AXI_1_ADDR_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = M_AXI_1
PARAMETER C_M_AXI_1_DATA_WIDTH = 64, DT = integer, RANGE = (32, 64, 128, 256), BUS = M_AXI_1


こうすると、担当するAXIインターコネクトの設定のMaster Information に、該当するAXI4 Master Port が表示されました。
当然、HDLも同様にパラメータを増やしました。
  1. 2014年08月21日 11:15 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ表示回路の作製3(インプリメント)

”ZYBO用カメラ表示回路の作製2(プロジェクト、ブロック・デザイン作製)”の続き。

前回で、ブロック・デザインが出来上がったので、今回は、HDLのラッパー・ファイルを生成して、インプリメントを行う。

・ブロック・デザインの Cam_Disp を右クリックして、右クリックメニューから Create HDL Wapper... を選択する。

・Create HDL Wapper ダイアログが表示された。そのまま、OKボタンをクリックした。
Vivado_ZYBO_CDC_axi_slave_158_140624.png

・CamDisp_wapper.v が生成されて、トップ・ファイルになった。
ZYBO_Cam_Disp_59_140818.png

・次に、File -> Add Source... から、制約ファイルを生成した。名前は、V_ZYBO_CAMD.xdc とした。
ZYBO_Cam_Disp_60_140818.png

・V_ZYBO_CAMD.xdc に、”ZYBO用ビットマップ・ディスプレイ・コントローラの作製5(制約の生成、インプリメント)”で生成した制約をコピーした。
ZYBO_Cam_Disp_61_140818.png

・Flow Navigaotr の Synthesis -> Run Synthesis をクリックして、論理合成を行った。

・論理合成が問題なく終了し、Synthesis Completed ダイアログが表示された。Open Synthesized Design のラジオボタンをクリックして、OKボタンをクリックした。
Vivado_ZYBO_CDC_axi_slave_160_140624.png

・Synthesized Design が開いた。ここで、残りの出力端子の出力レベルと配置の制約を行う。
ZYBO_Cam_Disp_62_140818.png

・配置制約は書き終わったので、セーブした。
ZYBO_Cam_Disp_67_140819.png

・Flow Navigator の Program and Debug -> Generate Bitstream をクリックして、インプリメントとビットストリームの生成を行った。

・インプリメントでエラー発生。pclkがクロック入力ピンじゃないというエラーだ。

[Place 30-574] Poor placement for routing between an IO pin and BUFG. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .xdc file to demote this message to a WARNING. However, the use of this override is highly discouraged. These examples can be used directly in the .xdc file to override this clock rule.
< set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF] >

pclk_IBUF_inst (IBUF.O) is locked to IOB_X0Y47
and pclk_IBUF_BUFG_inst (BUFG.I) is provisionally placed by clockplacer on BUFGCTRL_X0Y15


ZYBO_Cam_Disp_68_140819.png

・制約ファイルに CLOCK_DEDICATED_ROUTE 制約を追加して、再度インプリメントを行った。

・その結果、タイミング・エラーが発生した。
ZYBO_Cam_Disp_69_140819.png

・クロック間のパスがタイミング・エラーだった。
ZYBO_Cam_Disp_70_140819.png

・クロック間のFalse Path制約を追加した。Timing Summary の Rerun をクリックした。
ZYBO_Cam_Disp_71_140819.png

・タイミング制約を追加して、再計算してくれるようだ。タイミング制約をパスできるようだ。
ZYBO_Cam_Disp_72_140819.png

・再度、インプリメントを行った。今度は、タイミング制約をパスしている。
ZYBO_Cam_Disp_73_140819.png

・Implemented Design を開いて、pclk のIOパッドからBUFG までの配線遅延を見た。1.879nsec なので、大丈夫そう。
ZYBO_Cam_Disp_74_140819.png

・そう言えば、pclk のクロック・ピリオド制約と入力ピンのセットアップ時間制約を忘れていたので、制約を行った。制約を行う際には、”Triple Frame Buffer Controller の追加5(インプリメント、実機検証)”で実際に測定した pclk を参考にした。
ZYBO_Cam_Disp_75_140819.png

・インプリメントを行うと、タイミング・エラーが出た。pclk のピリオド制約を入れたので、clk_fpga_0 との間で、タイミング・エラーが出てしまった。
ZYBO_Cam_Disp_76_140819.png

・False Path制約を追加した。
ZYBO_Cam_Disp_77_140819.png

・Timing Summary の Rerun をクリックした。
ZYBO_Cam_Disp_78_140819.png

・False Path制約を追加すれば問題無さそうだ。
ZYBO_Cam_Disp_79_140819.png

・インプリメントを行ったところ成功した。
ZYBO_Cam_Disp_80_140819.png

制約ファイル (V_ZYBO_CAMD.xdc) を貼っておく。(2014/08/25:I2CのPULLUPを追加。2 Mega pixel Camera Module MT9D111 JPEG Out + HQ lensでも動作可能とするため)

set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[0]}]
set_property PACKAGE_PIN J18 [get_ports {vga_blue[3]}]
set_property PACKAGE_PIN K19 [get_ports {vga_blue[2]}]
set_property PACKAGE_PIN M20 [get_ports {vga_blue[1]}]
set_property PACKAGE_PIN P20 [get_ports {vga_blue[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[4]}]
set_property PACKAGE_PIN G19 [get_ports {vga_blue[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[0]}]
set_property PACKAGE_PIN F20 [get_ports {vga_green[5]}]
set_property PACKAGE_PIN H20 [get_ports {vga_green[4]}]
set_property PACKAGE_PIN J19 [get_ports {vga_green[3]}]
set_property PACKAGE_PIN L19 [get_ports {vga_green[2]}]
set_property PACKAGE_PIN N20 [get_ports {vga_green[1]}]
set_property PACKAGE_PIN H18 [get_ports {vga_green[0]}]
set_property PACKAGE_PIN F19 [get_ports {vga_red[4]}]
set_property PACKAGE_PIN G20 [get_ports {vga_red[3]}]
set_property PACKAGE_PIN J20 [get_ports {vga_red[2]}]
set_property PACKAGE_PIN L20 [get_ports {vga_red[1]}]
set_property PACKAGE_PIN M19 [get_ports {vga_red[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports vga_hsync]
set_property IOSTANDARD LVCMOS33 [get_ports vga_vsync]
set_property PACKAGE_PIN P19 [get_ports vga_hsync]
set_property PACKAGE_PIN R19 [get_ports vga_vsync]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_0_B_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_1_R_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_2_G_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN D19 [get_ports TMDS_tx_0_B_p]
set_property PACKAGE_PIN C20 [get_ports TMDS_tx_1_R_p]
set_property PACKAGE_PIN B19 [get_ports TMDS_tx_2_G_p]
set_property PACKAGE_PIN H16 [get_ports TMDS_tx_clk_p]

set_property PACKAGE_PIN T14 [get_ports {cam_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[0]}]
set_property PACKAGE_PIN U14 [get_ports {cam_data[6]}]
set_property PACKAGE_PIN T15 [get_ports {cam_data[5]}]
set_property PACKAGE_PIN U15 [get_ports {cam_data[4]}]
set_property PACKAGE_PIN P14 [get_ports {cam_data[3]}]
set_property PACKAGE_PIN V17 [get_ports {cam_data[2]}]
set_property PACKAGE_PIN R14 [get_ports {cam_data[1]}]
set_property PACKAGE_PIN V18 [get_ports {cam_data[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports mt9d111_iic_scl_io]
set_property IOSTANDARD LVCMOS33 [get_ports mt9d111_iic_sda_io]
set_property IOSTANDARD LVCMOS33 [get_ports href]
set_property IOSTANDARD LVCMOS33 [get_ports pclk]
set_property IOSTANDARD LVCMOS33 [get_ports standby]
set_property IOSTANDARD LVCMOS33 [get_ports vsync]
set_property IOSTANDARD LVCMOS33 [get_ports xck]
set_property PACKAGE_PIN V15 [get_ports mt9d111_iic_scl_io]
set_property PACKAGE_PIN W14 [get_ports mt9d111_iic_sda_io]
set_property PACKAGE_PIN W15 [get_ports vsync]
set_property PACKAGE_PIN Y14 [get_ports href]
set_property PACKAGE_PIN T11 [get_ports standby]
set_property PACKAGE_PIN T10 [get_ports pclk]
set_property PACKAGE_PIN U12 [get_ports xck]

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF]


set_false_path -from [get_clocks n_0_BUFR_pixel_clk_io] -to [get_clocks clk_fpga_0]
set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks n_0_BUFR_pixel_clk_io]


create_clock -period 55.560 -name pclk -waveform {0.000 27.780} [get_ports pclk]
set_input_delay -clock [get_clocks pclk] 10.800 [get_ports {cam_data[0] cam_data[1] cam_data[2] cam_data[3] cam_data[4] cam_data[5] cam_data[6] cam_data[7] href pclk vsync}]


set_false_path -from [get_clocks pclk] -to [get_clocks clk_fpga_0]
set_false_path -from [get_clocks *] -to [get_clocks pclk]

set_property PULLUP true [get_ports mt9d111_iic_scl_io]
set_property PULLUP true [get_ports mt9d111_iic_sda_io]

  1. 2014年08月20日 05:19 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ表示回路の作製2(プロジェクト、ブロック・デザイン作製)

ZYBO用カメラ表示回路の作製1(準備編)”の続き。

ZYBO用カメラ・インターフェースIPの作製2(IP化)”で出来上がった ZYBO用カメラ・インターフェースIP と”ZYBO用ビットマップ・ディスプレイ・コントローラIP4(IP化)”を使用して、カメラ表示回路を作製する。

・Vivado 2014.2 のプロジェクトを作製した。Default Part は xc7Z010clg400-1 を選択した。
ZYBO_Cam_Disp_29_140818.png

・ZYBO用ビットマップ・ディスプレイ・コントローラIPのフォルダ BMDispC と、ZYBO用カメラ・インターフェースIPのふぉるだ CamInf を新規作成した。
ZYBO_Cam_Disp_30_140818.png

・そこに、それぞれのアーカイブしたIPのZIPファイルの内容をコピーした。
ZYBO_Cam_Disp_31_140818.png

ZYBO_Cam_Disp_32_140818.png

・左の Flow Navigator -> Project Manager -> IP Catalog をクリックする。

・右に IP Catalog のウインドウが出る。そこで右クリックして、右クリックメニューから IP Setting... を選択する。

・Project Setting のダイアログが出る。Add Repository... ボタンをクリックする。

・ BMDispC フォルダを選択した。

・Project Setting のダイアログに戻ると、ZYBO用ビットマップ・ディスプレイ・コントローラIPが追加されている。
ZYBO_Cam_Disp_33_140818.png

・同様に、ZYBO用カメラ・インターフェースIPも追加した。
ZYBO_Cam_Disp_34_140818.png

・IP Catalog のBase IP に追加された。
ZYBO_Cam_Disp_35_140818.png

・左の Flow Navigator -> Project Manager -> Create Block Design をクリックする。

・Create Block Design ダイアログが出る。CamDisp と入力して、OKボタンをクリックする。
ZYBO_Cam_Disp_36_140818.png

・Diagramウインドウが開く。

・Add IPをクリックして、IPコアをインポートする。
ZYBO_Cam_Disp_37_140818.png

・IPのカタログが出てくるので、ZYNQ 7 Processing System をダブルクリックする。
ZYBO_Cam_Disp_38_140818.png

・ZYNQがインポートされた。
ZYBO_Cam_Disp_39_140818.png

・ZYNQをダブル・クリックした。

・ZYNQ7 Processing System (5.4) のRe-customize IP ダイアログが表示された。
ここでZYBOのWebサイトからダウンロードしたZYBOの設定ファイル (ZYBO_zynq_def.xml)を読み込む。Digilent社のZYBOサイトの”ZYBO Board Definition File for configuring the Zynq Processing System core in Xilinx Platform Studio and Vivado IP Integrator”のZIPの中に入っている。

・Import XPS Settingsをクリックする。

・ZYBO_zynq_def.xmlを指定して、OKボタンをクリックした。
ZYBO_Cam_Disp_40_140818.png

・ZYBOのMIOの情報などが設定された。
ZYBO_Cam_Disp_41_140818.png

・Page Navigatgor から、Clock Configuration をクリックし、PL Fabric Clocks を展開し、FCLK_CLK0を100MHzに設定する。

・更に、FCLK_CLK1をビットマップ・ディスプレイ・コントローラIP用の25MHz、FCLK_CLK2をMT9D111のXCK用の36MHzに設定した。
ZYBO_Cam_Disp_42_140818.png

・processing_system7_0 のポートが増えた。
ZYBO_Cam_Disp_43_140818.png

・Run Block Automation をクリックすると、processing_system_0 の選択肢が出てくるので選択した。
ZYBO_Cam_Disp_44_140818.png

・Run Block Automation ダイアログが開いた。OKボタンをクリックした。
ZYBO_Cam_Disp_45_140818.png

・DDRとFIXED_IOの外部ポートが追加された。
ZYBO_Cam_Disp_46_140818.png

・Add IP で、bitmap_disp_cntrler_axi_master(ZYBO用ビットマップ・ディスプレイ・コントローラIP)と mt9d111_inf_axi_master(ZYBO用カメラ・インターフェースIP)を追加した。
ZYBO_Cam_Disp_47_140818.png

・PSのAXI HP0ポートを有効にするため、ZYNQ 7 Processing System をダブルクリックする。

・PS-PL Configuration で HP Slave AXI Interface -> S AXI HP0 interface にチェックを入れる。
ZYBO_Cam_Disp_48_140818.png

・Run Block Automation から /processing_system7_0/A_AXI_HP0 を選択した。
ZYBO_Cam_Disp_49_140818.png

・Run Block Automation ダイアログが表示された。そのままOKボタンをクリックした。
ZYBO_Cam_Disp_50_140818.png

・AXIインターコネクトやリセットIPが追加され、bitmap_disp_cntrler_axi_master_0 のM_AXI ポートと /processing_system7_0/A_AXI_HP0 が接続された。
ZYBO_Cam_Disp_51_140818.png

・同様に、mt9d111_inf_axi_master_0 も接続した。
ZYBO_Cam_Disp_54_140818.png

・init_done を出力するために AXI_GPIO を追加した。
ZYBO_Cam_Disp_88_140820.png 

・AXI IIC を追加したり、外部ポートを接続したりして、ブロック・デザインが完成した。
ZYBO_Cam_Disp_57_140818.png

・Validate Desin アイコンをクリックして、デザインを確認したら成功した。これで、ブロック・デザインは完成した。
ZYBO_Cam_Disp_58_140818.png

・Address Editor タブの表示を示す。
ZYBO_Cam_Disp_66_140819.png

ブロック・デザインを tcl ファイルにエクスポートしてみる。

・File メニューから Export -> Export Block Design... を選択した。
ZYBO_Cam_Disp_63_140819.png

・Export Block Design ダイアログが表示された。OKボタンをクリックした。
ZYBO_Cam_Disp_64_140819.png

・Z:/V_ZYBO_CAMD142/CamDisp.tcl が生成されている。
ZYBO_Cam_Disp_65_140819.png

ZYBO用カメラ表示回路の作製3(インプリメント)”に続く。
  1. 2014年08月19日 03:53 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ・インターフェースIPの作製2(IP化)

ZYBO用カメラ・インターフェースIPの作製1(シミュレーション)”の続き。

今回はZYBO用カメラ・インターフェースIPを IP化する。

・Toolsメニューから Create and Package IP... を選択した。

・Create And Package New IPダイアログが立ち上がった。Next >ボタンをクリックした。
ZYBO_Bitmap_DispC_12_140726.png

・Package your projectのラジオボタンが選択されていたので、そのまま、Next >ボタンをクリックした。
ZYBO_Bitmap_DispC_13_140726.png

・Package your project の Packaging IP in the Project の Include .xci files が選択されていた。これは、最初にIPコアを生成する場合に選択するそうだ。そのまま、Next >ボタンをクリックした。
ZYBO_Cam_Disp_11_140817.png

・New IP Creation が表示された。Finish ボタンをクリックした。
ZYBO_Bitmap_DispC_15_140726.png

・Finish Packaging successfully ダイアログが表示された。OKボタンをクリックした。
ZYBO_Cam_Disp_12_140817.png

・Package IP ウインドウが表示された。

・IP Identification が表示されている。Vender display name と Company url を入力した。
ZYBO_Cam_Disp_13_140817.png

・IP Compatibility 画面だ。
ZYBO_Cam_Disp_14_140817.png

・IP File Groups 画面。
ZYBO_Cam_Disp_15_140817.png

・IP Customization Parameters 画面。ここで、C_UPSIDE_DOWN パラメータを編集する。

・C_UPSIDE_DOWN パラメータは、0 - 正常、1 - 逆転の値しか無いので、値を制限する。

・C_UPSIDE_DOWN パラメータをダブル・クリックする。
ZYBO_Cam_Disp_16_140817.png

・Edit IP Parameter 画面で、Should the value be restricted? のラジオボタンで、Yesをクリックする。

・List of values が選択されている。

・Enter one list element in the left box.Use Arrow Buttons to organize the list in the right box. で左のボックスに 0 と 1 を入れて、右向き矢印ボタンをクリックした。すると、右のボックスに値を入れることが出来る。
ZYBO_Cam_Disp_17_140817.png

・C_UPSIDE_DOWN パラメータを見ると、"0 1"の選択肢が入った。
ZYBO_Cam_Disp_18_140817.png

・IP Ports and Interface 画面。入出力ポートがリストされてた。ACLK と ARESETN も認識されていた。
ZYBO_Cam_Disp_19_140817.png

・IP Addressing and Memory 画面では、AXI Master のMemory Mapが表示されていた。これでは4GBの領域全部なので設定を行う

・最大の解像度HDは、1920 * 1080 * 4(1ピクセルは4バイト) = 8,294,400 バイト使用する。それより大きく、一番小さい2のn乗の値は、2~23 = 8,388,608 バイト。

よって、Range Dependency を pow(2,23) に書き換えたところ、Range は予想通り、8388608 となった。 (2014/10/25:追記)AXI Master のアドレスは、0番地からのアドレス範囲を示すため、pow(2,30) = 1GB とした。
ZYBO_Cam_Disp_20_140817.png

・IP GUI Customization 画面では、IP Integrator でインスタンスする際のシンボルが表示された。C_UPSIDE_DOWN パラメータを見るとリストになっているのがわかる。
ZYBO_Cam_Disp_21_140817.png

・Review and Package 画面で、Package IP ボタンをクリックして、IPを作製した。
ZYBO_Cam_Disp_22_140817.png

・Finished packaging successfully. ダイアログが出た。OKボタンをクリックした。
ZYBO_Cam_Disp_23_140817.png

・IP生成後のVivado 2014.2の画面。Sources ウインドウに、IP-XACTにcomponet.xml ができているのが見える。
ZYBO_Cam_Disp_24_140817.png

次にIPのアーカイブを作る。

・Package IP 画面のReview and Package から edit package settings をクリックする。
ZYBO_Cam_Disp_25_140817.png

・After Packageing で Create archive of IP にチェックを入れる。Vender も marsee に変更した。
ZYBO_Cam_Disp_26_140817.png

・この状態で、Re-Package IP ボタンをクリックすると、xilinx.com_user_mt9d111_inf_axi_master_10.zip がプロジェクト・フォルダに生成された。
ZYBO_Cam_Disp_27_140817.png

・これがZIPファイルの中身。IPがパックされているようだ。
ZYBO_Cam_Disp_28_140817.png

これで、ZYBO用カメラ・インターフェースIPを生成することができた。
  1. 2014年08月17日 05:41 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ・インターフェースIPの作製1(シミュレーション)

ZYBO用カメラ表示回路の作製1(準備編)”で、ZedBoard 用のカメラ・インターフェース・ボードとカメラ(MT9D111)を使うことにした。
今回は、カメラ・インターフェースIPを作成する、と言うか、ZedBoard用がそのまま使えるはずなので、それをコピーしてVivado 2014.2 のIPとして作製する。但し、pixel_fifo はVivado で作り直す。

・ZYBO用の Vivado 2014.2 のプロジェクトを作製し、ZedBoard用のカメラ・インターフェース用HDLを移植した。まだ、pixel_fifo は生成していない。
ZYBO_Cam_Disp_2_140816.png

・Project Manager から IP Catalog をクリックする。

・IP Catalog タブの Memories & Storage Elements -> FIFOs -> FIFO Generators をダブル・クリックする。
ZYBO_Cam_Disp_3_140816.png

・FIFO Generator ダイアログが立ち上がる。Basicタブの内容を示す。
 ・Independent Clocks Block RAMを選択した。
 ・Interface Type は Native のまま。
ZYBO_Cam_Disp_4_140816.png

・Native Ports の内容。
 ・Read Mode を First Word Fall Through に変更。
 ・Data Port Parameters -> Write Width を 64 に変更。
 ・Data Port Parameters -> Write Depth を 512 にへ変更。
ZYBO_Cam_Disp_5_140816.png

・Status Flags の内容。
 ・Optional Flags の Almost Full Flag と Almost Empty Flag をチェック。
 ・Overflow と UnderFlow Flag をチェック。
ZYBO_Cam_Disp_6_140816.png

・Data Counts タブの内容。
 ・Read Data Count (Synchronized with Read Clk) にチェックを入れて、Read Data Count Width を 9 に設定する。 More Accurate Data Counts にチェックを入れる。Read Data Count Width を 10 に設定する。(2014/08/24:修正)
ZYBO_Cam_Disp_7_140816.png

・Summary タブの内容。
ZYBO_Cam_Disp_8_140816.png

・OKボタンをクリックすると、Generate Output Products ダイアログが出てきた。Generate ボタンをクリックした。
ZYBO_Cam_Disp_9_140816.png

・pixel_fifo IP が生成された。
ZYBO_Cam_Disp_10_140816.png

・Behavioral Simulation を行った。波形的には問題ないようだ。
ZYBO_Cam_Disp_11_140816.png
  1. 2014年08月16日 12:28 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ表示回路の作製1(準備編)

ZYBOでカメラ表示をしようということで、カメラ表示回路を作ることにした。
恒例のシングル・バッファのフレーム・バッファを使用したカメラ表示回路を作製することにする。シングル・バッファのフレーム・バッファでは、カメラのWrite が 15fps(frame per second)、表示が 60fpsという状況であるため、表示している物体が動いた時に画像が乱れるのはわかっているが、とりあえずシングル・バッファで作製する。
ZedBoard Linux のフレームバッファにカメラ画像を表示8(カメラ画像表示成功)”で、ZedBoard を使用したカメラ表示ができているので、これをベースに作製することにする。
カメラはMT9D111 を使用し、そのインターフェース・ボードとして、ZedBoard 用のカメラ・インターフェース・ボードを使用する。その回路図とパターン図を下に示す。
ZedBoard_Cam_Board_1_121209.png

ZedBoard_Cam_Board_11_130120.png

この ZedBoard 用のカメラ・インターフェース・ボードを使用する場合に一番問題となるのが、PCLK入力のピン位置だ。これはカメラのクロックの入力なので、SRCCかMRCC に割り当てたいところだ。。。(”ZedBoard用CMOSカメラボードの作製1(カメラモジュールの検討)”参照)
ZYBO Reference Manual”の 24ページからの”16 Pmod Connectors”を見ると、Standard Pmodは、200Ωの抵抗がシリーズに入れてあるので、これは使用しないほうが良さそうということで、Pmod JA, JB, JC を利用することになる。下に、”ZYBO Reference Manual”の 24ページからの”16 Pmod Connectors”の”Table9. Pmod pinout.”を引用する。
ZYBO_Cam_Disp_1_140815.png

次に、ZYBOの使用しているZynq-7000 の ZYNQ XC7Z010-1CLG400C で Pmod のピンがどのIOに割り当てられているかを調べる。これは、”Zynq-7000 All Programmable SoC パッケージおよびピン配置製品仕様 UG865 (v1.4) 2014 年 6 月 11 日”の35ページからでも調べられるが、”Zynq-7000 All Programmable SoC Package Files”から”xc7z010clg400pkg.txt”を見ても検索しやすいので、良いと思う。
これらを見ると、Pmod JD の U14, U15 が SRCC なので、ここにPCLKを入れたほうが良いのだが、既存のインターフェース・ボードを使っているので、このピンは使用できない。よって通常のIOピンからクロックを入れることになる。
つまりは、何処のPmod コネクタを使用しても変わらないので、Pmod JC, JD を使用することにする。

ZYBO用カメラ表示回路の作製2(プロジェクト、ブロック・デザイン作製)”に続く。
  1. 2014年08月15日 08:49 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた7(アンパック型配列とパック型配列2)

今回は、”AR# 51836 Vivado 合成のデザイン アシスタント - SystemVerilog - 集合体データ型”のアンパック型配列サンプル (aggregate_data_types_example1.zip) とパック型配列サンプル (aggregate_data_types_example2.zip) のシミュレーションを行う。

共通に使用するテストベンチ (array_tb.sv) をまずは下に貼っておく。

`timescale 1ns / 1ps

module array_tb;
    parameter DELAY = 5;

    logic   clk;
    logic   [7:0]   address;
    wire    [7:0]   data;
    logic           cs;
    logic           we;
    logic           oe;

    logic   [7:0]   dout;

    array_unpacked array_unpacked_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

    assign data = dout;

    initial begin
        cs = 1'b1;
        oe = 1'b0;
        we = 1'b0;
        address = 8'h0;
        dout = 8'h12;

        @(posedge clk);    // next rising clock
        #DELAY;
        @(posedge clk);    // next rising clock
        #DELAY;
        we = 1'b1;  // Write

        @(posedge clk);    // next rising clock
        #DELAY;
        dout = 8'hzz;
        we = 1'b0;
        
        @(posedge clk);    // next rising clock
        #DELAY;
        oe = 1'b1;

        @(posedge clk);    // next rising clock
        #DELAY;
        @(posedge clk);    // next rising clock
        #DELAY;
        oe = 1'b0;
        
        @(posedge clk);    // next rising clock
        #DELAY;
        address = 8'h8;
        dout = 8'h34;
        we = 1'b1;  // Write

        @(posedge clk);    // next rising clock
        #DELAY;
        dout = 8'hzz;
        we = 1'b0;
        
        @(posedge clk);    // next rising clock
        #DELAY;
        oe = 1'b1;

        @(posedge clk);    // next rising clock
        #DELAY;
         @(posedge clk);    // next rising clock
        #DELAY;
       oe = 1'b0;
    end

endmodule


まずは、アンパック型配列サンプル (aggregate_data_types_example1.zip) の Behavioral Simulation を行った。表示された波形を下に示す。
SystemVerilog_30_140812.png

0番地には 12 が Write できて、Read もできている。(点線のカーソル部分) 8番地は、34 を Write して、Read 時に xx となっている。(実線のカーソル部分)

次に、Post-Synthesis Simulation を行った。表示された波形を下に示す。
SystemVerilog_33_140813.png

0番地に 12 を Write したはずが、Read では00 が読めた。(点線のカーソル部分) 8番地は、34 を Write して、Read 時に 34 を Read できている。(実線のカーソル部分)

Behavioral Simulation と Post-Synthesis Simulation の結果が全く違う。どうしたことだろう?

次に、Post-Implemantaion Simulation を行った。表示された波形を下に示す。
SystemVerilog_34_140813.png

Post-Synthesis Simulation の結果と同様な結果が得られた。

次に、パック型配列サンプル (aggregate_data_types_example2.zip) のシミュレーションを行った。

最初に、Behavioral Simulation を行った。表示された波形を下に示す。
SystemVerilog_35_140813.png

アンパック型配列の Behavioral Simulation と同様の波形だった。

次に、、Post-Synthesis Simulation を行った。表示された波形を下に示す。
SystemVerilog_36_140813.png

0番地に 12 を Write して、Read した結果も、8番地に 34 を Write して Read した結果も、00 となった。

次に、Post-Implemantaion Simulation を行った。表示された波形を下に示す。
SystemVerilog_37_140813.png

Post-Synthesis Simulation と同様に、0番地に 12 を Write して、Read した結果も、8番地に 34 を Write して Read した結果も、00 となった。

アンパック型配列サンプル (aggregate_data_types_example1.zip) とパック型配列サンプル (aggregate_data_types_example2.zip) のシミュレーション結果は、 Behavioral Simulation と、Post-Synthesis Simulation 、Post-Implemantaion Simulation の結果が違ってしまった。これはなぜだろう?論理合成結果は正しいのだろうか?
  1. 2014年08月13日 04:14 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた6(アンパック型配列とパック型配列)

今回は、”AR# 51836 Vivado 合成のデザイン アシスタント - SystemVerilog - 集合体データ型”のアンパック型配列サンプル (aggregate_data_types_example1.zip) とパック型配列サンプル (aggregate_data_types_example2.zip) を同時にやってみる。

アンパック型配列は、(aggregate_data_types_example1.zip の array_unpacked.sv から引用)

reg [DATA_WIDTH-1:0] mem [ADDR_WIDTH-1:0]; //Unpacked array declaration

で、パック型配列は、(aggregate_data_types_example2.zip の array_packed.sv から引用)

reg [DATA_WIDTH-1:0] [ADDR_WIDTH-1:0] mem ; //packed array declaration

ということだ。

まずは、aggregate_data_types_example1.zip の array_unpacked.sv からインプリメントしてみよう。このファイルは .sv とSystemVerilog の拡張子がついていても、Verilog で書かれているファイルだ。プロジェクトのボードは、ZedBoardを使用した。
インプリメントは成功したので、Implemented Design を表示してみる。
SystemVerilog_28_140811.png

address が3ビットしか無くなっている。それもそのはず、

reg [DATA_WIDTH-1:0] mem [ADDR_WIDTH-1:0]; //Unpacked array declaration

は、reg [DATA_WIDTH-1:0] mem を ADDR_WIDTH 個インスタンスしたということであるので、ADDR_WIDTH = 8 なので、8個インスタンスするには、3ビットしかアドレスが必要ないため後の5ビットのアドレスは消されてしまった。。。

次に、パック型配列の aggregate_data_types_example2.zip の array_packed.sv のプロジェクトを作成して、インプリメントしてみた。プロジェクトのボードは、ZedBoardを使用した。
array_packed.sv のアドレスは 1024ビット幅で、データは 16ビット幅だったので、 array_packed_top.sv を作成して、アンパック型配列同様のアドレス 8ビット幅、データ 8ビット幅に書きなおした。
array_packed_top.sv を下に貼っておく。

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2014/08/11 05:26:43
// Design Name: 
// Module Name: array_packed_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module array_packed_top(
    input clk,
    input [7:0] address,
    inout [7:0] data,
    input cs,
    input we,
    input oe
    );
    
    array_packed #(
        .DATA_WIDTH(8),
        .ADDR_WIDTH(8)
    ) array_packed_i (.*);
    
endmodule


インプリメントを行ったところ成功した。Implemented Design を表示してみると、address が8ビット分残っている。256個のメモリセルをインスタンスできていると思われる。
SystemVerilog_29_140811.png

アンパック型配列とパック型配列の違いは、実際にはこの辺りの違いが大きいのではないか?と思う。

(2014/08/12:追記)
アンパック型配列とパック型配列では、同じく8個のメモリがインスタンスされていた。
パック型配列では、8ビットのアドレスが残っていたが、アドレスは1つずつ8ビット単位のメモリ素子のイネーブルに接続されているようだった。
SystemVerilog_31_140812.png 

アンパック型配列では、8個のメモリ素子に接続されている。
SystemVerilog_32_140812.png

アンパック型配列は普通のメモリになっているが、パック型配列はこれでよいのだろうか?
  1. 2014年08月12日 14:10 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

STAND BY ME ドラえもん(映画)を見てきました

今日、仙台のザ・モール仙台長町(THE MALL 仙台長町)MOVIX仙台で、STAND BY ME ドラえもん(映画)を見てきました。
なかなか良かったです。泣けました。マーニーの方が好きですが、ドラえもんも良かった。3Dの品質も良かったんじゃないでしょうか?トイ・ストーリーを意識しているようでした。エンドロールとか見ても。。。
  1. 2014年08月11日 21:30 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた5(data_types_example4)

今回は、”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”の data_types_example4.zip をやってみようと思う。

Vivado 2014.2 を立ち上げて data_t_ex4 プロジェクトを作成した。使用するボードを ZedBoard に設定した。今回のデータ型のサンプルはtype operator だ。下位モジュールのパラメータでポートのデータ・タイプを変更することができるようだ。

インプリメントを行い成功した。
SystemVerilog_23_140810.png

どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_24_140810.png

インプリメントするとDelay はなくなってしまうので、2つの adder が並んでいる。

実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_25_140810.png

これだとよくわからないので、中央部分を拡大した。
SystemVerilog_26_140810.png

入力から、IBUFを通して、adder に接続され、adder からOBUF を通して出力しているのがわかる。

テストベンチ (top_tb.sv) を作成して、Vivado Simulator でシミュレーションを行った。
SystemVerilog_27_140810.png

今回も前回同様に、Vivado 2014.2 Simulator でシミュレーションを行うことができた。

最後に、top_tb.sv を貼っておく。

`timescale 1ns / 1ps

module traffic_light_tb;
    parameter DELAY    = 5;

    logic           sensor;
    logic [15:0]    green_cnt;
    logic [15:0]    yellow_cnt;
    logic           clk;
    logic           rst;
    logic           green_light;
    logic           yellow_light;
    logic           red_light;

    traffic_light traffic_light_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

    initial begin
        rst = 1'b1;
        #20 rst = 1'b0;
    end

    initial begin
        sensor = 1'b0;
        green_cnt = 5;
        yellow_cnt = 10;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        sensor = 1'b1;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        green_cnt = 0;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        yellow_cnt = 0;

    end

endmodule

  1. 2014年08月10日 08:56 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた4(data_types_example3)

今回は、”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”の data_types_example3.zip をやってみようと思う。

Vivado 2014.2 を立ち上げて data_t_ex3 プロジェクトを作成した。使用するボードを ZedBoard に設定した。今回のデータ型のサンプルはステートマシンだ。

インプリメントを行い成功した。
SystemVerilog_19_140810.png

どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_20_140810.png

うん。常識的なステートマシンの実装のようだ。

実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_21_140810.png

テストベンチ traffic_light_tb.sv を作成して、Vivado Simulator でシミュレーションを行った。今回はシミュレーションを行うことができた。
SystemVerilog_22_140810.png

ステートマシンのステートの表示が値ではなく、定義した名前で表示されていて、とっても見やすい。VHDLと同じになった。とても良いと思う。

最後に、テストベンチ traffic_light_tb.sv を貼っておく。

`timescale 1ns / 1ps

module traffic_light_tb;
    parameter DELAY    = 5;

    logic           sensor;
    logic [15:0]    green_cnt;
    logic [15:0]    yellow_cnt;
    logic           clk;
    logic           rst;
    logic           green_light;
    logic           yellow_light;
    logic           red_light;

    traffic_light traffic_light_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

    initial begin
        rst = 1'b1;
        #20 rst = 1'b0;
    end

    initial begin
        sensor = 1'b0;
        green_cnt = 5;
        yellow_cnt = 10;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        sensor = 1'b1;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        green_cnt = 0;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        yellow_cnt = 0;

    end

endmodule


  1. 2014年08月10日 05:09 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた3(data_types_example2)

今回は、”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”の data_types_example2.zip をやってみようと思う。

Vivado 2014.2 を立ち上げてプロジェクトを作成した。最初は、ZedBoardのプロジェクトを作成したが、IOピンが足りなかったので、Kintex-7 の xc7k160tfbg676-1 に変更した。

これでインプリメントが成功した。下に、IOポートの様子を示す。
SystemVerilog_14_140809.png

shortreal 型の real_out は 64ビット幅だ。realtime 型の time_out も同様に 64ビット幅だ。

どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_15_140809.png

a 入力だけに加算器とレジスタがあって、他は固定出力だった。

実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_16_140809.png

縦に長い回路になっている。下の方は固定値のIOピンのようだ。
上の方を拡大してみた。
SystemVerilog_17_140809.png

a 入力あたりだ。

論理シミュレーションを行ったところ、エラーだった。System Verilog real type portはサポートされていないそうだ。

ERROR: [XSIM 43-3190] File "C:/Users/ono/Documents/HDL/Vivado/SV_Examples/data_t_ex2/data_t_ex2.srcs/sources_1/imports/data_types_example2/real_type_example.sv" Line 31 : The "System Verilog real type port" is not supported yet for simulation.


SystemVerilog_18_140809.png

ModelSim ASE 10.1d でシミュレーションを行ったところ、問題なく成功した。
SystemVerilog_19_140809.png

最後にテストベンチ real_type_example_tb.sv を下に貼っておく。

`timescale 1ns / 1ps

module real_type_example_tb;
    parameter DELAY    = 5;

    logic clk;
    int a;
    shortreal real_out;
    realtime time_out;
    longint b;

    real_type_example real_type_example_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

   initial begin
        a = 5;

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

        a = 10;
        @(posedge clk);    // 次のクロックへ
        #DELAY;

    end

endmodule


  1. 2014年08月09日 05:46 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた2(data_types_example1)

Vivado 2104.2でSystemVerilog をやってみた1(data_types_example1)”をやってみると、Total On-Chip Power が 7.997W になっていて、大変なことになっていた。
SystemVerilog_6_140808.png

On-Chip にするとこんな感じ。I/OとDSPの消費電力が多い。
SystemVerilog_7_140808.png

どんな回路になっているか概略を見てみよう。まずは、Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_8_140808.png

ごく常識的な回路になっている。
次に、実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_9_140808.png

左右真ん中、上下で上の方の大きな2つの四角を拡大してみよう
SystemVerilog_10_140808.png

DSP48E1が使われているのがわかる。

パワーを食い過ぎているのは、クロックのタイミング制約が無い為と思われるので、クロックのタイミング制約を追加する。

タイミング制約を生成してみよう。Flow Navigator -> Implementation -> Edit Timing Constraints を選択した。

clock信号のPERIOD制約を生成する。
SystemVerilog_11_140808.png

制約をXDCファイルとしてセーブした所。
SystemVerilog_12_140808.png

もう一度インプリメントを行うと、Total On-Chip Power は 0.148Wとなった。良かった。
SystemVerilog_13_140808.png

やはり、PERIOD制約をかけないと、Total On-Chip Power の計算がまずくなるようだ。
  1. 2014年08月08日 17:06 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた1(data_types_example1)

仙台からブログを書きます。

Vivado 2014.2 でSystemVerilog がサポートされているので、確かめてみることにした。

Vivado 2014.2 のSystemVerilog サポートの情報は、”AR# 51360 Vivado 合成のデザイン アシスタント - SystemVerilog のサポート”に色々と情報があり、その下に行くとサンプルコードもある。
その内の最初の”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”がある。そこに4つのサンプルデータがある。それは、data_types_example1.zip、data_types_example2.zip, data_types_example3.zip, data_types_example4.zip だ。
最初の data_types_example1.zip を解凍すると、ALU.sv、definitions.sv、data_type_example1_readme.txt が入っていた。このサンプルはALUの動作を表すサンプルコードとなっている。
SystemVerilog_1_140808.png

その内の ALU.sv、definitions.sv を使用して、Vivado 2014.2 で data_t_ex1 プロジェクトを作成した。
試してに論理合成、インプリメントをしてみたが、クリティカル・ワーニングは出たが、正常に行うことが出来た。(プロジェクトは、ZedBoardのプロジェクトです)
SystemVerilog_2_140808.png

ALU の入出力ポートの記述引用する。


`include "definitions.sv"
import definitions::*;
module ALU(
input instruction_t IW,
input logic clock,
output logic [31:0] result
);


IWの宣言は、以下の通り。これも引用する。


typedef struct{
logic [31:0] a, b;
opcodes_t opcode;
} instruction_t;


これらの入出力ポートがどのようにインスタンスされているかを見ると、以下の図の通りになった。
SystemVerilog_3_140808.png

IWは、IW[a], IW[b], IW[opcode] の3つのポートから構成されている。ちゃんと実装されているようだ。

次にテストベンチを作成して、Behavioral Simulation を実行したが、下のエラーが出て、どうしてもシミュレーションすることができない。
SystemVerilog_4_140808.png

ERROR: [VRFC 10-2063] Module <ALU> not found while processing module instance <ALU_i> [C:/Users/ono/Documents/HDL/Vivado/SV_Examples/data_t_ex1/data_t_ex1.srcs/sim_1/new/ALU_tb.sv:33]
ERROR: [XSIM 43-3322] Static elaboration of top level Verilog design unit(s) in library work failed.


現在もこのエラーが原因でシミュレーションを行うことができない。下にテストベンチ (ALU_tb.sv) を貼っておくので、なにかお気づきの点がありましたら、コメント欄でお知らせください。よろしくお願いします。
`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2014/08/07 08:18:52
// Design Name: 
// Module Name: ALU_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////

`timescale 1ns / 1ps

`include "definitions.sv"
import definitions::*;
module ALU_tb;
    parameter DELAY    = 5;
    
    instruction_t     IW;
    logic             clock; 
    logic [31:0]    result;

    ALU ALU_i (
//        .IW(IW),
//        .clock(clock),
//        .result(result)
        .*
     );
    
    initial begin
        clock = 1'b0;
        forever begin
            clock = #10 ~clock;
        end 
    end
    
    initial begin
        IW.a = 5;
        IW.b = 2;
        IW.opcode = ADD;
        
        @(posedge clock);    // 次のクロックへ
        #DELAY;
        @(posedge clock);    // 次のクロックへ
        #DELAY;
        
        IW.opcode = SUB;
        @(posedge clock);    // 次のクロックへ
        #DELAY;

        IW.opcode = MUL;
    end    
endmodule


(追加)
ModelSim ASE 10.1d でやってみました。
run 1us コマンドを実行した所、問題なくシミュレーションすることが出来ました。
SystemVerilog_5_140808.png

Vivado 2014.2 のSimulator は SystemVerilog をシミュレーションする用途には、使わない方が良さそうですね。。。
  1. 2014年08月08日 05:11 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

明日から仙台に1週間程度滞在します

明日の朝早く仙台に行って、1週間程度滞在します。仙台の方よろしくお願いします。
暇かもしれないで、もし良かったらツイッターなどでお声がけ下さい。

というわけで、一週間程度ブログお休みかも?です。ノートパソコンを持っていくので、向こうでSystemVerilog を勉強して、その成果をブログに書いておこうかとも思っています。
それから、JavaScript勉強会も大詰めなので、その担当パートもやる予定です。

(2014/08/07:娘の手術も無事に終わって1日たちました。心配していた痛みもそれほどではないようでした。後は回復したらつくばに帰ります)
  1. 2014年08月05日 05:11 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZYBO用ビットマップ・ディスプレイ・コントローラの作製6(実機動作)

ZYBO用ビットマップ・ディスプレイ・コントローラの作製5(制約の生成、インプリメント)”の続き。

BUFRからBUFGを通す方法でXGAまではうまく行ったので、書いておこうと思う。

ハードウェアをエクスポートして、SDKを立ち上げる。

・Implemented Design を開いたまま、File メニューから Export -> Export Hardware を選択する。
ZYBO_Bitmap_DispC_113_140802.png

・Export Hardwareダイアログが表示された。OKボタンをクリックした。
ZYBO_Bitmap_DispC_114_140802.png

・File メニューから Launch SDK を選択した。
ZYBO_Bitmap_DispC_115_140802.png

・Lacunch SDKダイアログが表示された。OKボタンをクリックした。
ZYBO_Bitmap_DispC_116_140802.png

・SDKが起動した。V_ZYBO_BMDC_wrapper_hw_platform_0 ができていた。
ZYBO_Bitmap_DispC_117_140802.png

Cプロジェクトを作製する。

・File メニューから New -> Application Project を選択する。
ZYBO_Bitmap_DispC_118_140802.png

・New Project ダイアログが表示された。Project Name に draw_disp と入力して、Next > ボタンをクリックした。
ZYBO_Bitmap_DispC_119_140802.png

・Template では、Empty Application を選択する。Finish ボタンをクリックした。
ZYBO_Bitmap_DispC_120_140802.png

・Project Explorer 上に、 draw_disp, draw_disp_bsp プロジェクトができている。
ZYBO_Bitmap_DispC_121_140802.png

・Cソース・ファイルを生成する。draw_disp -> src フォルダを右クリックして、右クリックメニューから New -> Source File を選択する。
ZYBO_Bitmap_DispC_122_140802.png

・New Source File ダイアログが表示された。Source file に draw_disp.c と入力して、Finish ボタンをクリックした。
ZYBO_Bitmap_DispC_123_140802.png

・XPAR_CHAR_ROM_AXI_LITE_0_S_AXI_RNG00_BASEADDR がエラーだ。

しまった。キャラクタROMのIPをVivado の IPI に入れるを忘れていた。

・Vivado に戻って、char_rom_axi_lite IP をブロック・デザインに入れた。
ZYBO_Bitmap_DispC_125_140802.png

・これで、エラーはなくなった。
ZYBO_Bitmap_DispC_126_140802.png

・ZYBOの電源をONにする。

・SDKのXilinx Tools メニューから Program FPGA を選択し、Zynqをコンフィギュレーションする。

・ Program FPGA ダイアログが表示された。Program ボタンをクリックした。
ZYBO_Bitmap_DispC_127_140802.png

・Zynqのコンフィギュレーションが開始され、終了した。

・draw_disp プロジェクトを右クリックして、右クリックメニューから、Run As -> Run Configurations... を選択する。
ZYBO_Bitmap_DispC_128_140805.png

・Run Configurations ダイアログが表示された。Xilinx C/C++ application (GDB) を右クリックして、右クリックメニューからNew を選択する。

・draw_disp Debug ができた。デフォルトのまま、Run ボタンをクリックした。
ZYBO_Bitmap_DispC_129_140805.png

・プログラムRUNの後のSDK。
ZYBO_Bitmap_DispC_130_140805.png

・800x600のSVGAの表示画面を示す。
ZYBO_Bitmap_DispC_131_140805.jpg

・1024x768のXGAの表示画面を示す。(こっちは一回不安定な時がありました)
ZYBO_Bitmap_DispC_132_140805.jpg
  1. 2014年08月05日 05:05 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

VivadoでZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラの近況

この3日間位、XGA解像度のインプリメントばかりやってました。
クロックのダイアグラムは、25MHzで processing system 7 の FCLK_CLK1 から出力したクロックを MMCM に入れて、各解像度の5倍のピクセル・クロックを出力しています。それは、BUFIOを通して、DDRモードの OSERDESE2 出力クロックとして使用しています。また、ピクセル・クロックはBUFRで5倍のピクセル・クロックを5分周して使用しています。但し、BUFRは1パンクのクロックラインしか駆動来ません。HDMIだけだったら良いのですが、VGAポートの回路も同じBUFRの出力ピクセル・クロックで駆動することはできません。この解決策として、BUFGを通して、VGAポート用回路に回しました。これだと、BUFGの遅延が効いてくることが考えられます。SVGAはぴたっと写りましたが、XGAは揺らいでいます。

次に、BUFMRを通して、その下にツリー上にBUFR をHDMIとVGA用に2つ用意することを考えました。VGAポートは2バンクにIOがまたがっているため、これはインプリメントでエラーになりました。

最後に、最初のBUFG の代わりに、PLLで作った Zero Delay Buffer を組み込みました。これでもBUFG の時のようにSVGA は表示できますが、XGAは表示できません。

やはり、最初のBUFG に戻すことにしました。これでも SVGA はちゃんと写ります。SVGAでやろうと思います。

Digilent社の zybo_base_system は、HDMIと VGA を別のストリームで処理していますので、クロックを別にできるし、こっちの実装のほうが良いかもしれません。但し、メモリ帯域は2倍必要となるでしょう。。。
  1. 2014年08月03日 22:23 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用ビットマップ・ディスプレイ・コントローラの作製5(制約の生成、インプリメント)

ZYBO用ビットマップ・ディスプレイ・コントローラの作製4(デバック、論理合成)”の続き。

今回は、配置制約、タイミング制約を生成して、インプリメントを行う。

・配置制約を生成するためにFlow Navigator から Synthesized Design をクリックした。
ZYBO_Bitmap_DispC_93_140730.png

・Layout メニューから I/O Planning を選択した。
ZYBO_Bitmap_DispC_94_140731.png

・Package タブが開いた。

・下の I/O Ports で I/OポートのSite と I/O Standard を設定した。
ZYBO_Bitmap_DispC_95_140731.png

・設定した配置制約をセーブした。その制約を下の図に示す。
ZYBO_Bitmap_DispC_96_140731.png

・Flow Navigator から Implementation の下の Run Implementation をクリックして、インプリメントを行った。

・タイミングエラーが出ている。
ZYBO_Bitmap_DispC_97_140801.png

・Implementation Design を開いて、Report Timing Summary をクリックした。
ZYBO_Bitmap_DispC_98_140801.png

・Report Timing Summary ダイアログが開いた。そのままOKボタンをクリックした。
ZYBO_Bitmap_DispC_99_140801.png

・Timing Summary ウインドウが開いた。 n_0_BUFR_pixel_clk to clk_fpga_0 の Setup がエラーになっていた。

・Flow Navigator から Edit Timing Constraints をクリックした。
ZYBO_Bitmap_DispC_100_140801.png

・Timing Constraints ウインドウが開く。Exceptions を展開して、Set False Path をクリックした。

・Set False Path ウインドウで、Double click to create Set False constraint をダブル・クリックする。
ZYBO_Bitmap_DispC_101_140801.png

・Set False Path ダイアログが表示された。

・Start Points の ・・・ボタンをクリックする。
ZYBO_Bitmap_DispC_102_140801.png

・Choose Start Point ダイアログが開く。Find name of type で clocks を選択し、Findボタンをクリックした。

・クロックが5つ見つかった。 n_0_BUFR_pixel_clk を選択した。
ZYBO_Bitmap_DispC_103_140801.png

・右向き矢印ボタンをクリックすると、Selected name ペインに、 n_0_BUFR_pixel_clk が入った。OKボタンをクリックした。
ZYBO_Bitmap_DispC_104_140801.png

・Set False Path ダイアログの Start Points に n_0_BUFR_pixel_clk が入った。次に、End Points の・・・ボタンをクリックして終点を設定する。
ZYBO_Bitmap_DispC_105_140801.png

・同様に、Selected name ペインに、 clk_fpga_0 を入れた。
ZYBO_Bitmap_DispC_106_140801.png

これで、Start Points に n_0_BUFR_pixel_clk が入って、End Point に clk_fpga_0 が入ったので、OKボタンをクリックして、ダイアログを閉じる。
ZYBO_Bitmap_DispC_107_140801.png

・Set False Path ウインドウに n_0_BUFR_pixel_clk から clk_fpga_0 までのパスが入った。
ZYBO_Bitmap_DispC_108_140801.png

・同様に、Set False Path ウインドウに clk_fpga_0 から n_0_BUFR_pixel_clk までのパスを入れた。
ZYBO_Bitmap_DispC_109_140801.png

・これで、False Path が設定できた。制約をセーブする。

・制約ファイルに追加されたフォールス・パスを貼っておく。
ZYBO_Bitmap_DispC_110_140801.png

・インプリメントを行ったところ、今度は成功した。
ZYBO_Bitmap_DispC_111_140801.png

・ビットストリームも生成できた。
ZYBO_Bitmap_DispC_112_140801.png

制約ファイル(V_ZYBO_BMDC.xdc) を貼っておく。(2014/11/02:変更 hdmi_out_en を追加)

set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[0]}]
set_property PACKAGE_PIN J18 [get_ports {vga_blue[3]}]
set_property PACKAGE_PIN K19 [get_ports {vga_blue[2]}]
set_property PACKAGE_PIN M20 [get_ports {vga_blue[1]}]
set_property PACKAGE_PIN P20 [get_ports {vga_blue[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[4]}]
set_property PACKAGE_PIN G19 [get_ports {vga_blue[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[0]}]
set_property PACKAGE_PIN F20 [get_ports {vga_green[5]}]
set_property PACKAGE_PIN H20 [get_ports {vga_green[4]}]
set_property PACKAGE_PIN J19 [get_ports {vga_green[3]}]
set_property PACKAGE_PIN L19 [get_ports {vga_green[2]}]
set_property PACKAGE_PIN N20 [get_ports {vga_green[1]}]
set_property PACKAGE_PIN H18 [get_ports {vga_green[0]}]
set_property PACKAGE_PIN F19 [get_ports {vga_red[4]}]
set_property PACKAGE_PIN G20 [get_ports {vga_red[3]}]
set_property PACKAGE_PIN J20 [get_ports {vga_red[2]}]
set_property PACKAGE_PIN L20 [get_ports {vga_red[1]}]
set_property PACKAGE_PIN M19 [get_ports {vga_red[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports vga_hsync]
set_property IOSTANDARD LVCMOS33 [get_ports vga_vsync]
set_property PACKAGE_PIN P19 [get_ports vga_hsync]
set_property PACKAGE_PIN R19 [get_ports vga_vsync]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_0_B_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_1_R_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_2_G_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN D19 [get_ports TMDS_tx_0_B_p]
set_property PACKAGE_PIN C20 [get_ports TMDS_tx_1_R_p]
set_property PACKAGE_PIN B19 [get_ports TMDS_tx_2_G_p]
set_property PACKAGE_PIN H16 [get_ports TMDS_tx_clk_p]
set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_out_en[0]}]
set_property PACKAGE_PIN F17 [get_ports {hdmi_out_en[0]}]

set_false_path -from [get_clocks n_0_BUFR_pixel_clk] -to [get_clocks clk_fpga_0]
set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks n_0_BUFR_pixel_clk]


ZYBO用ビットマップ・ディスプレイ・コントローラの作製6(実機動作)”に続く。
  1. 2014年08月01日 05:22 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0