こんにちは!Latticeチーム新人エンジニアのりょすです。
前回は、温度センサーの動作確認をDigilent社のAnalog Discoveryを使って確認しました。
今回は、SPI通信について概要を調べていきたいと思います。
初めてこのブログを拝見していただいた方にこのブログの概要を少し紹介します。
このブログでは、温度センサー、7セグをFPGAで制御するものを製作する過程を紹介していきます。
(もし興味があったら、下に他の回のリンクを添付するので見ていただけると嬉しいです!)
SPI通信を作るってどういうこと?
いざ、SPI通信を設計しようと思いましたが、そもそも「通信を作る」というのがイメージが湧きません、、、
ある関数を用いて、セットしたいデータだけ記述すればいいの?記述言語ってC言語?Pythonでもできる?と
様々な疑問点とどこから手を付けて良いか分からないため、まず「SPI通信の概念」について調べることにしました。
シリアル通信とパラレル通信
まず、通信についてパラダイス・シリアのような概念を聞いたことがあるので調べてみることにしました。
通信は大まかに「パラレル通信」と「シリアル通信」に分けることができるそうです。(パラダイスって、、、)
パラレル通信とシリアル通信のイメージは下のようになります。

上記図を見てもらえるとわかるかと思いますが、
パラレル通信は名の通りいくつかのデータ線を用意してパラレルにデータを送信する方式となります。
シリアル通信は、1本のデータ線から1 bitずつデータを送信していく方式になります。(イメージはロケット鉛筆?)
パラレル通信はシリアル通信に比べ、一度に送ることができるデータが多いのがメリットになります。
しかし、データを伝送する線が多く必要になりデータの同期をより考慮する必要がある、コストがかかってしまうなどのデメリットもあります。
一方、シリアル通信は、パラレル通信に比べ通信量こそ少なくなってしまいますがデータが順に送られてくることやコスト面に優れています。
SPI通信はシリアル通信方式の一種になります。
SPI通信
SPI通信はシリアル通信ということが分かりました。ということは、線1本のみで通信しているのでしょうか?
送信と受信があるはずで、全てを1本の線でまかなっているのでしょうか?
仮にそうした場合、何処から送信データでどこから受信データなのかどのようにして区別しているのでしょうか?
まだまだ疑問点がたくさんあるため、すぐにSPI通信について調べることにしました。
SPI通信は4本で通信する!
SPI通信を調べてみると、
SPI通信は、マスターとスレーブに分かれる、4本の通信線から構成されるものというのが分かりました。
MISO、MOSI、SCLK、CSの4本の線になります。
以下表に、各線をまとめてみました。
略称 |
名称 |
意味 |
MISO |
Master-In Slave-Out |
FPGA側は入力、センサー側は出力 |
MOSI |
Master-Out Slave-In |
FPGA側は出力、センサー側は入力 |
SCLK |
Slave Clock |
センサーへの入力クロック |
CS |
Chip Select |
この信号 = Low時に通信開始CS = Highで通信停止 |
FPGAがマスター、温度センサーがスレーブとなるとき、FPGAからの温度センサーへコマンドを送る際は MOSIの線を使い
温度センサーからのデータは、MISOを通して送られてくることが分かりました。
また、温度センサーからのデータはFPGAから出力されるSCLKに同期する、CSがLowになっている期間でデータのやり取りが行われることも分かりました。
波形で表現すると以下のようになります。

CS = Lowになった後、SCLKがHigh → Low、Low → Highと動き出します。
SCLKの立ち上がりエッジで、データが真ん中をとらえられるように 1 bitずつデータを送る/受けるようにします。
なるほど、SPI通信の概要はなんとなく理解することができました!
感想として、
波形を一つ一つ追っていくと、理解しやすいなと思いました!
次回はRTL設計に移っていきたいと思います。
では、また次回!See ya!
Lattice FPGA 入門ブログについて
全記事を通して、温度センサーにて取得した温度(SPI通信)を、FPGA内部で変換して7セグLED表示器に表示するモジュールを製作しています!
もし、「この新人君は何を作っているんだろう?」と興味を持っていただいた方がいましたら
ぜひ以下ページより、モジュールの制作過程や全体像をチェックいただけると嬉しいです!