SNSへはこちら

PYNQ-Z1ボードでFPGA体験(2) - Vivadoの軽い理解・最低限の知識

やっと Vivado を使います。

今回は具体的な理解はさておき、とりあえずざっくり理解した上で構成を考えることをしてみました。なお、FPGA を最近いじり始めて間もないので理解がざっくりしています。ひょっとしたら記述が間違っているかも...その時は誰かコメントで教えて下さい!

参考資料

そもそもの構成がわからん...

このボード、よく見ると色々できるようにたくさんの素子、コネクタが載っています。ただ、PSPL の区別をつけるのは大切だと思いましたのでまとめます。

PS(Processing System)

そもそもこのボードに載っているチップにはマイコンがあります。ARM コアなんですが、ここから Python を経由して RAM やロジック部分にアクセスできるんですよね。
PYNQ とはそういう複数レイヤを跨いだプラットフォームを指すのであって、つまりレイヤが高すぎてなんにもわかりません。僕はとりあえず FPGA でロジック設計を味わいたいのよ。

PL(Programmable Logic)

これがいわゆる FPGA です。論理ゲート素子に対して LUT(Look-Up Table) を与えて回路を構成する感じのものです。これを求めていた...

最低限の環境に落とし込む

皆さん FPGA ボードでかなりすごいことをされている人が多いですよね。でも、この界隈、入門レヴェルと上級者の乖離が激しくないですか???

...ちょっと荒ぶりました。つまり、入門でLチカをしている人と、IkaLog などのすごい回路設計をされている人がいるけれど中間層が少ない気がする、ということです。
僕はその中間層である自覚はあります。多分。
前回の記事にも載せましたこの Qiita 記事ではなんか大層な ZYNQ7 Processing System やら Processor System Reset がブロック図で結線されていますけれど、そんなもの要らない訳です。

ここで必要なのはただ一つ。入力と出力の関係性です。

例えばこちらを御覧ください。僕が今現在 PYNQ-Z1 で動かしている回路のブロック図なんですけど(後日公開)、これで十分動いています。

そういえばこうやって TOP モジュールを単独で用意する作法っていいんですかね?まあ慣れないうちは GUI を使わないほうがいいっか。
やたら高級な IP (ペリフェラルのこと) はひとまずいらないわけですよ。こんな高級なものが最初からあったら訳が分からなくてやる気が失せてしまう。

これで皆さん安心しましたかね???僕が土日を犠牲にして研究した結果、この結論に至りました。ぜひこの結果に乗っかってください!

ロジック回路実装のためのフローを概説

深いことを考えずに書き込むまでに必要なフローを示します。

  1. Verilog 等で RTL 記述をする
  2. Block Design を開き、必要な結線をする。入出力ピンは Make External で外に出しておく
  3. Synthesis で各モジュールを論理合成
  4. Synthesized Design を開き、右上プルダウンから I/O Planning によってピン配置をする
  5. Implimentation を実行
  6. Bitstream と言われる、FPGA に書き込むのに必要なバイナリを生成

ざっくりとこんな感じです。RTL 記述を変更したとしても入出力ポートやその名前を変えていない場合は Block Design をやり直す必要はありません。

それぞれですが、僕は以下のような認識でいます。

  • Synthesis(論理合成)は、記述したロジックおよびモジュール間の結線をいい感じに翻訳する作業
  • Implimentation(実装)は、Synthesis したものを実際の入出力ピンと紐付ける作業(多分他にも色々している)

Bitstream生成時のエラー回避

一番多いエラーと思います。Synthesis や Impli が成功しているのに Bitstream 生成が失敗する場合です。
Vivado はすべての結線を I/O Planning で設定しないとエラーになるようで、使用しないピンでもこれが必要です(多分)。

そんなの知るかよ!と思うので、このエラーを握りつぶしてしまいましょう

まずはどこかに tcl ファイルを生成します。僕は pre.tcl としました。そこに以下を書き込みます。ところで tcl って Tickle と読むらしいね。

set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]

これで OK です。あとはプロジェクト内で Flow Navigator 下部の Generate Bitstream を右クリックして Bitstream Settings... をクリックします。
tcl.pre でファイルを指定して Copy sources into project をチェックします。OK したら反映されます。作ったファイルはもういらないので削除してよし。

基本的なピン配置・クロック

回路図を見てください、と言ったらそれまでなので、ボード上にある基本的なポートの番号を便利のために載せておきます。

なお、様々な記事で紹介されている Processing System はあくまで PS (内部のマイコン)から動かす時に必要な IP なので、ひとまず無視しておきましょう

プッシュスイッチ:Active Low です。

ボート上の名前 ポート名
BTN0 D19
BTN1 D20
BTN2 L20
BTN3 L19

スライドスイッチ:Active High です。

ボート上の名前 ポート名
SW0 M20
SW1 M19

BTNx 上の LED:緑色です。

ボート上の名前 ポート名
LD0 R14
LD1 P14
LD2 N16
LD3 M14

SWx 上の LED:三色 LED です。

ボート上の名前 ポート名
LD4(R) N15
LD4(G) G17
LD4(B) L15
LD5(R) M15
LD5(G) L14
LD5(B) G14

また、125MHz のクロックは H16 に供給されています。