CYC1000でLチカ（＋音源定位）

# 2020/12/20追記： CYC1000を使って音源定位→動画は[こちら](https://youtu.be/Kp-LVF0JFLI)

* 音の鳴っている場所を色で表示
* 複数の音が鳴っている環境でも、それぞれの音源を色で表示できる（下図は左右2箇所）

<img width="400" alt="スライド5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606689/86d45416-9ae0-2945-4616-771f09c7c590.png">

# 本題： はじめに
* FPGA開発ボード[CYC1000](https://www.arrow.com/en/products/cyc1000/arrow-development-tools)について
* 25kLEのIntel Cyclone10搭載

<!--
* 約4300円（2020年3月時点）
-->

* 今回はLチカを例に、基本的な使い方をメモしていきます

<img width="400" alt="IMG5328.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606689/77fe5661-d04f-8a0b-68a1-6354caebe1ee.jpeg">


# 1.　開発環境
* Windows 10  64bit
* [Quartus Prime Lite 19.1](https://www.intel.co.jp/content/www/jp/ja/programmable/downloads/download-center.html)
* [USB Programmer Driver Ver. 2.2](https://www.arrow.com/en/products/cyc1000/arrow-development-tools)


# 2. ピン配置
* ピン配置の一覧表を作りました
* 詳細は[こちら](https://www.arrow.com/~/media/376ac8b27fef451ea4a494971df6ee55.ashx?h=16&thn=1&w=16)を参照

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606689/7215677c-becf-4ef5-553b-71d50465e57a.png)


| Pin Header | Pin No. | Node Name | Bank | Location | 
|:---:|:---:|:---:|:---:|:---:|
| J1 | 1 | GPIO0 <br> AREF[^1] | 4 | P11 |
| J1 | 2 | GPIO1 <br> AIN0 | 4 | R12 |
| J1 | 3 | GPIO2 <br> AIN1 | 4 | T13 |
| J1 | 4 | GPIO3 <br> AIN2 | 4 | R13 |
| J1 | 5 | GPIO4 <br> AIN3 | 4 | T14 |
| J1 | 6 | GPIO5 <br> AIN4 | 4 | P14 |
| J1 | 7 | GPIO6 <br> AIN5 | 4 | R14 |
| J1 | 8 | GPIO7 <br> AIN6 | 4 | T15 |
| J1 | 9 | GPIO8 <br> D0 | 5 | N16 |
| J1 | 10 | GPIO9 <br> D1 | 5 | L15 |
| J1 | 11 | GPIO10 <br> D2 | 5 | L16 |
| J1 | 12 | GPIO11 <br> D3 | 5 | K15 |
| J1 | 13 | GPIO12 <br> D4 | 5 | K16 |
| J1 | 14 | GPIO13 <br> D5 | 5 | J14 |
| J2 | 1 | GPIO14 <br> D6 | 2 | N2 |
| J2 | 2 | GPIO15 <br> D7 | 2 | N1 |
| J2 | 3 | GPIO16 <br> D8 | 2 | P2 |
| J2 | 4 | GPIO17 <br> D9 | 2 | J1 |
| J2 | 5 | GPIO18 <br> D10 | 2 | J2 |
| J2 | 6 | GPIO19 <br> D11 | 2 | K2 |
| J2 | 7 | GPIO20 <br> D12 | 2 | L2 |
| J2 | 8 | GPIO21 <br> D13 | 2 | P1 |
| J2 | 9 | GPIO22 <br> D14 | 2 | R1 |
| J2 | 10 | Reset | - | - |
| J2 | 11 | GND | - | - |
| J2 | 12 | 3.3V | - | - |
| J2 | 13 | VIN <br> (5V supply) | - | - |
| J2 | 14 | 5V | - | - |
| J3 | 1 | GPIO23 <br> AIN | 4 | T12 |
| J3 | 2 | GND | - | - |
| J3 | 3 | GPIO24 <br> AIN7 | 4 | R11 |
| J4 | 1 | GND | - | - |
| J4 | 2 | n.c. | - | - |
| J4 | 3 | TCK | 1 | H3 |
| J4 | 4 | TDO | 1 | J4 |
| J4 | 5 | TDI | 1 | H4 |
| J4 | 6 | TMS | 1 | J5 |
| J6 | 1 | PIO_01 | 6 | F13 |
| J6 | 2 | PIO_02 | 6 | F15 |
| J6 | 3 | PIO_03 | 6 | F16 |
| J6 | 4 | PIO_04 | 6 | D16 |
| J6 | 5 | GND | - | - |
| J6 | 6 | 3.3V | - | - |
| J6 | 7 | PIO_05 | 6 | D15 |
| J6 | 8 | PIO_06 | 6 | C15 |
| J6 | 9 | PIO_07 | 6 | B16 |
| J6 | 10 | PIO_08 | 6 | C16 |
| J6 | 11 | GND | - | - |
| J6 | 12 | 3.3V | - | - |
| - | - | LED1 | 3 | M6 |
| - | - | LED2 | 3 | T4 |
| - | - | LED3 | 3 | T3 |
| - | - | LED4 | 3 | R3 |
| - | - | LED5 | 3 | T2 |
| - | - | LED6 | 3 | R4 |
| - | - | LED7 | 3 | N5 |
| - | - | LED8 | 3 | N3 |
| - | - | USER_BTN <br> (pull-up) | 3 | N6 |
| - | - | CLK <br> (12MHz) | 2 | M2 |

[^1]: AREFはLPFに接続されているので、GPIOとして使う場合は注意
* 2020/03/22：J6ピン配置の誤記修正
* 2020/08/02：[分かりやすい図](https://wiki.trenz-electronic.de/display/PD/TEI0003+Getting+Started)を見つけました
* 2020/08/14：Pin No.順に並び替え、Bankを追記
* 2020/09/15：[分かりやすい図](http://tamagomemo.blogspot.com/2020/05/cyc1000-cyclone10-lp-fpga.html)を見つけました

# 3. サンプルコード
* LED1を1秒毎に点滅させる

```vhdl:main.vhd

library IEEE;
  use IEEE.std_logic_1164.all;
  use IEEE.std_logic_arith.all;
  use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity main is
   Port ( 
	RST_N	: IN std_logic;  
	CLK	: IN std_logic;  
	LED1	: OUT std_logic );
end main ;

architecture RTL of main is
  
signal counter : std_logic_vector(25 downto 0);
signal counter_clr, counter_dec : std_logic;

begin

process( RST_N, CLK )  
begin 
	if( RST_N = '0' ) then
		counter <= (others => '0');
	elsif( CLK'event and CLK = '1' ) then
		if(counter_clr = '1') then
			counter <= (others => '0');
		else 
			counter <= counter + 1;
		end if;
	end if;  
end process;

  counter_clr <= '1' when counter = 11999999 else '0';
  counter_dec <= '1' when counter < 6000000 else '0';
  LED1 <= not counter_dec;

end RTL;
```

# 4.　プロジェクト作成→コンパイル
1. `File` → `New Project Wizard` → プロジェクト名とフォルダを入力
* `Family, Device & Board Settings` → `Family` を `Cyclone 10 LP` , `Name`を `10CL025YU256C8G` に設定
* `Next` → `Finish` を押す
* `Assignment` → `Settings` → `General` → `Top-level entity` にentity名を入力
* `Assignment` → `Pin Planner` でピン配置を設定
* `Processing` → `Start Compilation` でコンパイル

![pinplanner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606689/6c1fbac2-61c3-2572-a2e8-bb95ea64bce0.png)


# 5.　メモリ書込み
1. `Tool` → `Programmer` を開く
* `Hardware Setup` → `Currently selected hardware` を `Arrow-USB-Blaster` に設定して `Close` を押す
* `Change Files` を押して `output_files` 内のsofファイルを選択
* `Program/Configure` にチェックを入れる
* `Start` を押すと書込み


# 6.　不揮発性メモリに書込み（参考）
1. メイン画面で `File` → `Convert Programming Files...` → `Output programming file` を開く
* `Programming file type` を `JTAG Indirect Configuration File (.jic)` に設定
* `Input files to convert` → `Flash Loader` → `Add Device` を開く
* `Device family` を `Cyclone 10 LP` に設定
* `Device name` を `10CL025Y` に設定
* `Input files to convert` → `SOF Data` → `Add File...` を開き、sofファイルを選択
* 最後に `Generate` を押すと、jicファイルが生成される
* Programmer画面で `Change File` を押して、jicファイルを選択
* `EPCS16` を選択し、`Program` と `Verify` にチェックを入れる
* `Start` を押すと書込み

* [こちらのページ](https://ehbtj.com/electronics/memo-de0-nano/)を参考にさせて頂きました

# 参考資料
* [Trenz Electronic Wiki TEI0003](https://wiki.trenz-electronic.de/display/PD/TEI0003+TRM#TEI0003TRM-FPGAI/Obanks)