|
|
Hello, FPGA!
|
|
|
============
|
|
|
|
|
|
最初に必要なファイルをダウンロードします。
|
|
|
|
|
|
[practice.zip](uploads/3945215f3498353e78d6d95ec9a53bbb/practice.zip)
|
|
|
|
|
|
zipファイルをダウンロードしたディレクトリ内で、以下のコマンドを入力し、解凍します。
|
|
|
|
|
|
```bash
|
|
|
$ unzip practice.zip
|
|
|
```
|
|
|
|
|
|
## NEXYS VIDEO 用の定義ファイルをインストール
|
|
|
|
|
|
解凍したpracticeディレクトリ内に、今回使う FPGAボード(DIGILENT社 NEXYS VIDEO)用の定義ファイルがあります。
|
|
|
これを Vivado のインストールディレクトリ中のボード定義ファイル格納場所にコピーします。
|
|
|
|
|
|
```bash
|
|
|
$ sudo cp -r practice/nexys_video /opt/Xilinx/Vivado/2018.2/data/boards/board_files/.
|
|
|
```
|
|
|
|
|
|
## 4bit adder の作成
|
|
|
|
|
|
Verilog HDL によって 4bit adder を記述し、FPGA 上で動作させてみましょう。
|
|
|
|
|
|
### Project の作成
|
|
|
|
|
|
適当な作業ディレクトリを作成し、Vivado を起動します。
|
|
|
|
|
|
```bash
|
|
|
$ mkdir work
|
|
|
$ cd work
|
|
|
$ vivado&
|
|
|
```
|
|
|
|
|
|
![Screenshot__1_](uploads/a5b41a6eac7d03af526f5ccef90ab8ac/Screenshot__1_.png)
|
|
|
|
|
|
左上の File タブから File→Project→New とたどると、新規Project 作成用のウィザードが出てきます。
|
|
|
|
|
|
![Screenshot__2_](uploads/4c0b91f4e97bbad225a7bbbc7f81c553/Screenshot__2_.png)
|
|
|
|
|
|
`Project name` は adder4 など、適当なものに設定します。
|
|
|
`Project location` には作業用ディレクトリを適当に設定します。
|
|
|
`Create project subdirectory` にチェックがついていることを確認して、`Next >`を押します。
|
|
|
|
|
|
![Screenshot__3_](uploads/278a1a6af29e547d85e81c7d72392eef/Screenshot__3_.png)
|
|
|
|
|
|
`RTL Project` がチェックされていることを確認して、`Next >`を押します。
|
|
|
|
|
|
![Screenshot__4_](uploads/6afb8914699235af68f42fbedfdcf9e4/Screenshot__4_.png)
|
|
|
|
|
|
先ほどダウンロードした後解凍した practice ディレクトリ内にある、`adder.v`、`top_module.v`、`testbench.v`をソースファイルとして追加し、`Next >`を押します。
|
|
|
ここで、`adder.v`は全加算器、`top_module.v`はトップモジュール、`testbench.v`はシミュレーションに用いるためのファイルです。
|
|
|
トップモジュールは、FPGA の入出力ピンと直接つながっているモジュールであり、トップモジュール内に他のモジュールを階層的に配置していくことで論理回路を作成します。
|
|
|
Vivado では特に設定をしなくてもこうしたモジュール間の関係をおおむね正確に読み取ってくれますが、できる限り明示的に設定しておくとよいでしょう。
|
|
|
|
|
|
ここで使用したソースファイルが何を記述しているものなのかわからない場合、[ソースファイルの解説](./example)を参照してください。
|
|
|
|
|
|
![Screenshot__5_](uploads/9b7e5d05e5eff204dd18a7e1f6323931/Screenshot__5_.png)
|
|
|
|
|
|
practice ディレクトリ内にある、`nexys.xdc`を制約 (constraints) ファイルとして追加したら、`Next >`を押します。
|
|
|
制約ファイルは使用する FPGA の設定用ファイルであり、ここに入出力ピンの設定が書かれています。
|
|
|
|
|
|
![Screenshot__6_](uploads/36f91e27868f533ca222ade9ef8923a2/Screenshot__6_.png)
|
|
|
|
|
|
左上の `Boards` を選択した後、今回使う Nexys Video を選択したら`Next >`を押します。
|
|
|
Preview に画像が表示されないですが、特に問題はありません。
|
|
|
|
|
|
![Screenshot__7_](uploads/221ba5fcf2ea42456075e773ec73c7a3/Screenshot__7_.png)
|
|
|
|
|
|
正しくソースファイルや制約ファイルが読み込まれており、ターゲットボードが Nexys Video になっていることが確認できたら、`Finish`を押します。
|
|
|
|
|
|
![Screenshot__8_](uploads/13f7c75594c7fb1ba18d99de431f310b/Screenshot__8_.png)
|
|
|
|
|
|
プロジェクトが正しく作成されれば、上記のような画面が表示されます。
|
|
|
|
|
|
## シミュレーション
|
|
|
|
|
|
![Screenshot__13_](uploads/965ff23ac5e9b517785ae0bec1c8932e/Screenshot__13_.png)
|
|
|
|
|
|
左側の `Flow Navigator` から、 SIMULATION→Run Simulation→Run Behavioral Simulation を選択します。
|
|
|
一番右にあるウィンドウの Untitled 1 と書いてあるタブを選択すると、シミュレーション波形を見ることができます。
|
|
|
|
|
|
* Ctrlキー+マウススクロール で波形の拡大縮小ができます。
|
|
|
* Shiftキー+マウススクロール で波形の表示範囲を変更できます。
|
|
|
* 表示されている数字はデフォルトで十六進数になっていますが、二進数・八進数・十進数に変更することも可能です。Name の表示を変更したいもののところで右クリック→Radix を選択した後好きなものを選び、変更します。Binary が二進数、Octal が八進数、Decimal が十進数、Hexadecimal が儒六進数です。
|
|
|
* 観測する信号を増やしたい場合は、Objects からドラッグアンドドロップで追加できます。
|
|
|
|
|
|
## FPGA で動かす
|
|
|
|
|
|
シミュレーション結果に問題がなければ、FPGA 上での動作確認へ進みます。
|
|
|
左側の Flow Navigator から、PROGRAM AND DEBUG→Generate Bitstreamを選択します。
|
|
|
|
|
|
![Screenshot__9_](uploads/b13f82fe72da9169cf82bc12f9d7a6ba/Screenshot__9_.png)
|
|
|
|
|
|
Synthesis (論理合成、つまり RTL 記述からゲートレベルネットリストへの変換工程)や Implementation(配置配線、つまりゲートレベルネットリストから、FPGA 上における各ゲートの配置場所や配線経路を決定する工程)を順に行わずに Generate Bitstreamを選択したため、上記のようなウィンドウが表示されます。
|
|
|
|
|
|
`Yes` を選択すると、こうした工程と最終工程である Bitstreamデータ作成とを連続で行ってくれます。
|
|
|
|
|
|
![Screenshot__10_](uploads/d681d4b8d5f0ee69d14e5e952cdce742/Screenshot__10_.png)
|
|
|
|
|
|
Launch runs on local host にチェックがついていることを確認して `OK`を選択すると、論理合成、配置配線、Bitstream 生成作業が始まります。
|
|
|
|
|
|
数分程度で Bitstream Generation Completed と表示されるので、 `Open Hardware Manager`を選択し、`OK` を選択します。
|
|
|
|
|
|
![Screenshot__11_](uploads/e0038a6e2a93f8fc6081d891e3e1b895/Screenshot__11_.png)
|
|
|
|
|
|
すると画面の上の方に No hardware target is open と表示されます。これはまだ FPGA を接続していないためです。
|
|
|
|
|
|
![2018-10-11-15-33-57](uploads/b2e1026cb97b338c8087b19f0ba88845/2018-10-11-15-33-57.jpg)
|
|
|
|
|
|
FPGAボードにACアダプタをつなぎ、micro-USB-USBケーブルを介して PC と接続した後、電源を投入します。
|
|
|
ここで、プログラムを書き込むための PROG という端子のほかに、 UART通信用の UARTというmicroUSB端子も存在するので、注意してください。
|
|
|
|
|
|
|
|
|
画面上部に表示された、Open target から、Auto Connect を選択します。
|
|
|
Flow Navigator の Open Hardware Manager→Open Target から Auto Connect を選択することも可能です。
|
|
|
|
|
|
うまくいけば接続した FPGA が認識され、表示されるはずです。
|
|
|
|
|
|
![Screenshot__12_](uploads/54b13faa58171315f7b1a4f4b2affeff/Screenshot__12_.png)
|
|
|
|
|
|
同様に Program Device を選択し、表示された FPGA名を選択します。
|
|
|
|
|
|
![Screenshot__15_](uploads/e2a2cf97be481492ce984f6854ce7e7f/Screenshot__15_.png)
|
|
|
|
|
|
上記のようなウィンドウが表示されます。ここで、Program とすると、先ほど作成した Bitstreamファイルが FPGA へと書き込まれます。
|
|
|
|
|
|
|
|
|
|
|
|
今回作成した adder は、FPGA 上のスライドスイッチの右側四つと左側四つによって加算器に入力する 4bit の値を決定し、結果を LED の点灯によってえる事ができます。正しく動作していることを確認してみてください。
|
|
|
|
|
|
## ステートマシンの作成
|
|
|
|
|
|
### Project の作成
|
|
|
|
|
|
Adder の時と同様にして Project を新規作成しましょう。
|
|
|
practice ディレクトリ内にある、`top_module2.v`と`filevendingmachine.v`をソースファイルとして追加してください。
|
|
|
また、`nexys.xdc`を制約ファイルとして追加するのを忘れないでください。
|
|
|
|
|
|
Project が作成出来たら、Vivado 上で `nexys.xdc`の Buttons について記述してある、38行目のコメントアウトを外します。これによって、リセットボタンが`cpu_resetn`としてトップモジュールから参照できるようになります。
|
|
|
|
|
|
### test bench の作成
|
|
|
|
|
|
シミュレーション用の test bench を Adder 用のファイルを参考にしながら作成してみましょう。
|
|
|
Flow Navigator の`PROJECT MANAGER→Add Sources`から、`Add or create simulation sources`を選択し、`Create File`でファイルを新規作成します。`File type`は`Verilog`で、ファイル名は`testbench.v`などと適当に決め、`OK`を押し、`Finish`を押します。このとき、 Verilog ファイルであることを示す拡張子`.v`を忘れずにつけてください。
|
|
|
|
|
|
`Define Module`というウィンドウが出たら、`Port Name`、`Direction`、`Bus`、`MSB`、`LSB`を設定してモジュールの入出力を決定します。
|
|
|
|
|
|
* `Port Name`は信号線の名前です。トップモジュールなどでは、constraintsファイルで背一定した名前を指定することになります。
|
|
|
* `Direction`は入力か出力かを表します。`inout`は双方向信号に対して使います。
|
|
|
* `Bus`は2bit以上の信号線の場合にチェックをし、Most Significant Bit (MSB: 最上位ビット)とLeast Significant Bit (LSB: 最下位ビット)を指定します。
|
|
|
|
|
|
これらの設定は、ファイル編集でも行えるため、ここですべて設定する必要はありません。
|
|
|
|
|
|
`filetestbench.v`を参考にしながら test bench を記述しましょう。
|
|
|
|
|
|
ここで、FPGA 上のスイッチの上げ下げワンセットの動作で、コインの投入動作を模擬しています。
|
|
|
|
|
|
### シミュレーション
|
|
|
|
|
|
Adder の時と同様にしてシミュレーションを行います。
|
|
|
|
|
|
### FPGA で動かす
|
|
|
|
|
|
シミュレーションがうまくいったら、FPGA に書き込み実際に動かしてみましょう。
|
|
|
スライドスイッチの右端が50円、その隣が100円に対応しています。
|
|
|
出力は LED の右端が光ったら商品、その隣が光ったらおつりが出てきたことを表します。
|
|
|
|
|
|
|
|
|
|
|
|
|