WebエンジニアがFPGAを触ってみて感じたこと

## はじめに
WebエンジニアがFPGAを触ってみて感じたことを書いてみました。
結果的には理解が難しく、思うような習得には至らなかったのですが、その中でもわかったことと、今回の反省を活かして再挑戦する際のロードマップを考えてみたのでまとめることにしました。

## なぜやってみようと思ったか
全く未経験の分野ではあるが、IoTデバイスやエッジAI開発に興味が出てきたのと、エンジニアとして知識の幅を広げる為に、これまで触れてこなかったハードの知見もFPGA学習の中で付けていきたいと思い学習することにしました。

## FPGAとは
[新人エンジニアの赤面ブログ 『FPGA とは？超・初級編』](https://www.macnica.co.jp/business/semiconductor/articles/intel/220/)

>FPGA とは Field Programmable Gate Array の略で直訳すると、「現場で書き換え可能な論理回路の多数配列」となります。
簡単に言うと論理回路設計を間違えても即座にその場でハードウェア言語にて修正ができるデバイスということです。
ちなみに「即座にその場で」できるというのが FPGA の特徴です。

# 学習方法
[FPGAプログラミング大全 Xilinx編 第2版](https://www.amazon.co.jp/FPGA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%A4%A7%E5%85%A8-Xilinx%E7%B7%A8-%E7%AC%AC2%E7%89%88-%E5%B0%8F%E6%9E%97-%E5%84%AA/dp/4798063266/ref=cm_cr_arp_d_product_top?ie=UTF8)で学習を進めることにしました。

こちらの書籍と選択した理由としては以下。
- 実際の開発ソフトを使いながらハンズオンでFPGA開発を学ぶことできる。
- ハンズオン形式での書籍の中では内容が比較的新しく、現在販売されているXilinx製FPGAボードが使える。（FPGA関連の書籍は結構古いものが多く、解説されている開発ソフトのバージョンが現在のバージョンとかけ離れていたり、対象のFPGAボード自体が製造中止で入手できないものも多々ある。）

## 所感
結果的には書籍を一回通すだけでは理解できなかったが、今回の学習を通してわかったこともあるので、これからの学習に活かしていきたい。

#### わかったこと①：FPGAの前にハードの知見が足りない
CPUやコンピュータの関する知識がなかったので、メモリ、レジスタ、アドレス、クロック周波数など普段の開発では使わない知識が必要になり理解に苦しみました。
ハードウェア開発の経験がないエンジニアが挑戦するには、なかなか高いハードルだと感じました。

#### わかったこと②：C言語やHDLの知見が必要
開発言語ももちろん違うので、書籍に記載されているコードが読めずこちらも苦戦しました。
中身のコードまで理解するには、別途C言語や、Verilogの学習が必要になります。

#### わかったこと③：開発PCのスペックが足りない
今回した使用したPCは、メモリ16GB SSD500GBだったが、開発ツール「Vivado」「Vitis」のインストールでハードディスクが200GB弱使用され、元々結構使っていたのもあり他のアプリケーションを消さざる終えませんでした。
本格的に仕事で使用するには、開発ツールを複数のバージョンを同時に持っておく必要もありそうなので、SSD 1TBくらいはあったほうがいいと思います。
「Vivado」「Vitis」の動作が16GBでも動くものの結構重いので、メモリも32GBくらいあると良さそうな感じはしました。（[公式ドキュメント](https://docs.amd.com/r/ja-JP/ug1393-vitis-application-acceleration/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0)でも推奨32GBでした）

## 上記の反省点からロードマップを作成
もう一回書籍を通しても理解が進まないと感じたため、ハードの初歩的なところから学習する必要がある。

### ステップ①：コンピュータやCPUの仕組みを理解する
コンピュータやCPUとは何なのか、どんな仕組みかを把握していないとCPU/GPU/FPGAの違いも理解できないので、まずはCPUについて全体的に理解する必要がある。

参考になりそうな書籍↓
[コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-Noam-Nisan/dp/4873117127?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=Y1PIM9IRIMQW&keywords=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85&qid=1707323812&sprefix=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85,aps,355&sr=8-1&linkCode=sl1&tag=jyouji1979-22&linkId=5324d1e7b03cbb66caf6e4604ac9e527&language=ja_JP&ref_=as_li_ss_tl)
[プロセッサを支える技術 －－果てしなくスピードを追求する世界](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%EF%BC%8D%EF%BC%8D%E6%9E%9C%E3%81%A6%E3%81%97%E3%81%AA%E3%81%8F%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%82%92%E8%BF%BD%E6%B1%82%E3%81%99%E3%82%8B%E4%B8%96%E7%95%8C-WEB-DB-PRESS-plus/dp/4774145211)

### ステップ②：CPUを作ってみる
実際に手を動かしてCPUを作りながら、周辺知識やHDLコードに触れる。
ついでにC言語にも触れて軽くでも読めるようになっておく良さそう。

参考になりそうな書籍↓
[動かしてわかる CPUの作り方10講](https://www.amazon.co.jp/%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B-CPU%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B910%E8%AC%9B-%E4%BA%95%E6%BE%A4-%E8%A3%95%E5%8F%B8/dp/4297108216/ref=asc_df_4297108216/?tag=jpgo-22&linkCode=df0&hvadid=342397001184&hvpos=&hvnetw=g&hvrand=9563098965400824514&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009461&hvtargid=pla-812764217935&psc=1&mcid=cd4f20630f4637c68102f9de19ec239c&th=1&psc=1&tag=&ref=&adgrpid=71767391267&hvpone=&hvptwo=&hvadid=342397001184&hvpos=&hvnetw=g&hvrand=9563098965400824514&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009461&hvtargid=pla-812764217935)

### ステップ④：「FPGAプログラミング大全 Xilinx編」をやってみる
１回目では理解できなかった [FPGAプログラミング大全 Xilinx編 第2版](https://www.amazon.co.jp/FPGA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%A4%A7%E5%85%A8-Xilinx%E7%B7%A8-%E7%AC%AC2%E7%89%88-%E5%B0%8F%E6%9E%97-%E5%84%AA/dp/4798063266/ref=cm_cr_arp_d_product_top?ie=UTF8)の内容をハンズオンで動かしてみる。

ステップ①〜③である程度知識がついて来ているはずなので、最初に触った時と比べて理解できる部分は多くなっているはず。
それと同時にFPGAボードの公式ドキュメントも読んで、ボードの仕様やIOピンの配置など読み取れるように訓練しておく。

### ステップ⑤：作りたいものを作ってみる
結局は自分で作りたいものを決めて、試行錯誤しながら覚えていくのが一番身になるので、何かオリジナルで作ってみる。

環境構築〜アプリケーション実行までの手順はこちらの記事がとても参考になりそうでした。

[ZYBO (Zynq) 初心者ガイド (1) 開発環境の準備](https://qiita.com/iwatake2222/items/966f252f6ca954aff08b)

〜(省略)


[ZYBO (Zynq) 初心者ガイド (18)(完) IoT化してスマホからLチカ](https://qiita.com/iwatake2222/items/e9311292c5078d785699)

## まとめ
まだまだ使いこなせるようになるには長い道のりになりそうですが、今後も他の学習と並行して継続していきたいと思う。
おすすめの学習方法などありましたら、教えていただけますと大変嬉しいです。