|
|
(a)従来の信号処理システムには多くのコンポーネントが必要だった
|
(b)Eclypse Z7ボード + Zmod ADC/DACによるシステム構成
|
図3 Zynqを利用すれば信号処理システムを簡潔にまとめられる
|
Zynqの開発環境“Vivado”をインストールする
開発に使うPCを用意する
Zynqを開発するときは,Xilinx社から提供されている開発環境の“Vivado”(ビバド)を利用します.回路規模が大きいチップを開発する場合は有料のライセンスが必要となりますが,Eclypse Z7ボードに載っているZynq-7020デバイスは無料で開発することができます.
ここから先の説明では,Windows10の64ビット版のOSを使うものとします.メモリ(RAM)は最低でも8G バイトは確保しておきたいところです.ハードディスクの容量は,Vivadoのインストールで46 Gバイトほど使います(今回の設定の場合).また,後でZynq用のLinux開発環境である“PetaLinux”(ペタリナックス)をインストールすることも考えると,合計100 Gバイト程度の空き容量が必要となります.余計なトラブルを避けて開発効率を上げるために,十分な性能の開発用PCを用意しておくことをお勧めします.
Vivadoのインストーラをダウンロードする
Vivadoのインストーラをダウンロードするために,Xilinx社のダウンロード・ページにアクセスします.アカウントは無料で作れるので,この機会に取得しておくことをおすすめします(図4).アカウントを取得したら,ログインします(図5).
|
|
図4 XilinxのWebページにアクセスする.アカウントが無い場合は取得しておく
|
図5 作成したアカウントでログインする
|
Vivadoにはリリース時期によって多くのバージョンが存在します.Eclypse Z7ボードを開発する際は,“Vivado 2019.1”を使うことが推奨されています.“Version”の欄から“Vivado Archive”をクリックして過去のバージョン一覧を開き(図6),“2019.1”をクリックします(図7).
|
|
図6 “Vivado Archive”をクリックする
|
図7 “2019.1”をクリックする
|
一覧の中から,Windows版の自己展開型インストーラである“Vivado HLx 2019.1: WebPACK and Editions - Windows Self Extracting Web Installer”を探してダウンロードします(図8).ダウンロード先は,デスクトップなどのわかりやすい場所にすることをおすすめします.
|
図8 Windows版の自己展開型インストーラをダウンロードする
|
Vivadoをインストールする
ダウンロードしたインストーラをダブル・クリックして起動します(図9).インストーラを起動すると「このアプリがデバイスに変更を加えることを許可しますか?」というメッセージが出るので,「はい」をクリックします.
続いて最新のバージョンがあることを通知するウィンドウが出ますが,今回インストールするバージョンは“2019.1”で良いので[Continue]をクリックします(図10).
|
|
図9 ダウンロードしたインストーラを起動する
|
図10 最新版のVivadoがあっても無視する
|
図11の画面ではVivadoをインストールする環境について注釈が出るので,[Next]をクリックします.
図12の画面ではユーザIDとパスワードを入力します(私がインストールしたときはユーザIDとしてXilinx社に登録したメール・アドレスを入力しました).“Download and Install Now”を選択して,[Next]をクリックします.
|
|
図11 [Next]をクリックして次の画面へ
|
図12 ユーザIDとパスワードを入力する.“Download and Install Now”にチェックをつけて[Next]をクリック
|
図13の画面ではライセンス関係の同意を求められるので,3箇所にチェックをつけて[Next]をクリックします.
図14の画面ではインストールするエディションを選択します.“Vivado HL Design Edition”にチェックを付けて[Next]をクリックします.
|
|
図13 3箇所にチェックをつけて[Next]をクリック
|
図14 “Vivado HL Design Edition”を選択する
|
図15の画面では,実際に開発対象とするデバイスを選択します.今回はディスク容量を節約するために,“Devices”の項目の“SoCs”と“7 Series”だけにチェックを付けて,“UltraScale”および“UltraScale+”といった回路規模が大きいデバイスは除外しておきます.それ以外はデフォルトのままにします.
図16の画面ではインストール先のディレクトリを設定できます.今回はデフォルトのままで進めます.
|
|
図15 開発対象のデバイスを選ぶ
|
図16 インストール先のディレクトリの設定画面
|
図17の画面では,ここまでの設定の一覧が表示されます.問題ないことを確認して[Install]をクリックします.今回の設定では,11Gバイトのデータをダウンロードします.それなりに時間がかかるので,気長に待ちます(図18).
|
|
図17 設定に問題ないことを確認して[Install]をクリック
|
図18 必要なデータのダウンロードに時間がかかるので気長に待つ
|
インストールが完了すると,図19のような“Vivado License Manager”の画面が表示されます.今回のEclypse Z7ボード(Zynq-7020デバイス)の開発ではライセンス管理は不要なので,何もせずに閉じてしまって構いません.
|
図19 今回はライセンスを管理せずに閉じる
|
Digilent社製ボードのハードウェア情報を入手する
Eclypse Z7ボードの開発元であるDigilent社から,Eclypse Z7ボードのハードウェア情報を記述した“board_files”が提供されています.このboard_filesは後でVivadoで新しいプロジェクトを作るときに利用するので,ここでダウンロードしておきます.
まず,Digilent社製のボードのハードウェア情報が保管されているGitHubのWebページにアクセスします.図20のように“Code”ボタンをクリックして“Download ZIP”をクリックします.
|
図20 Digilent社製ボードのハードウェア情報をダウンロードする
|
ダウンロードした圧縮ファイルを展開して,“vivado-boards-master/new/board_files/” の中のファイルをすべてコピーします(図21).これらをVivadoのインストール・ディレクトリ内にある“C:/Xilinx/Vivado/2019.1/data/boards/board_files”(デフォルトの場合)に保存します(図22).これでVivadoはEclypse Z7ボードの内部構成を把握できるようになります.
|
|
図21 Digilent社製ボードの“board_files”をコピーする
|
図22 Vivadoの“board_files”ディレクトリにデータを追加する
|
ZynqのFPGA部分(PL)で「Lチカ」の実験をする
Vivadoによる初めてのFPGA開発
Vivadoの使い方に慣れるために,ZynqのFPGA側(PL)に簡単な回路を作り込む練習をしてみます.今回作るのはEclypse Z7ボード上のLEDを点滅させる,いわゆる「Lチカ」の回路です.
これから行う操作の流れを図23に示します.最初に新しいプロジェクトを作成して,使用するデバイスやボードを選択します.続いて,Zynqの各ピンの割り当てを記述した「デザイン制約ファイル」(“Xilinx Design Constraint”ファイル)を追加します.その後PLの内部に作り込む回路をハードウェア記述言語(HDL)で記述します.今回はHDLとして“Verilog HDL”(以下Verilog)を使います.Verilogによる回路の記述が済んだら「論理合成」,「配置・配線」,「ビットストリーム・ファイル(.bit ファイル)の作成」を行ってZynqに書き込むファイルを作ります.最後にZynqに対してビットストリーム・ファイルを書き込んでコンフィグレーションすれば完了です.
|
図23 Vivadoを使ってFPGA側(PL)の開発を行う基本的な手順
|
新しいプロジェクトを作る
Windowsスタート・メニューから[X] - [Xilinx Design Tools] - [Vivado 2019.1]をクリックしてVivadoを起動します.Vivadoが起動すると図24の画面が表示されるので,[Create Project]をクリックします.続いて表示される図25の画面では[Next]をクリックします.
|
|
図24 Vivadoを起動したら[Create Project]をクリックする
|
図25 [Next]をクリック
|
図26の画面ではプロジェクトの名前と保存先を指定します.今回は“20210307test1”というプロジェクト名にしました.プロジェクトを保存するディレクトリは,適宜決めてください.私は今後の実験をまとめて管理するために“C:/FPGA_Projects/Xilinx_FPGA”というディレクトリを作成して,この中に各プロジェクトを保存するようにしています.
なお,“Create project subdirectory”にチェックを付けると,指定したディレクトリ内にプロジェクト名のディレクトリを作成してその中にプロジェクトのファイル群が保存されるようになります.プロジェクトを整理しやすくなるので,チェックを付けておくことをお勧めします.
図27の画面ではプロジェクトの種類を指定します.今回は“RTL Project”を選択します.また,今回は既存のファイルがまったく無い状態からプロジェクトを作成するので“Do not specify sources at this time”にチェックを付けておきます.
|
|
図26 新規作成するプロジェクトの名前と保存先を指定する
|
図27 “RTL Project”を選択する.“Do not specify sources at this time”にチェックを付けておく
|
図28の画面では使用するデバイスあるいはボードを選択します.先ほどDigilent社が提供している“board_files”をコピーしておいたので,“Boards”のタブを選択すると一覧の中に“Eclypse Z7”という項目があるはずです.これを選択して[Next]をクリックします.
図29の画面では,新規作成するプロジェクトの設定内容が表示されます.特に問題が無いことを確認して[Finish]をクリックします.
|
|
図28 使用するデバイスあるいはボードを選択する
|
図29 [Finish]をクリックすればプロジェクトの新規作成は完了
|
無事にプロジェクトが作成されると,図30の画面が表示されます.これがVivadoの基本画面となります.
|
図30 プロジェクトの作成が完了するとVivadoの基本画面が表示される
|
.xdcファイルを追加する
Vivadoで扱うデバイスのピン・アサイン(ピン割り当て)情報は,“Xilinx Design Constraints File”(ザイリンクス・デザイン制約ファイル)によって管理されています.拡張子は“.xdc”です.Eclypse Z7ボード上のZynqのピン・アサインに関する情報は,あらかじめDigilent社が用意してくれています.このデータが保管されているGitHubのWebページにアクセスして,ZIPファイルをダウンロードします(図31).ダウンロードしたファイルを展開して,わかりやすい場所に保存しておきます.
|
図31 Digilent社が用意している.xdcファイルをダウンロードしておく
|
ダウンロードした.xdcファイルをプロジェクトに追加します.Vivadoの画面左側の“Flow Navigator”の中から“Add Sources”をクリックします(図32).すると図33の画面が表示されるので“Add or create constraints”を選択して[Next]をクリックします.
|
|
図32 “Add Sources”をクリックする
|
図33 “Add or create constraints”を選択して[Next]をクリックする
|
図34の画面で“Add Files”をクリックします.すると図35のようにファイル・ブラウザが表示されるので,さきほどGitHubからダウンロードして展開しておいたディレクトリへ移動します.この中から“Eclypse-Z7-Master.xdc”を選択して[OK]をクリックします.
|
|
図33 “Add Files”をクリックする
|
図34 先にダウンロードしておいたEclypse Z7ボード用の.xdcファイルを選ぶ
|
図36の画面に戻るので,“Copy constraints file into project”にチェックを付けて[Finish]をクリックします.このオプションにチェックを付けておくと,元の.xdcファイルをコピーしたものがプロジェクトのディレクトリ内に保存されるます.オリジナルの.xdcファイルが変更されることを防げるので,チェックを付けておくことをお勧めします.
.xdcファイルを追加できたら,図37のようにVivadoの“Source”エリアにある“Constraints”を展開して“Eclypse-Z7-Master.xdc”があることを確認します.これをダブルクリックすると,.xdcファイルの編集画面が開きます.
|
|
図36 “Copy constraints file into project”にチェックを付けて[Finish]をクリックする
|
図37 “Sources”エリアの“Constraints”の中にあるEclypse Z7ボードの.xdcファイルをダブル・クリックして開く
|
図38の編集画面で,.xdcファイルを次のように編集します.まず,125 MHzのクロック信号が入力されるピンをアクティブにするために,7行目と8行目をコメント・アウトしている“\#”を削除します.さらに,LEDに接続されているピンもアクティブにします.今回は15行目の文頭の“\#”を削除して“led0_b”を有効にしました.これで“LED0”(基板上のシルクは“LD0”)の青色LEDに接続されているZynqのピンが有効になります.
|
図38 .xdcファイルを編集してクロック信号とLEDに割り当てられたピンを有効にする
|
Verilogファイルを追加する
FPGA(PL)に作り込む論理回路を設計します.図39のように“Add Sources”をクリックします.続いて表示される図40の画面では“Add or create design sources”を選択して[Next]をクリックします.
|
|
図39 “Add Sources”をクリックする
|
図40 “Add or create design sources”を選択して[Next]をクリックする
|
図41の画面で“Create File”をクリックします.図42の画面ではFile typeの欄で“Verilog”を選び,File nameの欄にファイル名を入力します.今回は“test1.v”としました.Verilogファイルなので,拡張子は“.v”です.
|
|
図41 “Create File”をクリックする
|
図42 ファイル名を入力する
|
図43の画面が表示されたら[Finish]をクリックします.続いて図44の画面が表示されるので,これから作るモジュールの入出力ポートを定義しておきます.[+]ボタンをクリックして,2個の入力欄を用意します.1つめの入力欄はPort Nameを“clk”,Directonは“input”に設定します(外部から125 MHzのクロックを入力するポート).2つめの入力欄はPort Nameを“led0_b”,Directionを“output”にします(青色LEDに接続するポート).
|
|
図43 [Finish]をクリックする
|
図44 モジュールの入出力ポートの名前を定義する
|
Vivadoの画面に戻ったら,図45のように“Sources”エリアの“Design Sources”を展開します.いま作成した“test1.v”があることを確認し,ダブル・クリックして開きます.Verilogファイルの編集画面が開くので,リスト1の内容を記述します.記述し終わった状態を図46に示します.
|
|
図45 作成した“test1.v”をダブル・クリックして開く
|
図46 Verilogの編集画面が表示されるので論理回路を記述する
|
module test1(
input clk,
output led0_b
);
reg [24:0] count;
assign led0_b = count[24];
always @ (posedge clk)
begin
count <= count + 1;
end
endmodule
|
リスト1 LED点滅回路のVerilog記述例“test1.v”
|
ここで定義している論理回路は図47のように非常に単純なものです.25ビット幅のレジスタ“count”を用意して,“clk”信号の立ち上がりエッジで値をインクリメントしています.出力の“led0_b”は“count”レジスタの25ビット目をそのまま接続しています.これで,Zynqの外部から入力される125 MHzのクロックを分周した信号がLEDに印加されるようになります.
|
図47 今回PLに実装するLED点滅回路のブロック図
|
論理合成および配置・配線を実行する
Verilogによる回路記述ができたら,「論理合成」(synthesis)を実行します.図48に示すとおり,画面左側の“Flow Navigator”の中の“Run Synthesis”をクリックします.図49の画面では“Launch runs on local host”を選択し,論理合成に使用するプロセッサのコア数(自分の環境の最大値がおすすめ)を設定して[OK]をクリックします.
|
|
図48 “Run Synthesis”をクリックする
|
図49 論理合成に使うプロセッサのコア数を確認して[OK]をクリックする
|
図50のように画面下部の“Design Runs”タブに論理合成中の様子が表示されるので,完了するまで待ちます.論理合成が完了すると図51のように次の動作を質問されるので,「配置・配線」(implementation)を実行します.
|
|
図50 画面下部の“Design Runs”タブに論理合成中の様子が表示される
|
図51 配置・配線(implementation)を実行する
|
図52の画面では,例によってプロセッサ数を設定して[OK]をクリックします.配置・配線が完了するまで少し待ちます(図53).
|
|
図52 配置・配線に使用するプロセッサのコア数を設定して[OK]をクリックする
|
図53 配置・配線が完了するまで待つ
|
配置配線が完了したら,Zynqに書き込むPLの定義ファイルである「ビットストリーム」(bitstream)を作成します.配置配線が完了した後に表示される図54の画面で“Generate Bitstream”を選択して[OK]をクリックします.図55の画面ではビットストリームの作成に使用するプロセッサのコア数を設定して[OK]をクリックします.
ビットストリームの作成が完了すると,Vivadoの画面の右上に“write_bitstream Complete”と表示されます.
|
|
図54 “Generate Bitstream”を選択して[OK]をクリックする
|
図55 [OK]をクリックする
|
ZynqのPLにデータを書き込む
完成したビットストリームをZynqに書き込みます.Eclypse Z7ボードに付属のACアダプタを接続します.また,付属のUSB Type A - micro B ケーブルを使ってEclypse Z7ボードの“J6”コネクタ(シルクで“PROG”と書かれている)とPCを接続します.ボード上のジャンパ“JP5”は,写真5のように“JTAG”側にします.なお,“JTAG”(Joint Test Action Group)とはCPUやFPGAに対して書き込みやデバッグをするための規格の1つです.この状態でEclypse Z7ボードの“POWER”スイッチを“ON”します.
|
写真5 ボード上の“JP5”を“JTAG”側にする
|
Eclypse Z7ボード側の準備ができたら,図56のようにVivadoの画面左側の“Flow Navigator”の中の“Open Hardware Manager”をクリックします.初めてこの操作を実行したときは図57の画面が出るので,適宜チェックをつけて[アクセスを許可する]をクリックします.
|
|
図56 “Open Hardware Manager”をクリックする
|
図57 [OK]をクリックする
|
画面の上部に“No hardware target is open”と表示されるので“Open target”をクリックし,“Auto Connect”をクリックします(図58).ここでも初回は図59のようにアクセス許可を求める画面が出るので,適宜チェックを入れて[アクセスを許可する]をクリックします.
|
|
図58 “Open target”をクリックし,“Auto Connect”をクリックする
|
図59 [アクセスを許可する]をクリックする
|
問題なくEclypse Z7ボードとの接続が確立されると図60のように“Program device”と表示されるので,これをクリックします.もし表示されない場合は,ボードの電源やUSBケーブルの接続,“JP5”のジャンパが“JTAG”側になっていることなどを確認してください.図61の画面では先ほど作成したビットストリームが選択されていることを確認し,[Program]をクリックします.
|
|
図60 “Program device”をクリックする
|
図61 [Program]をクリックする
|
ビットストリームの書き込み後,ボード上のLED“LD0”が青色で点滅すれば成功です(写真6).なお,今回はJTAGでビットストリームを転送しているので,ボードの電源を切るとFPGAのコンフィグレーションは初期化されてしまいます.電源を切ってもコンフィグレーションを維持するためにはZynqのPS側と連携する必要があります.この内容は追って説明します.
|
写真6 ボード上のLEDが青色で点滅すれば成功
|
(c)2021 Nobuyasu Beppu