ケロロ好きなエンジニアのブログ

サラリーマンエンジニアの電子工作のことをメインに書いていきたいけど電子工作はまとまった時間がないとなかなか難しいから滅多に書けそうもなくてMVNOの話題がメインになりつつあるブログ

ZYBO PL領域を動かしてみる LチカLホワ

にほんブログ村 スマホ・携帯ブログへ にほんブログ村 スマホ・携帯ブログ 格安SIMカード・MVNOへ

スポンサーリンク

さて、Vivadoも入れ準備ができたので、まずは公式のTutorialに沿って試してみます。

Getting Started with Vivado [Reference.Digilentinc]

この公式のTutorialで使っているVivadoは2016.2というかなり古いバージョンなので今回私が使っている2019.1とはGUIがまるっきり違ってますのでお気を付けください。

 

このTutorialはVivadoでLチカ回路を作る!ってよくあるタイプのチュートリアルです。

ZynqのFPGA部分(PL)で作成するということでしょう。

ちなみにZynqってのはCortexメインのPS(ProcessingSystem)領域と、FPGAのPL(ProgrammableLogic)領域に分かれており、それぞれPS/PLというようです。

VivadoというツールはHW部の生成に使いますからFPGA部(PL領域)ということになりますね。

このPSだPLだってのがSoCなFPGAを使ってきたことのない私には初見になります。

 

 

プロジェクトの設定

Vivadoを起動します。

f:id:keroctronics:20200406104044p:plain

 

Create Project から Next と進みプロジェクト名を入力します。

locationは各自に合わせて適当に。Project名はTutorialに合わせて blinky にしました。

f:id:keroctronics:20200406104139p:plain

そしてNext

 

f:id:keroctronics:20200406104311p:plain

ProjectTypeはRTL Projectで、ソースファイルは指定しないのでチェック入れてからNext。

 

f:id:keroctronics:20200406104357p:plain

Default PartではZYBOのボードを指定します。市販ボードを使う場合ここが楽でいいですよね。

Z7-10を指定しますが、TutorialではZyboと古いボードでの設定になっているようですので注意が必要です。

ただ、最初はZYBOが出てこなかったので、右上にある Update Board Repositories をクリックして、10分くらい待つとZYBOが出てきました。この時間でボード情報をダウンロードしてきたようです。長すぎてハングしたのかと思ってKillするところでしたよ。

で、出てきたZyboのZ7-10を選択してからNext。

 

f:id:keroctronics:20200406104627p:plain

設定は終わりです。Finish。

 

合成してみる

Vivadoが立ち上がったかと思います。

f:id:keroctronics:20200406104751p:plain

 

まずは色々な制約を指定する ConstraintFile を追加します。

左メニューのAdd Sourcesをクリックします。

f:id:keroctronics:20200406104930p:plain

Add or create constraints を選択してNext。

 

ここで、TutorialのページにあるZIP Archiveをダウンロードして展開しておきます。

zipはここらへんにありますよ。

f:id:keroctronics:20200406105326p:plain

Add Files(若しくは+アイコン→Add Files)をクリックして制約ファイルを指定します。

Tutorialでは Zybo-Master.xdc を指定していますが、Z7-10の場合は Zybo-Z7-Master.xdc ですね。間違わないように。

どれが正しいのか?ってのは、ファイルの中を見てたとえばクロックピンの指定を見ればわかるかと思います。

そして、 Copy constraints files into project にチェックを入れてFinish。 

f:id:keroctronics:20200406105511p:plain

Copyのチェックを入れたので自分の指定したディレクトリ内にコピーされているはずです。

 

Project ManagerのSourcesペインの中のConstraints(1)の左の>をクリックして展開し、
今読み込ませた Zyno-Z7-Master.xdc をダブルクリックしてファイルの中を見てみます。

f:id:keroctronics:20200406105832p:plain

制約が色々と書いてありますが、すべて#でコメントアウトされていますのでこのままでは何の意味もありません。

なので、この中から必要な部分だけコメントを外します。

8、9行目のクロック

#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { sysclk }]; #IO_L12P_T1_MRCC_35 Sch=sysclk
#create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { sysclk }];

 LED[0]の27行目

#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L23P_T3_35 Sch=led[0]

この行頭の#を外します。

意味としては、クロックの方はsysclkっていうピンのパッケージの位置とIO規格の指定。加えてクロックの属性(周期8ns(デューティ50%)=125MHz)の指定。

LEDの方はパッケージの位置とIO規格の指定です。

コメント外したらセーブします(フロッピーアイコンをクリック)。

 

次はRTL(Verilog)を書いていきます。

PROJECT MANAGERから Add Sourcesをクリック。

f:id:keroctronics:20200406111723p:plain

Add create design sources を選択してNext。

 

新規に作るのでCreate File で ファイル名は blinkv.v といれてOK。

f:id:keroctronics:20200406111812p:plain

 

f:id:keroctronics:20200406111842p:plain

これでFinish。

 

すると、新規ファイルだからかモジュールの定義を聞いてきますので、以下のように入力してOK。

f:id:keroctronics:20200406111919p:plain

ここで間違いに気づいた方は訂正してお進みください。今回はエラーの確認もあるので間違ったまま進めます。

 

すると、今作成したblinkv.vがSourcesペインに現れたのでそれをダブルクリックして開きます。

f:id:keroctronics:20200406130230p:plain

拡大してみます。

f:id:keroctronics:20200406130257p:plain

先ほど指定した入出力しか定義されていません。

これでは何も動きませんので、論理を実装してみます。

やることはLEDチカチカなので、まず必要なのはカウンターですね。

クロックとリセットがあればできますが、リセットってPSのリセットしか回路にはないようです。なので無視しちゃいましょう。
クロックはPSとPL両方にあるようですからPLの方を使用します。

ちなみにPLにクロックがない場合は。PSの方から与えてやる必要があるようで、Zynqの方の設定がいるようです。

 

超簡単なLEDチカチカはこんな感じでしょうか。セーブを忘れずに

f:id:keroctronics:20200406130705p:plain

内容は言うまでもないでしょうが、24ビットカウンタを作って一番上のビットをledに直結です。

 

 

さて、合成していましょう。
いきなりGenerate Bitstreamでもいいんでしょうが、ここは順番に行ってみます。

Run Synthesis

f:id:keroctronics:20200406131856p:plain

動いているかどうかわかりにくいんですが、右上を見ればわかります。

f:id:keroctronics:20200406131928p:plain


無事終われば次はRun Implementation。

f:id:keroctronics:20200406132212p:plain

 

無事終われば次はOpen Implementerd Designを選んでみましょう。

f:id:keroctronics:20200406132452p:plain

 

ちょこっとだけ使ってますよーって感じで出てきました。

f:id:keroctronics:20200406132528p:plain

 

ちなみにSYNTHESISの中のSchematicをクリックすれば回路図も見れます。

f:id:keroctronics:20200406132825p:plain

あまり見やすい回路図ではないですけどね。

 

で、最後に

Generate Bitstream → OK

f:id:keroctronics:20200406133137p:plain

ジョブ数ってのはPCの使用するコア数ってことなんですかね。まぁ適当に。

 

で、先に書いたようにソースに間違いがあるのでエラーが出ます。

っていうかここまで来ないとエラーが出ないんですね。ちゃんとメッセージ見てればWarningとか出てたのかもしれません。

[DRC NSTD-1] Unspecified I/O Standard: 2 out of 2 logical ports use I/O standard (IOSTANDARD) value 'DEFAULT', instead of a user assigned specific value. This may cause I/O contention or incompatibility with the board power or connectivity affecting performance, signal integrity or in extreme cases cause damage to the device or the components to which it is connected. To correct this violation, specify all I/O standards. This design will fail to generate a bitstream unless all logical ports have a user specified I/O standard value defined. To allow bitstream creation with unspecified I/O standard values (not recommended), use this command: set_property SEVERITY {Warning} [get_drc_checks NSTD-1]. NOTE: When using the Vivado Runs infrastructure (e.g. launch_runs Tcl command), add this command to a .tcl file and add that file as a pre-hook for write_bitstream step for the implementation run. Problem ports: clk, and led.

xdcで指定しているポート名とVerilogソースの中で指定しているポート名が違ってますので、xdc指定が反映されていなかったってことになりますね。

clkはsysclkでわかるけど、ledもダメなのか。xdcでled[0]としてたからか。

 

なので、xdcの方は変えずにVerilogの方を以下の様に変更して、再度 Generate Bitstream。

f:id:keroctronics:20200406133926p:plain

これで無事OKとなりました。

 

 

実機確認

さて、実際に動かしてみます。

Z7-10ボードのJ12 PROG UARTと書いてあるUSB端子とパソコンを通信のできるUSBケーブルで接続します。

JP6(電源選択)はUSB側に、JP5(Config選択)はJTAGにしておきます。

それでスライドスイッチをON

パソコンで認識がされたかと思います。私の環境ではCOM4が増えました。

f:id:keroctronics:20200406134809p:plain

 

また、電源を入れたら勝手に動き始めました。デフォルトでプログラムされているんですね。

f:id:keroctronics:20200406160859p:plain

 

次にFlowNavigatorの一番下。Open Hardware Managerの下の
Open Target → AutoConnect をクリックします。

f:id:keroctronics:20200406144308p:plain

 

Hardwareペインにデバイスが現れました。

f:id:keroctronics:20200406145017p:plain

 

書き込みます。

Program Device → xc7z010_1

f:id:keroctronics:20200406145402p:plain


ここで、ビットストリームファイルに先ほどできたbitファイルを指定します。

bitファイルはどこにあるの???で探したら .\blinky.runs\impl_1 の下にできてました。

f:id:keroctronics:20200406150859p:plain

でProgramをクリック。

 

Programが終わると自動で起動します。

youtu.be

LED0が速いペースで点滅しているかと思います。ちょっと速すぎましたね。

よくクロックみたら125MHzなんですよね。いやぁ普通の基板でシングルエンドのクロックで125MHzなんていれてるんですね。ちょっとびっくりです。

もう2ビットくらいカウンター増やしたほうがいいかと思います。

 

おまけ

まぁこれで終わるのも寂しいので、ちょっと拡張してみましょう。

まず、LEDを4bit使いましょう。せっかく4個並んでいるんですからね。

そして、4bitの光らせ方を変えてみましょう。

Verilogソースとxdcを以下のように書き換えます。

f:id:keroctronics:20200406162100p:plain

f:id:keroctronics:20200406162127p:plain

合成、ビットストリーム作成、Programの流れは今までと同じです。

youtu.be

2ビット増やしたカウンターの上位4ビットをそのまま点滅に使ってます。2bit増やして一番上位の25ビット目がちょうどいい感じになりました。

 

 

さらにここからさらにひとひねりしてみましょう。

おっさんなら知っているナイトライダーをするってのもありですね。えぇ昔は良くやってました。

 

今回は一番手っ取り早くLホワをしてみます。

LEDがチカチカ点滅するのがLチカ。
LEDがホワーっと点滅するのがLホワ。

そのLホワです。

LEDは一般的にはPWM制御で明るさを制御します。パルスの幅で制御するわけですが、それを手っ取り早く実現してみます。

 

カウンターまでは一緒。LEDへのアサインを変えるだけです。

f:id:keroctronics:20200406163746p:plain

これ、どういう動きをするの?って結構面倒ですが、考えてみるのも楽しいですよ。

youtu.be

4つのLEDにちょっとづつ違うようにアサインしてみましたが、基本は1行で実現できます。

まぁこれは一方向だけのホワなので厳密なLホワじゃないでしょうけど、1行でできるので簡易テストにはちょうどいいです。

そこをちゃんとするのは考えてみてください。数行増えるだけでいけますね。

 

まぁこれもVerilogだから簡単なのであって、スケマティックで書くとなると面倒にはなりますけどね。

 

というわけで、PL領域で遊んでみました。

ここまではPS領域にあるCortexはまったく動いていない状態です。たんなるFPGAですね。

 

次はPS領域を動かしてみたいと思います。