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

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

FPGAの部屋

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

AXI VDMAを使ったカメラ画像回路の作製3(カメラ・インターフェースAXI_Stream IPを更新)

AXI VDMAを使ったカメラ画像回路の作製2(Xilinxアンサーを検索)”の続き。

AR# 53281の推奨事項を知ったので、カメラ・インターフェースAXI_Stream IP (mt9d111_inf_axi_stream) に、AXI Stream の TUSER と TKEEPの処理を追加した。

最初にISEのプロジェクトを示す。
Cam_VDMA_ISE_5_140331.png

XPSプロジェクトを示す。
Cam_VDMA_ISE_6_140331.png

XPSプロジェクトのPortsタブを下に示す。
Cam_VDMA_ISE_7_140331.png

s_axis_s2mm_tkeep と s_axis_s2mm_tuser の信号を追加した。

s_axis_s2mm_tkeep と s_axis_s2mm_tuser の信号のVHDLコードを下に示す。

m_axis_tuser(0) <= s2mm_fsync_node;


tuser は、Start Of Frame を示す。

m_axis_tkeep <= (others => '1') when pfifo_empty='0' else (others => '0');


tkeep は、tdataがストリームに有効なデータとして扱われるかどうかを示す。

上記の様に修正して、インプリメントして、SDKでFPGA をコンフィグして、デバックしようとしたら、デバック画面で main()関数の先頭行に行かずに止まってしまう。
Cam_VDMA_ISE_8_140331.png

FPGAをコンフィグせずに、FPGAがコンフィグされていないというワーニングを無視して、デバックを行うと、ちゃんとデバック画面で main()関数の先頭行に行った。
Cam_VDMA_ISE_9_140331.png

やはり、PL部の回路に何らかの不具合があるかもしれない?もう一度、プロジェクトを作りなおしてみることにする。

(2014/04/02:追記)
やはり、プロジェクトを作り直しても、同様でした。ChipScopeを入れなければ、SDKのデバックに問題が無いので、ChipScopeとSDKのJTAGの共有あたりの問題だと思います。
  1. 2014年03月31日 04:21 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

銀の匙 Silver Spoon(映画)を見てきました

今日は下の娘と銀の匙 Silver Spoon(映画)を見てきました。

銀の匙は、週刊少年サンデーで連載されている漫画です。漫画を読んでいるので、楽しみにしていました。
なかなか良かったです。ばんえい競馬のシーンは少しやり過ぎでしたが、全体的には楽しめました。
  1. 2014年03月30日 20:34 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

介護用住宅改修

親父が背骨の圧迫骨折で現在入院していて、もう約三ヶ月になります。そろそろ退院ということですが、もう80歳を超えているので、思うように歩けないということで住宅改修をすることになりました。
家の中の玄関の手すりやトイレの手すりは専門業者に付けてもらいましたが、通り道の段差のステップや、外のコンクリート製の階段の手すりは自分でつけることにしました。
下の写真が通り道の段差用のステップです。段差が高いので、2段のステップになりました。
mokko_2_140330.jpg

2x4材を3本をベースにして、それに90度クロスするように、下の段は8枚、上の段は4枚の 1x4材をコーススレッドで打ってあります。

外のコンクリート製の階段の手すりです。ブロックで作ってあるので、ブロックを挟み込んで 2x4材を立てられる金具がホームジョイ本田に売っていたので、買ってきて使いました。
mokko_1_140330.jpg

どうですか?斬新な形でしょう?斜めよりも手すりも階段状になっていたほうが、使いやすいし作りやすいと思います。
右手は杖で、左手で掴みます。掴む方の手すりは登りよりも下りのほうが50mm高くしてあります。この方が使いやすいです。
  1. 2014年03月30日 04:22 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAを使ったカメラ画像回路の作製2(Xilinxアンサーを検索)

AXI VDMAを使ったカメラ画像回路の作製1(プロジェクトの作製)”の続き。

AXI VDMAを双方向でまともに動かしたことが1度もないので、動かしてみたいということで、Xilinx社のアンサーを検索してみた。
そうしたところ、”AR# 56623 LogiCORE IP AXI Video Direct Memory Access v6.0 - IPI デザインで S2MM_TREADY がディアサートされたままになる”が見つかった。
このアンサーは、VivadoのIP Integrator 用だが、 s_axis_s2mm_tkeep のデフォルト接続は現在 0 で、すべてのバイトをヌルバイトとして処理して、データをメモリに転送できなくなって、内部バッファーがFULLになると、treadyがディアサートされるというアンサーだ。
今回のAXI VDMAはVer.5.04で、Project Navigatorを使用しているが、一応、tkeep信号を 1 に駆動しておこうと思う。

次に、”AR# 53281 LogiCORE IP AXI Video Direct Memory Access - FSYNC 処理の推奨事項”が見つかった。
それによると、fsync を使ったインターフェースから、SOF(Start Of Frame) on TUSER を使ったインターフェースに移行しているそうだ。積極的に tuser を使ったほうが良いそうだ。

AR# 53281の推奨事項を以下に引用する。

・入力で Video Timing Controller コアを検出モードで使用する。

・Video In to AXI4 Stream コアを使用して入力ビデオ タイミング情報から SOF 信号を生成する。

・AXI VDMA などの該当するコアの SOF on TUSER モードをイネーブルにし、fsync 信号ではなくこれを使用してフレーム同期を行う。コアによって、SOF が自動的にシステム全体に伝搬されます。

・デザインに AXI VDMA が含まれている場合 :
   ・S2MM 側を外部フレーム同期モードに設定し、SOF on TUSER をイネーブルにする。 S2MM_DMACR レジスタの FsyncSrcSelect ビットを 2'b10 に設定してフレーム同期ソースとして TUSER を選択してください。

   ・MM2S 側をフリー ランニング モードに設定する。

   ・fsync 信号を接続する (XPS では接続しなくてもよい)。

・出力で Video Timing Controller コアを生成モードで使用し、ビデオ タイミング情報を再生成する。

・AXI4 Stream to Video Out コアを使用して出力ビデオ データを同期する。


そうか、MM2S側はフリー・ランさせて、VTCでタイミングを再生成させるのか?その場合、AXI VDMAは、fsync を出したら途切れなくデータを供給してくれないと、ビデオ信号が破綻してしまいそうだ。今の自作 custom_vtc IP には、生成モードは無いので、作る必要がある。

詳細は、『AXI4-Stream Video IP およびシステム デザイン ガイド』 (UG934)を参照して欲しいそうだ。

自分の AXI_VDMA 回路を見なおしてみよう。
  1. 2014年03月29日 05:20 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋まとめサイトの更新(2014年3月28日)

FPGAの部屋のまとめサイトを更新しました。

ZYBOAXI4バスの演習資料を追加して、その他の記事のまとめをアップロードしました。
  1. 2014年03月28日 05:03 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

ZynqのAXI_ACPポートとAXI_HPポートの性能の違い2(AXI_HPポート)

ZynqのAXI_ACPポートとAXI_HPポートの性能の違い1(AXI_ACPポート)”の続き。

前回は、AXI_ACPポートを使って、ビットマップ・ディスプレイ・コントローラIPを使用して、AXI_ACPポートからピクセル・データをReadするのをChipScope Proで観察するという方法で性能を見た。今回は、AXI_HP0 ポートを使用して同様に性能を見ようと思う。

最初にAXI_HPポートの Project Navigator のプロジェクトを示す。
Zynq_ACP_HP_10_140325.png

XPSプロジェクトを下に示す。Processing_System_7_0 の S_AXI_HP0 ポートに bitmap_disp_cntrler_axi_master_0 の M_AXIポートが接続されているのがわかる。
Zynq_ACP_HP_11_140325.png

Project Navigator で、論理合成、インプリメント、ビットストリームの生成を行い成功した。
ハードウェア構成をエクスポートして、SDKを立ちあげた。
Zynq_ACP_HP_12_140325.png

FPGAにビットストリームをダウンロードして、ソフトウェアを起動したところ、キャラクタが表示されたが、AXI_ACPポートと違って、AXI_HPポートは、ARMプロセッサでキャッシュをフラシュする命令を実行していないため、表示キャラクタがボロボロになっている。これは、フレームバッファ領域もデータ・キャッシュがONされていることで起こる。
Zynq_ACP_HP_16_140325.jpg

ChipScope Pro を立ちあげて、ARVALIDでトリガしたAXI_HP0 ポートの Read Transaction の波形を下に示す。
Zynq_ACP_HP_13_140325.png

RVALIDは、データ・チャネルの転送の間はずっと1でReadデータが供給できているのがわかる。

最初のトランザクションを引き伸ばした。
Zynq_ACP_HP_14_140325.png

トランザクション全体の経過時間は 85クロックだった。85クロック x 10nsec(100MHz) = 850 nsec となった。

次に、ARVALIDが 1 になった後で、最初に RVALID が 1 になった時間を計測してみた。これは、アドレスが入ってからデータが出てくるまでのレイテンシに相当する。これは、21クロックだった。つまり、210 nsec となった。
Zynq_ACP_HP_15_140325.png

トランザクション全体の経過時間から、データが出るまでのレイテンシを引くとデータ・トランザクション時間になる。これは、640 nsec となった。
次に、データ転送帯域の使用率を計算する。64バーストのデータをフルスピードで転送すると、640 nsec のはずなので、640 nsec / 640 nsec x 100 = 100 % になる。つまりデータ転送帯域幅の 100 % のスループットとなった。

AXI_HP0 ポートのデータ転送帯域使用率は、100 % という結果になった。ChipScope Pro で見えたトランザクションはすべて、RVALIDがデータ・チャネルの転送中はずっと 1、つまり、データ転送帯域使用率は、100 % だった。

ここで、AXI_ACPポートとAXI_HP0ポートのデータをまとめる。

・データ転送帯域使用率
AXI_ACPポート:35 % ~ 71 %      AXI_HP0ポート:100 %

・データが出てくるまでのレイテンシ
AXI_ACPポート:10クロック(100 nsec)  AXI_HP0ポート:21クロック(210 nsec)


上記の様な結果になった。

AXI_ACPポートはキャッシュのコヒーレンシを維持した状態で転送が出来るが、連続バーストするとキャッシュに入っているかいないかを検査する必要がある。キャッシュにない場合には、SDRAMから読んでくる必要があるので、遅くなる可能性がある。これは、画像のピクセル・データをReadするポートとしては向いていない。AXI_HPポートを使うべきである。
一方、AXI_ACPポートは、データが出てくるまでのレイテンシは短いので、メールボックスなど、プロセッサと専用ハードウェアの情報のやりとりに向いていると思う。

(追記)
ちょっと誤解を招く表現だったかもしれないので、追記する。

今回は、画像を表示するため、ピクセル・データをDMAするという状況でのテストだった。つまり、キャラクタを書くスピードは人間の認識できるスピードだった。AXI_HPポートを使用する場合は、ARMプロセッサが書いてからキャッシュをフラシュするするのが正常な手順だ。そうしないと、上の写真に示したように、キャッシュが書き戻された領域と、書き戻されていない領域に別れて、正常に表示されない。キャッシュのフラッシュはソフトウェアで明示的に行う。現在はそのキャッシュのフラッシュのコストを見積もっていない。前述したように、このピクセル・データのDMA用途では、ReadのDMAが殆どを占めて、Writeの方は殆ど専有時間は無い。つまり、キャシュのフラッシュ時間は人間が目に見える時間に行えば良いということになる。キャッシュのフラッシュのコストが問題にならない用途だと言える。(ピクセル・データがL2キャッシュにも入らないので、AXI_HPポートを使うのが適当だとは思う)
次に、MPI通信などのコンピュータ同士の通信用途を考えてみよう。今度は、ARMプロセッサから書かれたデータは1度で必ずRDMAされなければならない。その場合には、FPGA側にDMAコントローラがある場合は、ARMプロセッサのキャッシュをフラッシュしたら、フラッシュ命令の完了を待って、FPGA側のDMAコントローラを起動する必要がある。よって、キャッシュをフラッシュするコストは隠蔽されずに見えてくることになる。その時に、キャッシュをフラッシュする必要があるAXI_HPポートのRDMAが有利か、それともキャッシュをフラッシュしなくても済むAXI_ACPポートの方が有利かは検証していないので、まだわからない?ということになる。(DMA領域をDキャッシュONにしているという条件付き。キャッシュの容量も関係してきます)

つまり、まだ限定された条件での比較ですよ、ということを言いたい訳です。。。
  1. 2014年03月26日 04:14 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

ZynqのAXI_ACPポートとAXI_HPポートの性能の違い1(AXI_ACPポート)

ZynqのAXI_ACPポートとAXI_HPポートの性能の違いを確かめてみることにした。
ここでは、ビットマップ・ディスプレイ・コントローラIPを使用して、AXI_ACPポートとAXI_HPポートでピクセル・データをそれぞれReadして、そのAXIバスの様子をChipScopeで観察するという方法で比較する。
なお、ビットマップ・ディスプレイ・コントローラIPの解像度は、横640ピクセル x 480ラインのVGA解像度とし、ピクセル・データをReadするバースト長は通常は64バーストとする。AXI_ACPポート、AXI_HPポートのビット幅はどちらも64ビットとする。

最初にAXI_ACPポートの Project Navigator のプロジェクトを示す。
Zynq_ACP_HP_1_140325.png

XPSプロジェクトを下に示す。Processing_System_7_0 の S_AXI_ACPポートに bitmap_disp_cntrler_axi_master_0 の M_AXIポートが接続されているのがわかる。
Zynq_ACP_HP_2_140325.png

Project Navigator で、論理合成、インプリメント、ビットストリームの生成を行い成功した。
ハードウェア構成をエクスポートして、SDKを立ちあげた。
Zynq_ACP_HP_3_140325.png

FPGAにビットストリームをダウンロードして、ソフトウェアを起動したところ、キャラクタが表示された。
Zynq_ACP_HP_5_140325.jpg

ChipScope Pro を立ちあげて、ARVALIDでトリガしたAXI_ACPポートの Read Transaction の波形を下に示す。
Zynq_ACP_HP_4_140325.png

RVALIDが細かく1、0を繰り返している。トランザクション時間が割と長いのを選んでいる。もっと短い時間でデータ転送できているトランザクションもあるので、後で紹介する。

さて、最初のトランザクションを引き伸ばした。
Zynq_ACP_HP_6_140325.png

トランザクション全体の経過時間は 193クロックだった。193クロック x 10nsec(100MHz) = 1.93 usec となった。

次に、ARVALIDが 1 になった後で、最初に RVALID が 1 になった時間を計測してみた。これは、アドレスが入ってからデータが出てくるまでのレイテンシに相当する。これは、10クロックだった。つまり、100nsec となる。
Zynq_ACP_HP_7_140325.png

トランザクション全体の経過時間から、データが出るまでのレイテンシを引くとデータ・トランザクション時間になる。これは、1.83 usec となった。
次に、データ転送帯域の使用率を計算する。64バーストのデータをフルスピードで転送すると、0.64 usec のはずなので、0.64 usec / 1.83 usec x 100 ≒ 35 % になる。つまりデータ転送帯域幅の 35 % のスループットとなった。

次に、ChipScope Pro で見えた中で最もトランザクション時間が短い例を示す。
Zynq_ACP_HP_8_140325.png

トランザクション全体の経過時間は 100クロックだった。100クロックなので、1.00 usec だった。

ARVALIDが 1 になった後で、最初に RVALID が 1 になった時間は、先程と同じく 10クロックだった。つまり、100 nsec ということになる。
Zynq_ACP_HP_9_140325.png

データ・トランザクション時間は、0.90 usec だ。
データ転送帯域の使用率を計算すると、0.64 usec / 0.90 usec x 100 ≒ 71 % になる。

AXI_ACPポートのデータ転送帯域使用率は、35% ~ 71% という結果になった。結構、データ転送帯域を使えていないという印象だ。

次は、全く同じ実装で、AXI_HPポートを観察してみようと思う。

ZynqのAXI_ACPポートとAXI_HPポートの性能の違い2(AXI_HPポート)”に続く。
  1. 2014年03月25日 04:53 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

2人の娘と伊豆に行ってきました

昨日、2人の娘と伊豆に行ってきました。上の娘が思い立って行きたくなったようです。

7時ころ家を出発して熱海に10時過ぎに着きました。特急などは使わずに、東海道線普通の旅です。途中では、富士山が見えました。
izu_1_140323.jpg

熱海です。足湯をしている人々が見えますね。上の娘が入ってみましたが、とっても熱いそうです。足が真っ赤になってました。
izu_2_140323.jpg

小腹がすいてきたので、10時30分位の時間でしたが、3色丼を食べました。釜揚げしらすと生しらす、生桜えびです。生桜えびは初めて食べました。美味しかったですが、私は干したの方が風味が出ていて好きです。生しらすも美味しかったです。
izu_3_140323.jpg

駅に戻って、伊東線、伊豆急行線に乗って、富戸駅で降りました。結構、寂しい駅でした。ここから、伊豆ガラスと工芸美術館に向かいました。

向かっている途中は、とっても急な上りでした。本当に細い道にも家が結構あるのにびっくりしました。そして、海が見えてとっても素敵な眺めでしたよ。伊豆は眺めが良いですね。
izu_6_140323.jpg

ガラスと工芸美術館は良かったです。ガレやティファニー、ドーム、ラリックなどのガラス工芸が並んでいました。何でも鑑定団で見ているガラス工芸を実際に見ることが出来てラッキーでした。850円の入場料はやすかったです。もっとも割引券を提示したので700円でしたが。。。
とても素敵なガラス工芸品がいっぱいでした。特に、ガラスに彫って下から光を当てた作品は私が作ってきたアクリル作品と似ています。とっても芸術的でした。このように芸術的な絵が書ければ良いのですが。。。作りたいのですが、無理ですね。。。
izu_5_140323.jpg

izu_4_140323.jpg

少し歩いて、ワイルドスミス美術館に行ってきました。ワイルドスミスという人の絵本の原画などがありましたが、これで1000円は高いです。ガラス工芸館とは大違いですが、ワイルドスミスの絵本が好きな人には高くないのかもしれません。
izu_7_140323.jpg

とにかくいろんな美術館や博物館が多いですね。伊豆。ぼられるのも多そうです。

ここでも眺めが最高です。伊豆はこれが良いですね。
izu_8_140323.jpg

バスで伊東駅に戻って、伊東 湯川第二浴場 弁天の湯に行ってきました。銭湯みたいでしたよ。
izu_9_140323.jpg

それからは、熱海に戻って、おみやげを見ました。家のおみやげは、タコの一夜干しとわさび漬けでした。
駅前のお店でスパゲッティを食べて、18時59分の東海道線普通に乗って帰ってきました。家には22時30分ころ到着。伊東に行っても宿泊しない弾丸ツアーでしたが、景色が最高で良かったです。
  1. 2014年03月23日 06:39 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

VGAポート専用のZYBO用キャラクタ・ディスプレイ・コントローラのプロジェクトの公開

今まで作ってきた、VGAポート専用のZYBO用キャラクタ・ディスプレイ・コントローラのプロジェクトをGitHubで公開しました。

関連するブログ記事は以下の通りです。

ZYBO用キャラクタ・ディスプレイ・コントローラ IPの単体テスト(VGAポート専用)
ZYBO用キャラクタ・ディスプレイ・コントローラ1(VGAポート専用)
ZYBO用キャラクタ・ディスプレイ・コントローラ2(VGAポート専用)

  1. 2014年03月22日 04:15 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用キャラクタ・ディスプレイ・コントローラ2(VGAポート専用)

ZYBO用キャラクタ・ディスプレイ・コントローラ1(VGAポート専用)”の続き。

前回は、SVGA解像度で、うまくキャラクタをディスプレイに表示することができた。今回は残りのVGA, XGA, SXGA, HD解像度でキャラクタをディスプレイに表示した。

まずは、VGA解像度からやってみよう。やり方を下に示す。

1.XPSプロジェクトで cdc_vga_axi_slave_0 をダブルクリックして立ちあげ、XPS Core Config ダイアログを表示させる。
ZYBO_CDC_AXI_slave_36_140320.png

2.XPS Core Config ダイアログで、Userタブの Video を展開して、RESOLUTION で VGAを選択する。
ZYBO_CDC_AXI_slave_27_140319.png

3.XPSプロジェクトで clk_generator_0 をダブルクリックして立ちあげ、XPS Core Config ダイアログを表示させる。
ZYBO_CDC_AXI_slave_37_140320.png

4.XPS Core Config ダイアログで、Userタブの CLKOUT0 を展開して、Required Frequency (Hz) に 25000000 と入力する(25MHz)
ZYBO_CDC_AXI_slave_28_140319.png

なお、SVGAは40MHz、XGAは65MHz、SXGAは108MHz、HDは後に述べる理由から148MHzに設定する。

5.これで設定は終了した。Project Navigator に戻って、論理合成、インプリメント、ビットストリームの生成まで行う。下の図は終了したところだ。
ZYBO_CDC_AXI_slave_38_140321.png

次は、ハードウェアのエクスポートを行ってSDKを立ち上げる。
6.Hierarchyウインドウから system_i を選択して、Processesウインドウから Export Hardware Design To SDK wit Bitstream をダブルクリックする。(下の図はもうすでにエクスポートを終えたところだ)
ZYBO_CDC_AXI_slave_39_140321.png

7.しばらくして、SDKが立ち上がり、ワークスペースを聞いてくるので、自分のワークスペースを選択する。多くは、system/SDK/SDK_Export ファルダを指定する。

8.SDKが立ち上がる。
ZYBO_CDC_AXI_slave_35_140320.png

9.上の図のように、cdc_test.c を編集して、現在、XPSプロジェクトで指定した解像度の HORIZONTAL_PIXELS と VERTICAL_LINES のコメントを外して、その他の解像度はコメントアウトする。

10.セーブすると自動的にビルドしてくれると思う。

11.ZYBOのUSBケーブルとVGAケーブルをパソコンに接続して、ZYBOの電源をONする。

12.SDKで Xilinx Tools -> Program FPGA を選択して、FPGAにビットストリームをダウンロードする。(Program ボタンをクリックする)
ZYBO_CDC_AXI_slave_40_140321.png

13.SDKで Run -> Run Configurations... を選択する。

14.ダイアログでRunボタンをクリックする。
ZYBO_CDC_AXI_slave_41_140321.png

これで、ディスプレイをD-SUB入力モードに変更すると、色とりどりのキャラクタが見えるはずだ。
ZYBO_CDC_AXI_slave_31_140319.jpg

下に同様に設定した XGA, SXGA の画像を示す。
最初にXGAの画像だ。
ZYBO_CDC_AXI_slave_42_140321.jpg

SXGAの画像だ。
ZYBO_CDC_AXI_slave_43_140321.jpg

HDの画像を表示するときに、正常な動作周波数の148.5MHzではエラーが出てしまった。
ZYBO_CDC_AXI_slave_32_140320.png

ZYBO_CDC_AXI_slave_33_140320.png

100MHzの入力周波数で、148.5MHzは出力できないようだ。そこで、ピクセルの周波数を148MHzとし、フロントポーチやバックポーチを調整して60Hzのフレームレートとすることにした。
ZYBO_CDC_AXI_slave_34_140320.png

これで問題なく、HD解像度で表示された。
ZYBO_CDC_AXI_slave_44_140321.jpg
  1. 2014年03月21日 05:36 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用キャラクタ・ディスプレイ・コントローラ1(VGAポート専用)

ZYBO用キャラクタ・ディスプレイ・コントローラ IPの単体テスト(VGAポート専用)”の続き。

前回、VGAポート専用のZYBO用キャラクタ・ディスプレイ・コントローラ IPの単体テストが終了した。
今回は、ISE14.7でプロジェクトを作製し、その中にXPSプロジェクトを作製する。更に、VGAポート専用のZYBO用キャラクタ・ディスプレイ・コントローラ IPをAdd IPして、キャラクタ・ディスプレイ・コントローラを作製する。

まずはISE14.7の Project Navigator プロジェクトから下に示す。
ZYBO_CDC_AXI_slave_20_140319.png

次に、XPSプロジェクトを下に示す。Zynqタブから。
ZYBO_CDC_AXI_slave_21_140319.png

AXI_GP0ポートを使用している。

Bus Interfaces タブの画面を下に示す。
ZYBO_CDC_AXI_slave_22_140319.png

VGAポート専用のZYBO用キャラクタ・ディスプレイ・コントローラ IPの cdc_vga_axi_slave_0 、クロック生成用の clock_generator_0、PSのリセットをアクティブ・ローからアクティブ・ハイに変えるための clkgen_reset_logic、clock_generator_0 の LOCKED をアクティブ・ハイの RESET信号に変えるための cdc_reset_logic が入っている。
clkgen_reset_logic と cdc_reset_logic はただの NOTだ。

Portsタブの画面を下に示す。
ZYBO_CDC_AXI_slave_23_140319.png

外部ポートに vga_blue, vga_green, vga_hsync, vga_red, vga_vsync が出ているのが見えると思う。

最後に、Addresses タブの内容を示す。
ZYBO_CDC_AXI_slave_24_140319.png

VGAポート専用のZYBO用キャラクタ・ディスプレイ・コントローラ IPの cdc_vga_axi_slave_0 は、0x7F000000 から 0x7F01FFFF の128kBytes に割り当てられている。(2014/03/19:変更)

次に、cdc_vga_axi_slave_0 をダブルクリックして立ちあげた時の、XPS Core Config ダイアログを示す。
ZYBO_CDC_AXI_slave_25_140319.png

SVGAに設定されている。

clock_generator_0 をダブルクリックして立ちあげた時の、XPS Core Config ダイアログを示す。
ZYBO_CDC_AXI_slave_26_140319.png

CLKOUT0が、40MHzに設定されているのがわかると思う。

これで、Project Navigator で、論理合成、インプリメント、ビットストリームの生成を行い、終了した。最初の画面は全部終了した状態だ。ハードウェアをエクスポートして、SDKを立ちあげた。

SDKで、cdc_testプロジェクトを作製して、ビットストリームをZYBOにダウンロードし、Run Configuration を作製して、ソフトウェアをRunした。

VGAポートに接続されたディスプレイにキャラクタが表示された。SVGA画面だった。
ZYBO_CDC_AXI_slave_30_140319.jpg
  1. 2014年03月19日 05:24 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用キャラクタ・ディスプレイ・コントローラ IPの単体テスト(VGAポート専用)

ZYBO用にVGAポート出力のみのキャラクタ・ディスプレイ・コントローラ IPを作っている。これは、出来たらGithubで公開しようと思っている。
以前のZYBOのキャラクタ・ディスプレイ・コントローラ IPは、”AXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(完成)”で完成したが、SVGA解像度のみで、VGAポートとHDMIポートに出力することができた。但し、HDMIは出力周波数が高いために、XGA解像度以上だとBUFGが対応せずに動作が不安定だった。そこで、HDMIポートを削除して、XPSプロジェクトのAdd IPダイアログで、VGA, SVGA, XGA, SXGA, HD解像度を切り替えられるように変更した。そこで、使用したのが、VHDLでは、constantを他のconstant値から変更できる方法で、Verilogでは、parameterを他のparameterから変更できる方法だ。下にそのブログ記事を示す。

ある constant の値で、他の constant の値を切り替える1(VHDL編)
ある constant の値で、他の constant の値を切り替える2(VHDL編)
ある constant の値で、他の constant の値を切り替える3(VHDL編2、XPSプロジェクト)
ある constant の値で、他の constant の値を切り替える4(VHDL編3)
ある constant の値で、他の constant の値を切り替える5(VHDL編4、XPSプロジェクト、完成)


これらを応用して、VHDLではpackage、Verilogではインクルード・ファイルを作製した。そして、それに合わせて、HDLも変更した。

ISE14.7でプロジェクトを作製して、ISimでシミュレーションを行った。
テストベンチで解像度をHDにした時のキャラクタ・ディスプレイ・コントローラIPのフレームバッファの容量と設定値を下に示す。
ZYBO_CDC_AXI_slave_18_140317.png

RESOLUTION = 4 で HD解像度であることがわかる。
水平のピクセル数は1920、垂直のライン数は1080だった。FB_MEM_SIZEは32kByteだった。1920/8 x 1080/8 = 32,400word なので、それを上回る2のn乗になっている。

次に、テストベンチで解像度をVGAに変更した時のフレームバッファの容量と設定値を下に示す。
ZYBO_CDC_AXI_slave_19_140317.png

RESOLUTION = 0 で VGA解像度であることがわかる。
水平のピクセル数は640、垂直のライン数は480だった。FB_MEM_SIZEは8kByteだった。640/8 x 480/8 = 4,800word なので、それを上回る2のn乗になっている。

まずは、VHDLの video_timing_pkg.vhd を下に示す。

package video_timing_pkg is
    subtype RESLUTION_TYPE is integer range 0 to 4;
    type VIDEO_RECORD is record
        H_ACTIVE_VIDEO  : integer range 640 to 1920;
        H_FRONT_PORCH   : integer;
        H_SYNC_PULSE    : integer;
        H_BACK_PORCH    : integer;
        V_ACTIVE_VIDEO  : integer range 480 to 1080;
        V_FRONT_PORCH   : integer;
        V_SYNC_PULSE    : integer;
        V_BACK_PORCH    : integer;
    end record VIDEO_RECORD;
    type VIDEO_RECORD_A is array (RESLUTION_TYPE) of VIDEO_RECORD;
    constant CONST_VIDEO_R : VIDEO_RECORD_A := (
        0 => (  H_ACTIVE_VIDEO  =>  640,
                H_FRONT_PORCH   =>  16,
                H_SYNC_PULSE    =>  96,
                H_BACK_PORCH    =>  48,
                V_ACTIVE_VIDEO  =>  480,
                V_FRONT_PORCH   =>  11,
                V_SYNC_PULSE    =>  2,
                V_BACK_PORCH    =>  31
            ), -- VGA, 25MHz
        1 => (  H_ACTIVE_VIDEO  =>  800,
                H_FRONT_PORCH   =>  40,
                H_SYNC_PULSE    =>  128,
                H_BACK_PORCH    =>  88,
                V_ACTIVE_VIDEO  =>  600,
                V_FRONT_PORCH   =>  1,
                V_SYNC_PULSE    =>  4,
                V_BACK_PORCH    =>  23
            ), -- SVGA, 40MHz
        2 => (  H_ACTIVE_VIDEO  =>  1024,
                H_FRONT_PORCH   =>  24,
                H_SYNC_PULSE    =>  136,
                H_BACK_PORCH    =>  160,
                V_ACTIVE_VIDEO  =>  768,
                V_FRONT_PORCH   =>  2,
                V_SYNC_PULSE    =>  6,
                V_BACK_PORCH    =>  29
            ), -- XGA, 65MHz
        3 => (  H_ACTIVE_VIDEO  =>  1280,
                H_FRONT_PORCH   =>  48,
                H_SYNC_PULSE    =>  112,
                H_BACK_PORCH    =>  248,
                V_ACTIVE_VIDEO  =>  1024,
                V_FRONT_PORCH   =>  1,
                V_SYNC_PULSE    =>  3,
                V_BACK_PORCH    =>  38
            ), -- SXGA, 108MHz
        4 => (  H_ACTIVE_VIDEO  =>  1920,
                H_FRONT_PORCH   =>  88,
                H_SYNC_PULSE    =>  44,
                H_BACK_PORCH    =>  148,
                V_ACTIVE_VIDEO  =>  1080,
                V_FRONT_PORCH   =>  4,
                V_SYNC_PULSE    =>  5,
                V_BACK_PORCH    =>  36
            )  -- HD, 148.5MHz
    );
end package video_timing_pkg;


(2014/03/21:追記)
HD解像度の動作周波数が148.5MHzを作れなかったので、148MHzに変更し、以下の様にパラメータを変更した。

        4 => (  H_ACTIVE_VIDEO  =>  1920,
                H_FRONT_PORCH   =>  85,
                H_SYNC_PULSE    =>  44,
                H_BACK_PORCH    =>  145,
                V_ACTIVE_VIDEO  =>  1080,
                V_FRONT_PORCH   =>  4,
                V_SYNC_PULSE    =>  5,
                V_BACK_PORCH    =>  35
            )  -- HD, 148MHz


Verilog HDL用の video_timing_param.vh を下に示す。

// video_timing_param.vh
//

parameter integer H_ACTIVE_VIDEO = (RESOLUTION==0) ? 640 :  // VGA
                    (RESOLUTION==1) ?    800 :              // SVGA
                    (RESOLUTION==2) ?    1024 :             // XGA
                    (RESOLUTION==3) ?    1280 :             // SXGA
                    (RESOLUTION==4) ?    1920 : 1920;       // HD

parameter integer H_FRONT_PORCH = (RESOLUTION==0) ? 16 :    // VGA
                    (RESOLUTION==1) ?    40 :               // SVGA
                    (RESOLUTION==2) ?    24 :               // XGA
                    (RESOLUTION==3) ?    48 :               // SXGA
                    (RESOLUTION==4) ?    88 : 88;           // HD

parameter integer H_SYNC_PULSE = (RESOLUTION==0) ? 96 :     // VGA
                    (RESOLUTION==1) ?    128 :              // SVGA
                    (RESOLUTION==2) ?    136 :              // XGA
                    (RESOLUTION==3) ?    112 :              // SXGA
                    (RESOLUTION==4) ?    44 : 44;           // HD

parameter integer H_BACK_PORCH = (RESOLUTION==0) ? 48 :     // VGA
                    (RESOLUTION==1) ?    88 :               // SVGA
                    (RESOLUTION==2) ?    160 :              // XGA
                    (RESOLUTION==3) ?    248 :              // SXGA
                    (RESOLUTION==4) ?    148 : 148;         // HD

parameter integer V_ACTIVE_VIDEO = (RESOLUTION==0) ? 480 :  // VGA
                    (RESOLUTION==1) ?    600 :              // SVGA
                    (RESOLUTION==2) ?    768 :              // XGA
                    (RESOLUTION==3) ?    1024 :             // SXGA
                    (RESOLUTION==4) ?    1080 : 1080;       // HD

parameter integer V_FRONT_PORCH = (RESOLUTION==0) ? 11 :    // VGA
                    (RESOLUTION==1) ?    1 :                // SVGA
                    (RESOLUTION==2) ?    2 :                // XGA
                    (RESOLUTION==3) ?    1 :                // SXGA
                    (RESOLUTION==4) ?    4 : 4;             // HD

parameter integer V_SYNC_PULSE = (RESOLUTION==0) ? 2 :      // VGA
                    (RESOLUTION==1) ?    4 :                // SVGA
                    (RESOLUTION==2) ?    6 :                // XGA
                    (RESOLUTION==3) ?    3 :                // SXGA
                    (RESOLUTION==4) ?    5 : 5;             // HD

parameter integer V_BACK_PORCH = (RESOLUTION==0) ? 31 :     // VGA
                    (RESOLUTION==1) ?    23 :               // SVGA
                    (RESOLUTION==2) ?    29 :               // XGA
                    (RESOLUTION==3) ?    38 :               // SXGA
                    (RESOLUTION==4) ?    36 : 36;           // HD

    parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;
    parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    parameter H_DISPLAY_SIZE = H_ACTIVE_VIDEO/8; // 横?桁
    parameter V_DISPLAY_SIZE = V_ACTIVE_VIDEO/8; // 縦?行
    parameter ALL_CHAR_SIZE = H_DISPLAY_SIZE*V_DISPLAY_SIZE;

    parameter RED_DOT_POS = 15; // 15〜13ビット目がRED
    parameter GREEN_DOT_POS = 12; // 12〜10ビット目がGREEN
    parameter BLUE_DOT_POS = 9; // 9〜7ビット目がBLUE
    parameter COLOR_ATTRIB_WIDHT = 3;    // 色情報のビット幅


(2014/03/21:追記)
HD解像度の動作周波数が148.5MHzを作れなかったので、148MHzに変更し、以下の様にパラメータを変更した。

// video_timing_param.vh
//

parameter integer H_ACTIVE_VIDEO = (RESOLUTION==0) ? 640 :  // VGA    25MHz
                    (RESOLUTION==1) ?    800 :              // SVGA   40MHz
                    (RESOLUTION==2) ?    1024 :             // XGA    65MHz
                    (RESOLUTION==3) ?    1280 :             // SXGA   108MHz
                    (RESOLUTION==4) ?    1920 : 1920;       // HD     148MHz

parameter integer H_FRONT_PORCH = (RESOLUTION==0) ? 16 :    // VGA
                    (RESOLUTION==1) ?    40 :               // SVGA
                    (RESOLUTION==2) ?    24 :               // XGA
                    (RESOLUTION==3) ?    48 :               // SXGA
                    (RESOLUTION==4) ?    85 : 85;           // HD

parameter integer H_SYNC_PULSE = (RESOLUTION==0) ? 96 :     // VGA
                    (RESOLUTION==1) ?    128 :              // SVGA
                    (RESOLUTION==2) ?    136 :              // XGA
                    (RESOLUTION==3) ?    112 :              // SXGA
                    (RESOLUTION==4) ?    44 : 44;           // HD

parameter integer H_BACK_PORCH = (RESOLUTION==0) ? 48 :     // VGA
                    (RESOLUTION==1) ?    88 :               // SVGA
                    (RESOLUTION==2) ?    160 :              // XGA
                    (RESOLUTION==3) ?    248 :              // SXGA
                    (RESOLUTION==4) ?    145 : 145;         // HD

parameter integer V_ACTIVE_VIDEO = (RESOLUTION==0) ? 480 :  // VGA
                    (RESOLUTION==1) ?    600 :              // SVGA
                    (RESOLUTION==2) ?    768 :              // XGA
                    (RESOLUTION==3) ?    1024 :             // SXGA
                    (RESOLUTION==4) ?    1080 : 1080;       // HD

parameter integer V_FRONT_PORCH = (RESOLUTION==0) ? 11 :    // VGA
                    (RESOLUTION==1) ?    1 :                // SVGA
                    (RESOLUTION==2) ?    2 :                // XGA
                    (RESOLUTION==3) ?    1 :                // SXGA
                    (RESOLUTION==4) ?    4 : 4;             // HD

parameter integer V_SYNC_PULSE = (RESOLUTION==0) ? 2 :      // VGA
                    (RESOLUTION==1) ?    4 :                // SVGA
                    (RESOLUTION==2) ?    6 :                // XGA
                    (RESOLUTION==3) ?    3 :                // SXGA
                    (RESOLUTION==4) ?    5 : 5;             // HD

parameter integer V_BACK_PORCH = (RESOLUTION==0) ? 31 :     // VGA
                    (RESOLUTION==1) ?    23 :               // SVGA
                    (RESOLUTION==2) ?    29 :               // XGA
                    (RESOLUTION==3) ?    38 :               // SXGA
                    (RESOLUTION==4) ?    35 : 35;           // HD

    parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;
    parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    parameter H_DISPLAY_SIZE = H_ACTIVE_VIDEO/8; // 横?桁
    parameter V_DISPLAY_SIZE = V_ACTIVE_VIDEO/8; // 縦?行
    parameter ALL_CHAR_SIZE = H_DISPLAY_SIZE*V_DISPLAY_SIZE;

    parameter RED_DOT_POS = 15; // 15〜13ビット目がRED
    parameter GREEN_DOT_POS = 12; // 12〜10ビット目がGREEN
    parameter BLUE_DOT_POS = 9; // 9〜7ビット目がBLUE
    parameter COLOR_ATTRIB_WIDHT = 3;    // 色情報のビット幅

  1. 2014年03月17日 20:01 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

段差を解消するためのステップの作製

家の親父が骨粗鬆症で入院してまして、介護認定も降りました。病院から帰ってくるのに家の段差の解消や手すりの設置をしなければならないとのことでした。玄関などの段差の解消はステップを作製すれば良いので、私にも出来ます。
というわけでステップの作製をしています。まずは玄関のステップを作りました。
step_1_140317.jpg

板はスライドのこぎりで切っています。こうすると、直角に切れますよ。直角が出ているのが、何より大事です。
step_2_140317.jpg

家は以前、製麺所をやってまして、うどん製造用の工場があります。そこを通る必要があるので、段差が多いのです。それで、まだまだステップを作ります。今作っているのは、幅900mm x 奥行き710mm x 高さ110mm のステップです。この上にもう1段載せる予定です。
step_3_140317.jpg

使用している材料は、下の足の部分が 2x4材で、上に張っている板が 1x4材です。どちらもグランステージで購入しました。1x4材が6フィートで198円、2x4材が同じく6フィートで298円で安いですよ。
  1. 2014年03月16日 22:27 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

FPGAエクストリーム・コンピューティング 第5回で発表したスライドをアップしました

FPGAエクストリーム・コンピューティング 第5回で発表したスライドをSlideshare にアップしました。
題名は、”ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)”です。

感想やご意見などがありましたら、コメント欄でお知らせ下さい。よろしくお願いします。

関連するブログ記事、”FPGAエクストリーム・コンピューティング 第5回で発表しました
  1. 2014年03月15日 04:55 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

ある constant の値で、他の constant の値を切り替える5(VHDL編4、XPSプロジェクト、完成)

ある constant の値で、他の constant の値を切り替える4(VHDL編3)”の続き。

今回は、前回の結果を使って、XPSプロジェクトのAdd IPダイアログで解像度を選択して、その解像度のビデオのパラメータをconstant値に設定することを目指す。pure function でそれを行ったのが、”ある constant の値で、他の constant の値を切り替える3(VHDL編2、XPSプロジェクト)”である。今回は、package を使った前回のVHDLコードを使用する。

MPDファイルの RESOLUTION の項を下のように記述した。

PARAMETER RESOLUTION = 1, DT = INTEGER, RANGE = (0:4), VALUES = (0=VGA, 1=SVGA, 2=XGA, 3=SXGA, 4=HD)


このように記述することにより、ダイアログでは、VGA, SVGA... と表示されるが、値としては integer値を VHDL ファイルに渡すことが出来る。

entity を video_timing にしたので、video_timing IP をXPSプロジェクトに追加した。
const2const_11_140313.png

const2const_12_140313.png

video_timing IP のダイアログを出してみた。VGA... などの解像度を選ぶことが出来る。XGAを選択した。
const2const_13_140313.png

ISE14.7でインプリメントまで成功した。
const2const_14_140313.png

ISE14.7をシミュレーションモードにした。ISimを起動してコンパイルを行った。
const2const_15_140313.png

ISimが立ち上がり、XGAの解像度の 1024x768 を表示したので、成功だ。
const2const_16_140313.png

これで、XPSプロジェクトで解像度を選択して、その解像度のパラメータを設定することが出来たので、これからはこれを整備して使用することにする。Verilog HDLでは、ビデオ用の parameter を include することにする。

MPDファイル、PAOファイル、MUIファイルを下に貼っておく。

video_timing_v2_1_0.mpd から下に示す。

BEGIN video_timing

## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION STYLE = HDL
OPTION DESC = video_timing
OPTION LONG_DESC = video_timing test IP
OPTION HDL = VHDL
OPTION RUN_NGCBUILD = FALSE

## Bus Interfaces

## Generics for VHDL or Parameters for Verilog
PARAMETER RESOLUTION = 1, DT = INTEGER, RANGE = (0:4), VALUES = (0=VGA, 1=SVGA, 2=XGA, 3=SXGA, 4=HD)

## Ports
PORT oH_ACTIVE_VIDEO = "", DIR = O, VEC=[10:0]
PORT oV_ACTIVE_VIDEO = "", DIR = O, VEC=[10:0]
END


次に、video_timing_v2_1_0.pao を下に貼っておく。注意点としては、必ず package のVHDLファイルを最初に登録しておかないと、ISimでのシミュレーションでエラーが発生する。

lib video_timing_v1_00_a video_timing_pkg.vhd VHDL
lib video_timing_v1_00_a constant_test3.vhd VHDL


最後に、MUIファイルを貼っておく。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!--
###############################################################################
## DISCLAIMER OF LIABILITY
##
## This file contains proprietary and confidential information of
## Xilinx, Inc. ("Xilinx"), that is distributed under a license
## from Xilinx, and may be used, copied and/or disclosed only
## pursuant to the terms of a valid license agreement with Xilinx.
##
## XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
## ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
## LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
## MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
## does not warrant that functions included in the Materials will
## meet the requirements of Licensee, or that the operation of the
## Materials will be uninterrupted or error-free, or that defects
## in the Materials will be corrected. Furthermore, Xilinx does
## not warrant or make any representations regarding use, or the
## results of the use, of the Materials in terms of correctness,
## accuracy, reliability or otherwise.
##
## Xilinx products are not designed or intended to be fail-safe,
## or for use in any application requiring fail-safe performance,
## such as life-support or safety devices or systems, Class III
## medical devices, nuclear facilities, applications related to
## the deployment of airbags, or any other applications that could
## lead to death, personal injury or severe property or
## environmental damage (individually and collectively, "critical
## applications"). Customer assumes the sole risk and liability
## of any use of Xilinx products in critical applications,
## subject only to applicable laws and regulations governing
## limitations on product liability.
##
## Copyright 2009 Xilinx, Inc.
## All rights reserved.
##
## This disclaimer and copyright notice must be retained as part
## of this file at all times.
##
###############################################################################
-->

<!DOCTYPE doc SYSTEM "../../ipdialog.dtd" [
    <!-- -->
    <!ENTITY RESOLUTION '
    <widget id="RESOLUTION">
        <key>RESOLUTION</key>
        <label>RESOLUTION</label>
        <tip></tip>
    </widget>
    '>
]>

<doc>
    <view id="Video Timing">
        <display>Video Timing</display>
        <group id="Video Timing">
            <display>Video Timing</display>
            <item>&RESOLUTION;</item>
        </group>
    </view>
    
</doc>

  1. 2014年03月13日 04:41 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

ある constant の値で、他の constant の値を切り替える4(VHDL編3)

ある constant の値で、他の constant の値を切り替える3(VHDL編2、XPSプロジェクト)”の続き。

前回のやり方で、XPSプロジェクトにカスタムIPを入れるときのAdd IPのダイアログで、解像度を選ぶことが出来るのだが、pure function をビデオのパラメータ分、書くのが面倒で、長い。本文より長くなってしまうこともあるかもしれないので、package にすることを考えた。package にするならば、エレガントな”ある constant の値で、他の constant の値を切り替える1(VHDL編)”を使って、tRESOLUTION を宣言している type宣言部分をinteger としてみた。その、video_timing_pkg.vhd を下に示す。まだテスト用で、同期信号やフロントポーチ、バックポーチなどは設定していない。

package video_timing_pkg is
    subtype RESLUTION_TYPE is integer range 0 to 4;
    type VIDEO_RECORD is record
        H_ACTIVE_VIDEO : integer range 640 to 1920;
        V_ACTIVE_VIDEO: integer range 480 to 1080;
    end record VIDEO_RECORD;
    type VIDEO_RECORD_A is array (RESLUTION_TYPE) of VIDEO_RECORD;
    constant CONST_VIDEO_R : VIDEO_RECORD_A := (
        0 => (H_ACTIVE_VIDEO =>  640, V_ACTIVE_VIDEO =>  480), -- VGA
        1 => (H_ACTIVE_VIDEO =>  800, V_ACTIVE_VIDEO =>  600), -- SVGA
        2 => (H_ACTIVE_VIDEO => 1024, V_ACTIVE_VIDEO =>  768), -- XGA
        3 => (H_ACTIVE_VIDEO => 1280, V_ACTIVE_VIDEO => 1024), -- SXGA
        4 => (H_ACTIVE_VIDEO => 1920, V_ACTIVE_VIDEO => 1080)  -- HD
    );
end package video_timing_pkg;


次に、本体の constant_test3.vhd を下に示す。
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

use work.video_timing_pkg.all;

entity video_timing is
    generic (
        resolution : RESLUTION_TYPE := 1    -- SVGA
    );
    port (
        oH_ACTIVE_VIDEO : out std_logic_vector(10 downto 0);
        oV_ACTIVE_VIDEO : out std_logic_vector(10 downto 0)
    );
begin
end entity video_timing;

architecture RTL of video_timing is
    -- NOTE: Use elab-time constant via generic.
    constant cACTIVE_VIDEO : VIDEO_RECORD := CONST_VIDEO_R(resolution);
    constant H_ACTIVE_VIDEO : integer := cACTIVE_VIDEO.H_ACTIVE_VIDEO;
begin
    -- NOTE: Use run-time parameter via port.
    oH_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(cACTIVE_VIDEO.H_ACTIVE_VIDEO, 11));
    oV_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(cACTIVE_VIDEO.V_ACTIVE_VIDEO, 11));
end architecture RTL;


最後に、テストベンチの video_timing_tb.v を下に示す。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
use work.video_timing_pkg.all;

ENTITY video_timing_tb IS
END video_timing_tb;
 
ARCHITECTURE behavior OF video_timing_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT video_timing
    generic (
      resolution : RESLUTION_TYPE := 1  -- SVGA
    );
 
    PORT(
         oH_ACTIVE_VIDEO : OUT  std_logic_vector(10 downto 0);
         oV_ACTIVE_VIDEO : OUT  std_logic_vector(10 downto 0)
        );
    END COMPONENT;
    

     --Outputs
   signal oH_ACTIVE_VIDEO : std_logic_vector(10 downto 0);
   signal oV_ACTIVE_VIDEO : std_logic_vector(10 downto 0);
   -- No clocks detected in port list. Replace <clock> below with 
   -- appropriate port name 
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: video_timing generic map (
          resolution => 2   -- XGA
    ) PORT MAP (
          oH_ACTIVE_VIDEO => oH_ACTIVE_VIDEO,
          oV_ACTIVE_VIDEO => oV_ACTIVE_VIDEO
    );

   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100 ns.
      wait for 100 ns;    

      -- insert stimulus here 

      wait;
   end process;

END;


ISE14.7でZynq-7010用にインプリメントしてみたが、問題なかった。
const2const_9_140312.png

シミュレーション波形もXGA解像度になっていて、問題ない。
const2const_10_140312.png
  1. 2014年03月12日 05:30 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

FPGAエクストリーム・コンピューティング 第5回で発表しました

今日、FPGAエクストリーム・コンピューティング 第5回で発表してきました。(後日、履歴を取るために書いています)
題は、”ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)”です。長いです。後で、資料を Slideshare にアップします。

内容は、ZedBoardが来てから、Linuxにカメラ表示回路を実装したこと。ラプラシアンフィルタをソフトウェアで実装して、チューニング、ハードへのオフロードしたことを説明しました。スライドは47枚でした。

FPGAエクストリーム・コンピューティング 第5回のビデオはこちらにあります

いろいろな方のやっていることが分かって、とっても面白い勉強会です。FPGAX。イー・ツリーズの船田さんは、FPGAのHDLを生成するのに、AWKを使っているとのことでした。私も限定的な用途ですが、書くと難しい演算のHDLを書くためにRubyを使っています。

時間の関係でピザを食べないで帰ってきました。残念です。

この勉強会で、大学関係の方にもお会いして、興味が有るようならば、Zynq勉強会をやりますよとお話したところ、2人の方が興味を示して下さいました。出張して1回位はやってみたいと思っています。少なくともISEは結構できる、XPSも少し触ったことが有りますくらいのスキルが必要だと思いますが。。。(今のところ、VivadoではなくISE、XPSを使用しています)あまりスキルが無いと、聞いていると眠くなってしまって、双方が幸福ではなくなります。
但し、飛行機は金属の塊なので、飛ぶはずがありませんw。よって、飛行機で行く必要があるところには、なるべく行かないようにしようと思っています。
  1. 2014年03月10日 23:08 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

ある constant の値で、他の constant の値を切り替える3(VHDL編2、XPSプロジェクト)

ある constant の値で、他の constant の値を切り替える2(VHDL編)”の続き。

VHDLの達人 hiyuh さんのVHDLコードのおかげで、"SVGA"と入力したら、800x600 に設定することができた。今度は、XPSプロジェクトに置いてAdd IPのダイアログの中で、VGA, SVGAなどの解像度を設定したら、640x480, 800x600 に設定することを目指す。

MPDファイルのサンプルを見ると、DT = STRING として、VALUESで選択する文字列の項目を列挙すれば、Add IPのダイアログでリストボックスで選択できるようだ。

PARAMETER RESOLUTION = "SVGA", DT = STRING, VALUES = (VGA=VGA, SVGA=SVGA, XGA=XGA, SXGA=SXGA, HD=HD)


なお、”Platform Specification Format Reference Manual Embedded Development Kit (EDK) 14.1 UG642 (v14.1) April 24, 2012”の47ページに載っている例文によると、ダイアログに表示する文字列は = の後のようだ。= の前にinteger 値を書けば、その値を入力することも出来るようだ。下に引用する。

PARAMETER C_ODD_PARITY=1, RANGE=(0:1), VALUES=(0=Even, 1=Odd)


VHDLの達人 hiyuh さんは、”VHDLでstringなgenericを使うのはあまり筋が良くない”とのことなのだが、文字列使ったほうがわかりやすいし、Xilinxのサンプルも使ってあるので、文字列を使ってみようと思う。何かまずいことがあったら integer に修正しようと思う。

constant_test2 IP を作って、XPSプロジェクトにAdd IPした所の画像を下に示す。
const2const_5_140310.png

constant_test2_0 をダブルクリックして、ダイアログを表示してみたところだ。RESOLUTIONを選択することが出来る。HDを選んだ。
const2const_6_140310.png

ISE14.7でインプリメントもOKだった。
const2const_7_140310.png

ISimのシミュレーションでも、HDの解像度が選択されているのがわかる。
const2const_8_140310.png

これで、この戦略は使えることがわかったので、これを使って、キャラクタ・ディスプレイ・コントローラ IP を使いやすいように書き換えることにする。

なお、VHDLコードは、”ある constant の値で、他の constant の値を切り替える2(VHDL編)”に貼ってある constant_test2.vhd そのままだ。

下にMPDファイルを貼っておく。

BEGIN constant_test2

## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION STYLE = HDL
OPTION DESC = constant_test2
OPTION LONG_DESC = constant test IP
OPTION HDL = VHDL
OPTION RUN_NGCBUILD = FALSE

## Bus Interfaces

## Generics for VHDL or Parameters for Verilog
PARAMETER RESOLUTION = "SVGA", DT = STRING, VALUES = (VGA=VGA, SVGA=SVGA, XGA=XGA, SXGA=SXGA, HD=HD)

## Ports
PORT oH_ACTIVE_VIDEO = "", DIR = O, VEC=[10:0]
PORT oV_ACTIVE_VIDEO = "", DIR = O, VEC=[10:0]
END

  1. 2014年03月10日 04:03 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

ある constant の値で、他の constant の値を切り替える2(VHDL編)

ある constant の値で、他の constant の値を切り替える1(VHDL編)”の続き。

引き続き、VHDLの達人 hiyuh さんに教えていただいた ある constant値で、他の constant の値を切り替えるの第2段。こちらのほうがエレガントではないそうだ。私もそう思うが、ある理由でこっちを使いたいと思っている。ある constant値が string の場合だ。

constant_test2.vhd を下に示す。達人のVHDLコードを堪能して欲しい。ちなみに、私が加筆させて頂いているが、基本的な流れはそのままだ。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

entity constant_test2 is
    generic (
        RESOLUTION : string := "VGA"
    );
    port (
        oH_ACTIVE_VIDEO : out std_logic_vector(10 downto 0);
        oV_ACTIVE_VIDEO : out std_logic_vector(10 downto 0)
    );
begin
end entity constant_test2;

architecture RTL of constant_test2 is
    pure function fH_ACTIVE_VIDEO (
        iDUMMY : boolean
    ) return integer is
    begin
           if (RESOLUTION =  "VGA") then return  640;
        elsif (RESOLUTION = "SVGA") then return  800;
        elsif (RESOLUTION =  "XGA") then return 1024;
        elsif (RESOLUTION = "SXGA") then return 1280;
        elsif (RESOLUTION =   "HD") then return 1920;
        else                             return 1920;
        end if;
    end function fH_ACTIVE_VIDEO;
    constant H_ACTIVE_VIDEO : integer := fH_ACTIVE_VIDEO(true);

    pure function fV_ACTIVE_VIDEO (
        iDUMMY : boolean
    ) return integer is
    begin
           if (RESOLUTION =  "VGA") then return  480;
        elsif (RESOLUTION = "SVGA") then return  600;
        elsif (RESOLUTION =  "XGA") then return 768;
        elsif (RESOLUTION = "SXGA") then return 1024;
        elsif (RESOLUTION =   "HD") then return 1080;
        else                             return 1080;
        end if;
    end function fV_ACTIVE_VIDEO;
    constant V_ACTIVE_VIDEO : integer := fV_ACTIVE_VIDEO(true);

begin
    oH_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(H_ACTIVE_VIDEO, 11));
    oV_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(V_ACTIVE_VIDEO, 11));
end architecture RTL;


ISE14.7によるインプリメントが成功した。問題無さそう。
const2const_3_140309.png

テストベンチを作ってシミュレーションをしてみた。RESOLUTION は SVGA に設定した。
const2const_4_140309.png

下にテストベンチ constant_test2_tb.vhd を示す。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
USE ieee.numeric_std.ALL;
 
ENTITY constant_test2_tb IS
END constant_test2_tb;
 
ARCHITECTURE behavior OF constant_test2_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT constant_test2 GENERIC(
        RESOLUTION : string := "VGA"
     );
    PORT(
         oH_ACTIVE_VIDEO : OUT  std_logic_vector(10 downto 0);
         oV_ACTIVE_VIDEO : OUT  std_logic_vector(10 downto 0)
    );
    END COMPONENT;
    

     --Outputs
   signal oH_ACTIVE_VIDEO : std_logic_vector(10 downto 0);
   signal oV_ACTIVE_VIDEO : std_logic_vector(10 downto 0);
   -- No clocks detected in port list. Replace <clock> below with 
   -- appropriate port name 
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: constant_test2 GENERIC MAP(
      RESOLUTION => "SVGA"
   ) PORT MAP (
          oH_ACTIVE_VIDEO => oH_ACTIVE_VIDEO,
          oV_ACTIVE_VIDEO => oV_ACTIVE_VIDEO
   );

   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100 ns.
      wait for 100 ns;    

      -- insert stimulus here 

      wait;
   end process;

END;

  1. 2014年03月09日 05:12 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

映画『ホビット 竜に奪われた王国』を見てきました

今日、高校受験が終わった下の娘と奥さんと私で、映画『ホビット 竜に奪われた王国』を見てきました。凄い迫力ですね。見応えがありましたが、残酷なシーンがあるので、娘と奥さんはあまり好きじゃないそうです。またまた、いいところで終わったので、次が楽しみですが、映画なのにドラマのような終わり方ですね。。。
  1. 2014年03月08日 21:58 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ある constant の値で、他の constant の値を切り替える1(VHDL編)

関連するブログ。”ある parameter の値で、他の parameter の値を切り替える(Verilog編)

Verilog HDLは、前回やり方が分かったが、VHDLのやり方が分からなかった。ツィッターでつぶやいたら、VHDLの達人の hiyuh さんが教えてくれた。いつもありがとうございます~。その内のエレガント方のやり方から紹介させて頂こうと思います。

VHDLコードの説明は無いですが、コードを読んでもらえばわかると思います。constant_test.vhd を下に示します。

package ee_pkg is
    type tRESOLUTION is (
         VGA,
        SVGA,
         XGA,
        SXGA,
          HD
    );
    subtype tH_ACTIVE_VIDEO is integer range 640 to 1920;
    type tH_ACTIVE_VIDEO_R is array (tRESOLUTION) of tH_ACTIVE_VIDEO;
    constant cH_ACTIVE_VIDEO_R : tH_ACTIVE_VIDEO_R := (
         VGA =>  640,
        SVGA =>  800,
         XGA => 1024,
        SXGA => 1280,
          HD => 1920
    );
    subtype tV_ACTIVE_VIDEO is integer range 480 to 1080;
    type tV_ACTIVE_VIDEO_R is array (tRESOLUTION) of tV_ACTIVE_VIDEO;
    constant cV_ACTIVE_VIDEO_R : tV_ACTIVE_VIDEO_R := (
         VGA =>  480,
        SVGA =>  600,
         XGA => 768,
        SXGA => 1024,
          HD => 1080        
    );
end package ee_pkg;

use work.ee_pkg.all;

entity ee is
    generic (
        RESOLUTION : tRESOLUTION := XGA
    );
    port (
        oH_ACTIVE_VIDEO : out integer;
        oV_ACTIVE_VIDEO : out integer
    );
begin
end entity ee;

architecture a of ee is
    -- NOTE: Use elab-time constant via generic.
    constant cH_ACTIVE_VIDEO : integer := cH_ACTIVE_VIDEO_R(RESOLUTION);
    constant cV_ACTIVE_VIDEO : integer := cV_ACTIVE_VIDEO_R(RESOLUTION);
begin
    -- NOTE: Use run-time parameter via port.
    oH_ACTIVE_VIDEO <= cH_ACTIVE_VIDEO;
    oV_ACTIVE_VIDEO <= cV_ACTIVE_VIDEO;
end architecture a;


ISE14.7を使用して、Zynq-7010でインプリメント出来るかどうか、確かめてみたところ問題なくインプリメント出来ました。
const2const_1_140308.png

シミュレーションもしてみました。シミュレーション波形を下に示しめす。
const2const_2_140308.png

XGA解像度の1行は1024ピクセル、つまり、2進数で表すと、”10000000000”で、XGA解像度の行数は768行で、2進数で表すと”1100000000”になります。正常に設定できているようです。

テストベンチも下に示します。

package ee_pkg is
    type tRESOLUTION is (
         VGA,
        SVGA,
         XGA,
        SXGA,
          HD
    );
    subtype tH_ACTIVE_VIDEO is integer range 640 to 1920;
    type tH_ACTIVE_VIDEO_R is array (tRESOLUTION) of tH_ACTIVE_VIDEO;
    constant cH_ACTIVE_VIDEO_R : tH_ACTIVE_VIDEO_R := (
         VGA =>  640,
        SVGA =>  800,
         XGA => 1024,
        SXGA => 1280,
          HD => 1920
    );
    subtype tV_ACTIVE_VIDEO is integer range 480 to 1080;
    type tV_ACTIVE_VIDEO_R is array (tRESOLUTION) of tV_ACTIVE_VIDEO;
    constant cV_ACTIVE_VIDEO_R : tV_ACTIVE_VIDEO_R := (
         VGA =>  480,
        SVGA =>  600,
         XGA => 768,
        SXGA => 1024,
          HD => 1080        
    );
end package ee_pkg;

use work.ee_pkg.all;

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
ENTITY constant_test_tb IS
END constant_test_tb;
 
ARCHITECTURE behavior OF constant_test_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT ee
        generic (
            RESOLUTION : tRESOLUTION
        );
        port (
            oH_ACTIVE_VIDEO : out integer;
            oV_ACTIVE_VIDEO : out integer
        );
    END COMPONENT;
    

     --Outputs
   signal oH_ACTIVE_VIDEO : integer;
   signal oV_ACTIVE_VIDEO : integer;
   -- No clocks detected in port list. Replace <clock> below with 
   -- appropriate port name 
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: ee generic map(
        RESOLUTION => XGA
    ) PORT MAP (
          oH_ACTIVE_VIDEO => oH_ACTIVE_VIDEO,
          oV_ACTIVE_VIDEO => oV_ACTIVE_VIDEO
   );

   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100 ns.
      wait for 100 ns;    

      -- insert stimulus here 

      wait;
   end process;

END;


これで、VHDLでもVGAと入れれば適切な画像パラメータを設定することが出来るはずだ。

(2014/03/09:追加)
hiyuh さんが record(忘れてました。。。)を使ったVHDLコードを教えてくれたので、貼っておきます。

package ee_pkg is
    type tRESOLUTION is (
         VGA,
        SVGA,
         XGA,
        SXGA,
          HD
    );
    type tACTIVE_VIDEO is record
        H : integer range 640 to 1920;
        V : integer range 480 to 1080;
    end record tACTIVE_VIDEO;
    type tACTIVE_VIDEO_R is array (tRESOLUTION) of tACTIVE_VIDEO;
    constant cACTIVE_VIDEO_R : tACTIVE_VIDEO_R := (
         VGA => (H =>  640, V =>  480),
        SVGA => (H =>  800, V =>  600),
         XGA => (H => 1024, V =>  768),
        SXGA => (H => 1280, V => 1024),
          HD => (H => 1920, V => 1080)
    );
end package ee_pkg;

use work.ee_pkg.all;

entity ee is
    generic (
        RESOLUTION : tRESOLUTION := XGA
    );
    port (
        iRESOLUTION   : in  tRESOLUTION;
        oACTIVE_VIDEO : out tACTIVE_VIDEO
    );
begin
end entity ee;

architecture a of ee is
    -- NOTE: Use elab-time constant via generic.
    constant cACTIVE_VIDEO : tACTIVE_VIDEO := cACTIVE_VIDEO_R(RESOLUTION);
begin
    -- NOTE: Use run-time parameter via port.
    oACTIVE_VIDEO <= cACTIVE_VIDEO_R(iRESOLUTION);
end architecture a;

  1. 2014年03月08日 21:31 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP3(SVGA以外の解像度)

”ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(完成)”の続き。

前回はSVGAでHDMIポート、VGAポートとも表示に成功した。今回は、VGAとXGA、SXGA解像度で表示できるかどうかを確かめてみた。
結果として、VGA解像度では、HDMIポート、VGAポート両方共表示することが出来たが、XGA、SXGA解像度では、VGAポートは問題なく表示することが出来たが、HDMIポートは表示はできているのだが、動作が不安定だった。表示はされているが、ぱっと消える時がある。これは周期的に消える。
いろいろとできることをやってみたが、うまく行かなかった。

最初にVGA解像度の画面を示す。
ZYBO_CDC_AXI_slave_15_140308.jpg

XGA解像度の画面を示す。
ZYBO_CDC_AXI_slave_14_140308.jpg

SXGA解像度の画面を示す。
ZYBO_CDC_AXI_slave_16_140308.jpg

XGA解像度のHDMIの出力周波数は650MHz, SXGA解像度のHDMIの出力周波数は1080MHzなので、使用しているグローバル・クロックバッファの最大周波数の 625MHz (-1C) を両方共超えているので、仕方が無いかな?とは思う。
下に、”Zynq-7000 All Programmable SoC (Z-7030、 Z-7045、 Z-7100) : DC 特性および AC スイッチ特性 DS191 (v1.7) 2013 年 11 月 26 日”の57ページの表68を引用する。
ZYBO_CDC_AXI_slave_17_140308.png

(2014/04/28:追記)
OSERDESE2 をDDRモードで動作させているので、HDMIクロックはピクセルクロックの10倍でなく5倍になるはず。SXGAでは、1080MHzではなく 540MHz だった。BUFGではなく、BUFIOとBUFR(5分周)が良いようだ。”ZYBO Base System Design”参照。
  1. 2014年03月08日 07:32 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(完成)

ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP1(単体テスト)”の続き。

前回、ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IPの単体シミュレーションが終了したので、今度は、実際にIPを実装してZYBO実機で確かめてみた。

ISE14.7のプロジェクトを示す。例によって、XPSプロジェクトを作製してある。
ZYBO_CDC_AXI_slave_4_140306.png

XPSプロジェクトのZynqタブの画像を下に示す。
ZYBO_CDC_AXI_slave_5_140306.png

XPSプロジェクトのBus Interfacesタブの画像を下に示す。
ZYBO_CDC_AXI_slave_6_140306.png

XPSプロジェクトのPortsタブの画像を下に示す。
ZYBO_CDC_AXI_slave_7_140306.png

XPSプロジェクトのAddressesタブの画像を下に示す。
ZYBO_CDC_AXI_slave_8_140306.png

ハードウェアをエクスポートして、SDKを立ちあげ、とっても簡単なテスト用のソフトウェアを作製した。SDKの画像を下に示す。
ZYBO_CDC_AXI_slave_9_140306.png

なお、このZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IPのソフトウェアの仕様を下に示す。

キャラクタのデータ (chaval) のフォーマットは、15ビット目~13ビット目の3ビットがRedの明るさ、12ビット目から10ビット目の3ビットがGreenの明るさ、9ビット目から7ビット目の3ビットがBlueの明るさ、6ビット目から0ビット目の7ビットがアスキー・コードです。
charval = 0x41; にして、'A'を表示しようとしても、RGBの値が0なので表示しません。RGBの明るさも設定して下さい。


ZYBO_CDC_AXI_slave_10_140306.png

ソフトウェア (cdc_test.c) を下に示す。

/* * cdc_test.c * *  Created on: 2014/03/05 *      Author: Masaaki */

#include "xparameters.h"

int main()
{
    int *cdc_addr = (int *)XPAR_CDC_AXI_SLAVE_0_S_AXI_RNG00_BASEADDR;
    int i, charval;

    for (i=0; i<7500; i++)
        *(volatile unsigned int *)(cdc_addr++) = 0;

    cdc_addr = (int *)XPAR_CDC_AXI_SLAVE_0_S_AXI_RNG00_BASEADDR;

    for (i=0, charval=0xe041; i<7500; i++){
    //for (i=0, charval=0xffc1; i<7500; i++){
        *(volatile unsigned int *)(cdc_addr++) = charval++;
    }

    return 0;
}


SDKからソフトウェアをダウンロードし、ソフトウェアをRunした結果の写真を下に示す。
ZYBO_CDC_AXI_slave_11_140306.jpg

右の大きなディスプレイがHDMI表示で、左の小さなディスプレイがVGA表示となる。解像度は 800x600 のSVGA だ。

次に、ソフトウェアのコメントを外して、上のfor文をコメントにした結果の写真を下に示す。
ZYBO_CDC_AXI_slave_12_140306.jpg

HDMI表示部分を拡大した。カメラの性能で上の方の文字が強調されてしまっているのが、色のにじみはない。
ZYBO_CDC_AXI_slave_13_140306.jpg

これでZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラは完成だ。
残念だけど、このプロジェクトは、Digilent社のAtlys用のHDMI表示HDLコードを改造しているので、公表出来ない。VGA表示のみにすれば良いのだが、それじゃつまらないですよね?
Digilent社から公表してもよいという許可が出れば、公表したいんだけど。。。
  1. 2014年03月06日 04:52 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ある parameter の値で、他の parameter の値を切り替える(Verilog編)

画像を表示するIPをXPSプロジェクトにインスタンス化する時に、paramterにVGA、SVGA、XGA を選んで、画像の解像度を切り替えることができると、とっても便利です。そこで、あるparameter値で、その他のparameter値を切り替えることができるかどうかやってみました。(出来ました)

Verilog HDLのソースコードです。

// parameter_test.v

module parameter_test # (
    parameter RESOLUTION = "VGA"
)(
    output wire [10:0] param_out
);

parameter integer H_ACTIVE_VIDEO = (RESOLUTION=="VGA") ? 640 :
                    (RESOLUTION=="SVGA") ?    800 :
                    (RESOLUTION=="XGA") ?    1024 :
                    (RESOLUTION=="SXGA") ?    1280 : 
                    (RESOLUTION=="HD") ?    1920 : 1920;

    assign param_out = H_ACTIVE_VIDEO;
endmodule


RESOLUTIONパラメータの文字列で、H_ACTIVE_VIDEOのパラメータ値を切り替えています。
ISE14.7でプロジェクトを作ってみました。
param_test_1_140304.png

ISimでシミュレーションしてみたところ、想定していた動作になりました。
param_test_2_140304.png

parameter RESOLUTION = "XGA"

にしてみました。
param_test_3_140304.png

問題なさそうです。これを使おうと思います。
  1. 2014年03月04日 08:59 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0

ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP1(単体テスト)

ZYBOにAXI4 Slaveバス対応のキャラクタ・ディスプレイ・コントローラを付けて、HDMI端子とVGA端子から出力を出してみようという企画だ。

元にするのは、”キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする”で使用したAtlysボード用のプロジェクトだ。AtlysボードのFPGAはSpartan-6だったが、今度はZynqなので、使用しているプリミティブを変更する必要があった。これが面倒だった。BUFPLLは無くなっているし、OSERDES2プリミティブは無くなって、OSERDESE2プリミティブに変更になっていたので、Digilent社のAtlysボード用HDMI出力HDLソースをかなり書き換えた。やっと単体テストが通るようになったので、ブログに書くことにした。

最初に、AXI4 Slave Writeの波形を示す。このキャラクタ・ディスプレイ・コントローラは、Burst Write, Burst Readに対応してる。ARMプロセッサとのRead, Writeではオーバースペックだと思うが、DMAコントローラなどからのバーストアクセスにも対応している。
ZYBO_CDC_AXI_slave_1_140304.png

次に、AXI4 Slave Readの波形を示す。
ZYBO_CDC_AXI_slave_2_140304.png

最後に、VGA端子の出力、red_out, green_out, blue_out, hsync_n, vsync_nとHMDI端子の出力、TMDS_tx_clk_p, TMDS_tx_clk_n, TMDS_tx_2_G_p, TMDS_tx_2_G_n, TMDS_tx_1_R_p, TMDS_tx_1_R_n, TMDS_tx_0_B_p, TMDS_tx_0_B_n の波形を下に示す。
ZYBO_CDC_AXI_slave_3_140304.png

Digilent社のHDMI出力用のHDLコードを修正しているので、少なくともHDMI部分は GithubにPush出来ないと思う。
  1. 2014年03月04日 04:55 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

VivadoでZYBO用LEDテストプロジェクト3(SDK、実機テスト)

VivadoでZYBO用LEDテストプロジェクト2(プロジェクト作製、ビットストリーム生成まで)”の続き。

前回、Vivado 2013.4のプロジェクトを作製するところから、ビットストリームの生成まで行った。今回は、ハードウェアをエクスポートして、SDKを立ちあげ実機テストを行う。

・Vivado_ZYBO_LED_testのブロック・デザインを開いたまま、Fileメニューから Export -> Export Hardware for SDK... を選択した。
Vivado_ZYBO_LED_test_16_140226.png

・Export Hardware for SDKダイアログが開いた。Launch SDK にチェックを入れて、OKボタンをクリックする。
Vivado_ZYBO_LED_test_17_140226.png

・ハードウェアをエクスポートして、SDKが立ち上がった。led4_axi_lite_salve_0 が入っていた。
Vivado_ZYBO_LED_test_18_140227.png

・SDKのFileメニューから New -> Application Project を選択した。

・Application Project ダイアログが開いた。Project Name に led4_axi_lite_slave と入力した。Next >ボタンをクリックした。
Vivado_ZYBO_LED_test_19_140227.png

・Empty Application を選択して、Finishボタンをクリックした。

・led4_axi_lite_slave を展開して、src を展開し、\ZYBO_LED_test\system\SDK フォルダにある led_axi_lite_slave.c を src フォルダにドラッグアンドドロップする。

・led_axi_lite_slave.cを修正した。

・led_axi_lite_slave.cをセーブすると、自動でコンパイルが始まる。

・コンパイルが終了した。エラーはない。
Vivado_ZYBO_LED_test_22_140227.png

・ZYBOの電源をONした。

・SDKの Xilinx Tools メニューの Program FPGA を選択する。

・ビットストリームの場所を確認して、Program ボタンをクリックする。
Vivado_ZYBO_LED_test_23_140227.png

・ZYBOボードの緑色のDONE LEDが点灯する。電流は0.23A。
ZYBO_LED_test_32_140225.jpg

・Tera Tremなどのターミナルソフトを立ちあげる。

・シリアルポートに設定する。
ZYBO_LED_test_22_140225.png

・設定メニューから端末を選択し、ローカルエコーにチェックを入れる。
ZYBO_LED_test_23_140225.png

・設定メニューからシリアルポートを選択し、ボー・レート:115200、データ8ビット、パリティ none、ストップ1ビット、フロー制御 none に設定する。
ZYBO_LED_test_24_140225.png

・Run メニューから Run Configuration...を選択する。

・Xilinx C/C++ application (GDB) を右クリックし、右クリックメニューから New を選択する。
ZYBO_LED_test_25_140225.png

・led4_axi_lite_slave_Debug が出来る。Runボタンをクリックする。
ZYBO_LED_test_26_140225.png

・Tera Termにメニューが表示される。
ZYBO_LED_test_27_140225.png

・ZYBOの電流値は0.30Aになった。
ZYBO_LED_test_33_140225.jpg

・4 のキーを押して、LED Interval Resister を設定する。値は、50000000を設定すると、0.5秒毎にLEDの値がインクリメントされるので、これを設定する。
ZYBO_LED_test_28_140225.png

・2 のキーを押すとLEDがカウントを始める。
ZYBO_LED_test_29_140225.png

なお、このZYBO用LEDテストVivado 2013.4プロジェクトは、GithubにPushしておいた。但し、Windowsだと、階層の浅いフォルダに入れておかないとパス名が長すぎてエラーになる。
  1. 2014年03月01日 05:34 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0