ずっとFPGA初心者（その１：リスタート）

# FPGA初心者（かつハードウェア素人）が再度トライ
5年前に購入したFPGA評価ボードを長い間ほったからしにしていたのであるが、久しぶりに触ってみたくなので、ついでに記録を残す。

## 評価ボード
すでに販売中止となっている、[Odyssey MAX10 FPGA Eval Kit](https://www.macnica.co.jp/business/semiconductor/macnica_products/boards/121161/)。

## 開発環境
Alteraはずっと前にIntelに買収されていた。[ここ](https://fpgasoftware.intel.com/?edition=lite)から、無料版（Lite）の開発環境一式をDownloadする。（インテルのアカウントが必要だったかもしれない。）
- Quartus Prime (includes Nios II EDS)
- ModelSim-Intel FPGA Edition (includes Starter Edition) 
- MAX 10 FPGA device support 
これらすべてを同じフォルダーにダウンロードしておけば、Quartusインストール時に、ModelSimもMax 10関連ファイルも同時にインストールされる。

## まずは参考サイト
- [マクニカサイト「インテルFPGAではじめてのLチカ！」](https://www.macnica.co.jp/business/semiconductor/articles/intel/113049/)の手順に従って作業を進めた。ただし、ピン情報はこれとは異なるようだ。
- [Impression 製 Odyssey MAX10 評価キットを使ってFPGAをはじめてみる](https://www.hibihogehoge.com/2016/05/impression-odyssey-max10-fpga.html)
- [Odyssey MAX10でLチカ](https://jiwashin.blogspot.com/2016/05/config-odyssey-max10-with-quartus-prime-on-ubuntu-on-mac.html)

## プロジェクト作成
Quartusを起動。New Project Wizardを用いる。
![NewProjectWizard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7c75c4d4-c506-690e-3678-0210da01ccf0.png)
プロジェクト名などを入れ、Empty Projectとする。
![NewProjextWizard2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5cd169b7-3d32-9dbd-1660-f35a186d00dd.png)
![NewProjextWizard3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d0ab9fc8-6b83-c2b2-0e28-e794c5c3b65b.png)
Add Filesでは何もせずスキップ。
![NewProjextWizard4Skip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/eebb1c33-86a7-8f10-82a2-83e1c434dd48.png)
Odyssey Max10ボードを選択。
![NewProjextWizard5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a51dc7cd-669f-189b-fcaa-700ac74102cb.png)
EDA Tool Settingsはとりあえず後回し（スキップ）。
![NewProjextWizard6Skip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/717b36c9-9147-0aea-0da9-90b28afa8c0d.png)
作成したプロジェクトのサマリが表示され、プロジェクト作成完了。
![NewProjextWizard7Summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/78f774b3-d560-ae7f-5dc7-fae514da6225.png)

## VHDLファイル
ボード上の２つのボタンを押したらLEDが点灯、、を実現する。「File」-「New」で「VHDL File」を選択。
![FileNewDesignFile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/4c6743d8-4484-8bb8-6abc-9ddf95ae55f2.png)

```vhdl:btn_led.vhd
library ieee;
use ieee.std_logic_1164.all;

entity btn_led is
 port (
   BUTTON0, BUTTON1:	in std_logic;
   LED0, LED2: 		out std_logic);
end btn_led;

architecture rtl of btn_led is 
begin
   LED0 <= BUTTON0 or BUTTON1;
   LED2 <= BUTTON0 and BUTTON1;
end rtl;
```
btn_led.vhdとして保存する。記述ミスなどのチェック（Start Analysis & Elaboration）を実施。
![Start Analysis & Elaboration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b4cc81cc-a978-c392-569c-1bcf50f27d2b.png)
問題がなければ、次のように表示される。
![Start Analysis & Elaboration Result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/8a6b25f4-b1c3-5866-b9aa-4ff37aa55bc8.png)

## 論理シミュレーション
[これ](https://www.macnica.co.jp/business/semiconductor/articles/id113049_testbench.vhd)を参考に、次のテストベンチファイルをつくる。

```vhdl:testsim.vhd
library ieee;
use ieee.std_logic_1164.all;

entity testsim is
end testsim;

architecture sim of testsim is 
  constant t : time := 1 ns;
  signal BUTTON0, BUTTON1, LED0, LED2 : std_logic;

  component btn_led
    port (BUTTON0, BUTTON1 : in std_logic;
          LED0, LED2	   : out std_logic );
  end component;

  begin
    u1 : btn_led
      port map (BUTTON0 => BUTTON0, BUTTON1 => BUTTON1,	LED0 => LED0, LED2 => LED2);
  push : process begin
    BUTTON0 <= '0'; BUTTON1 <= '0'; wait for t * 100;
    BUTTON0 <= '1'; BUTTON1 <= '0'; wait for t * 200;
    BUTTON0 <= '0'; BUTTON1 <= '1'; wait for t * 300;
    BUTTON0 <= '1'; BUTTON1 <= '1'; wait for t * 400;
    BUTTON0 <= '0'; BUTTON1 <= '0'; wait;
  end process push;
end sim;
```
Settingでシミュレーションの設定を行う。ModelSim-Alteraを選択し、Test Benchesをクリック。
![EDASimulation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/61c168d5-28bc-8cf2-0747-e662c1c5ba7f.png)
![testbench.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/28c7220d-7501-ecab-93c4-ca53c7918e04.png)
さきほどのテストベンチファイルを指定、1500ns動作させる。
![testbenchsetting11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/260516d2-d499-7c6d-42e1-5bade21131c8.png)

### シミュレーション開始
RTL Simulationをクリック。
![RTLSimulation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/681dfd66-6f6d-e84e-35f9-6ea58e134ce6.png)
すると、ModelSimが起動し、
![ModelSimResult.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/10b72da0-4087-72b7-f6e6-2568d2c8131f.png)
のような結果が得られる。

## ボードにプログラミング
### Pin Plannerを使ってピンアサイン
![AssignPinPlanner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/12d66e92-cd0a-7cc0-ff34-4b01ed159334.png)
[Odyssey MAX10の回路図](https://www.macnica.co.jp/business/semiconductor/macnica_products/max10_board_revb1p04__1.pdf)によると、LED0はL13、LED2はK12、ボタン0はK13、ボタン1はJ12にアサインされている。たとえば、回路図には
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/83913b11-a215-b2bd-1fb9-832d33aa6ccd.png", width=50%>
のような記載が見つかる。

![PinPlanner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/3a351bc1-d7c9-ad7c-fbef-f8a92cba9378.png)
のようにアサイン。上述した参考サイトに従って、I/O Standardは1.5Vにした（詳細不明）。

### コンフィグレーション
参考サイトに従って、「Single Compressed Image」を選択（「Assignments」->「Device」->「Device and Options」->「Configuration」->「Configuration mode」）。
![DevicePinOption.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f61554f7-c607-9a85-7de2-13295228d958.png)
![SingleCompressedImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d1ca90c7-7e00-3c91-ec7b-764a462c7975.png)

### コンパイル
![StartCompilation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e9693204-99e2-970d-3b0b-2eb068a0ee64.png)
終了後のメッセージは次のようなもの。
![CompileSuccess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d7df4a7f-4f91-613e-8d02-0cae3896bc8d.png)

### ボードにプログラム転送
USB Blasterの互換品利用。Programmerをクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f7dad65f-be7f-3cd3-22bb-0fd4d4313d02.jpeg", width=50%>

![ToolsProgrammer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f5b10a8a-390b-40b3-a307-6e6a7e221721.png)

Startをクリックして転送する。
![SofProgramSuccess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/40c1a5d1-97e4-978f-820a-ceca22ed9175.png)

sofファイルはRAMでの動作用、pofファイルはボードの不揮発性領域に書き込んで使用するもの。pofファイルを、Add Filesで選択した場合は、次のように表示される。
![pofファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/45cdeedb-3d86-59b2-ccd5-762c04b77b10.png)

## 実験
押して確認するのみ。完了。