前回はFPGA部分(ZynqではPL部と呼ばれています)は無視していました。
とりあえず回路構成をSDKに教えて、SDK側でARMのデバッグ実行を指定ました。
実はSDKはARMの操作やデバッグに使うためのもので、PL部のプログラムだけならVivadoから行えます。今回は簡単なVerilog-HDLで回路を構成してZynqに書き込んでみましょう。
Verilog-HDLを書く
Vivadoを開いて前回利用したプロジェクトをそのまま利用します。
新しいVerilogを追加するには「Add Sources」を押します。
「Add or create design sources」を押します。
ここで既存のファイルを入れるのか、新しくファイルを作るのか決められます。
新しく作りたいので「Create File…」を押しFile typeで「Verilog」を選びます。File nameは適当にledなどと入れて。「OK」を押します。
Finishを押して完了させるとVerilogが出てきますが、 同時にポートの設定Dialogも出てくると思います。これはあとでも出来ますので「Cancel」で閉じておきましょう。
Sourcesウインドウにled.vというファイルが追加されていると思います。
恐らくSimulation SourcesとDesignSourcesのそれぞれのNon-module Filesっていう場所に入っていると思います。
ファイルはダブルクリックで開けますが、どちらも同じファイルを指しているのでどちらから開いても同じファイルになります。
開いたら今回のVerilogを書いてみましょう。
今回は入力をそのまま出力に出すというものです。
module led(led, button); output led; input button; assign led = button; endmodule
これをled.vに書き込みます。
ファイルの保存は右クリックから「Save File」で保存できます。
ちなみに保存した瞬間にVerilogとして正しいかが検証されます。
もし文字を間違えたりして文法エラーを起こしていたら「Syntax Error Files」に入ります。
また、エラーの詳細は右下の「Log」というところに出てきて、細かく何が違ったのか、どのファイルの何行目なのかを教えてくれます。
問題がなければ保存すると同時にNon-module Filesから出てきて、前回勝手に作成されたwrapperファイルと同じレベルにled.vが上がってきます。
led.vを論理合成させるためにled.vをTopに持ってきます。
今はledでなくwrapperが太文字になっていると思いますが、それはwrapperがTopになっている証拠です。ledの方をTopにするにはledを右クリックし「Set as Top」を押します。
ledが太文字になるはずです。
ここまででVerilogの準備は出来ました。
RTL Analysis
Verilogである入力がある出力にそのまま繋がるというのは決めました。じゃあそれってどのピンなのよというのはまだ設定していません。RTLAnalysisのI/O Plannningから設定します。
FlowNavigatorのRTL AnalysisにあるElaborated Designを押します。
初めて押す場合は押すだけで前処理が始まり、一度押した場合は既に作成されているので右クリックから「Reload Design」を押します。
終わったら下にある「Schematic」を押してみましょう。Verilogで書いた通りの回路が出てくると思います。
ここでVerilogで設定した入出力がどのピンなのか、CLockどうするのかTimingどうするのかを設定できます。今回はとりあえずピンだけ設定しましょう。上に「Default Layout」となっている部分をI/O Plannningにします。
すると下に「IO Ports」ってのが出てくると思います。これこそがVerilog上のピンと実際のZynqのピンをつなぐためのものです。
今回どこへつなぎましょうか。ZYBOの説明書によるとスイッチやLEDはこうなっています。
PLから利用できるLEDは4つD18, G14, M15, M14です。
スイッチはスライドスイッチとボタンがそれぞれ4個あります。
今回はY16のボタンとD18のLEDをつかってみましょうか。
さっきのIOPortsの「Site」っていうのがZynqの物理ピンを選択する部分です。
buttonの方をY16に、ledの方をD18に設定します。
「I/O std」にdefaultの赤文字がついていますが、defaultだと後で失敗します。
LVCMOS25などに切り替えましょう。
これでピンアサインは終わりです。
Synthesis-Implementation-GenerateBitstream
あとはZynqに書き込むためのbitstreamを作成するだけです。
「Run Synthesis」「Run Implementation」「Generate Bitstream」の3つをそれぞれ実行します。
ちなみにそれぞれ終わるときに「次これやります?」と親切に聞いてくれるのでそのまま従ってみましょう。
ボードを開く
VivadoからJATG経由でbitstreamを書き込みましょう。
OpenHardwareManagerからOpen Targetを押しOpen New Targetを押します
後はDialogに従って行くだけです
Connect toではLocal serverを選びます。
Local serverって何かというと、JTAGでZynqにはつなぐわけですがVivadoとSDK両方でJTAGを使うこともありそうですよね。なので、JTAGを使いローカルサバーとして立ち上がっているプロセスがあってそこにつなぐことでそれ経由でボードにbitstreamを書き込んだり出来るのです。
問題なくボードが見つかればこんな風になると思います。下の写真だと2つ出てきてますが、xc7cの方がZYBOボードですのでそれを選んでNextで進みます
以上で完了です。
デバイスが追加されると、HardwareManagerが開かれます。
これでbitstreamを書き込める状態になりましたので、早速書き込みましょう。
Hardware Managerの「Program Device」を押して、先ほど追加したチップを選択します。
ここで、bitstreamを選択してくれと出てきます。
多分前回のプロジェクトのbitstreamファイルが選ばれたままになっています。なので、右側のファイル選択を押して今回作成したbitstreamを選びましょう。
Debug probes fileはそのままで大丈夫です。
これでもうProgramを押すだけで、ボードに書き込まれます。
書き込みが完了するとPL部ConfigrationDoneLEDが点灯すると思います。
このLEDがついたということは問題なくbitstreamが書き込まれたということで、もう動作しています。
Y16に繋がれているボタンを押してみましょう。(ボードにも印字されています。一番左のボタンですね)そうするとD18につながれているLEDが点灯すると思います。
回路図ではボタンを押すと電圧が加わるようになっていて、LEDは先がGNDにつながっているので、ボタンを押すとLEDが点灯するというので合っていますね。
試しに
assign led = !button;
と反転させるとちゃんとボタンを押していない時だけLEDが点灯すると思います。
参考になりました。どうもありがとうございます。
以下、補足事項を記載させていただきました。
http://qiita.com/7of9/items/1b39d055b0792e222f73
お世話になります 最近 ZYBOボードを購入しVivadoに挑戦しています。
こちらのブログはたいへん参考になります。 ついては質問があります。
「6_ Zynq Verilog-HDLをZynqに書き込みFPGAを使う」で led.vを追加しtopモジュールに変更後にRTL AnalysisでElaborated Designを押した後でSchematicsを押すとled.vでなく前に作成したmaindesignの回路図が表示されます。そのため I/O Planningに変更してもledとbuttonのピンアサインが指定できないため対策をお知らせください。