MicroBlazeのSDKプロジェクトをSPI Flashに保存する方法

# 概要
BitstreamとMicroBlazeのソフトウェアを外部SPI Flashに書き込んで、
FPGAの電源を入れれば自動的にコンフィギュレーションされるように設定します。
SDKプロジェクトをSPIに書き込む方法はいくつかありますが、恐らくこの方法が一番簡単です。

# 環境
* Vivado 2018.3
* 使用するボード: Digilent Cmod A7-35T (なんでもいいです)

# 1. Vivadoプロジェクトの用意
SPI Flashに書き込みたいVivadoプロジェクトを用意。
今回は、[以前GPIO割り込みをMicroBlazeで実装したプロジェクト](https://qiita.com/s_nkg/items/81a6f8e468fb5584584c)を使って説明をしていきます。(SPIとかIICコアが追加されていますが、無視して大丈夫です。)
予め一度**Generate Bitstream**を実行しておく。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/70f17048-7408-e055-b4eb-be0747072817.png)

# 2. SPI Flashを使う設定
**Open Implementation Design**をクリックし、IMPLEMENTED DESIGN画面を開く
(これを開かないと一部の設定画面が開けない)
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/20d49316-b665-cafe-0b86-ab5370a1486a.png)

PROJECT MANAGERの**Settings**をクリック
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/f7a4e829-9d67-12b7-ca0b-ecba163013be.png)

**-bin_file**にチェックを入れて、Flashに書き込むためのbinファイルを生成する設定に変更
**Configure additional bitstream settings.**をクリック
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/4126aeee-2732-1874-ae15-2ecae48176e2.png)

Generalタブの**Enable Bitstream Compression**を**TRUE**に変更し、生成されるBitstreamを圧縮
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/0b50070e-c87e-4760-e441-99b1efdda574.png)

Configurationタブの**Configuration Rate (MHz)**を**33**に設定 (速すぎる場合は値を小さくしてもよい)
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/652b6232-91df-d734-3ae4-277a00433096.png)

Configuration ModesタブでSPI Flashとの接続方法を選択
今回使用するボードでは**Master SPIx4**で接続されている。
ボードに合わせた設定にする。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/f7d7cfed-ec80-7fc1-d10e-a26b234b8eed.png)

**OK**を押して設定を保存

# 3. 書き込むSDKプロジェクトの選択
GPIO割り込みプロジェクトではSDKプロジェクトも作成し、
`<Vivadoプロジェクトルート>/<Vivadoプロジェクト名>.sdk/<SDKプロジェクト名>/Debug/<SDKプロジェクト名>.elf`
にelfファイルが生成されている。

Vivadoの**Tools -> Assosiate ELF Files...**を選択し、Design Sources側のmicroblaze_0に、**Add Files**で実行したいSDKプロジェクトのelfファイルを追加
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/5ce52fd8-85a3-92c3-96f8-0dd4397721d5.png)
![0085.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/ff340d98-90d3-77bb-c4ee-51b25243e90d.png)
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/83198ab0-b088-1032-9a20-cc2766de7cfb.png)

**Generate Bitstream**を実行
このとき、圧縮されたBitstreamとelfファイルがひとつにまとめられたbinファイルが
`<Vivadoプロジェクトルート>/<Vivadoプロジェクト名>.runs/impl_1/<トップモジュール名>.bin`
に生成されている。

# 4. Flashの書き込み
FPGAボードをPCに接続し、**Open Hardware Manage**でFPGAボードと接続
**FPGAデバイス名で右クリック**し、**Add Configuration Memory Device...**をクリック
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/c5a00cdf-1bd7-eb3f-eaa5-5d20792c4897.png)
FPGAボードに搭載されているSPI Flashの型番を検索し、**OK**をクリック
今回使用するボードでは「n25q32-3.3v-spi-x1_x2_x4」が搭載されていた。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/c84cd472-73e9-e9ad-c682-c3419ec1ed10.png)

SPI Flash名で右クリックし、**Program Configuration Memory Device**をクリック
![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/810be3ed-301d-20ca-e74e-83f636768583.png)

**Configuration file**に生成した**binファイル**を選択し**OK**で書き込む
書き込みが完了したらFPGAボードを切断

# 5. 実行テスト
FPGAボードとUSBでつなぎ、GPIO Interruptのテストプログラムが動作していることが確認できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/bdbb15fb-55d8-2a02-87fb-14eb34f9676b.png)