FPGA入門ブログ ~遂に完成! 初心者がSPI通信で温度を7セグに表示してみた~

こんにちは!Latticeチーム新人エンジニアのりょすです。
 
前回は、SPI通信モジュールを作成し実機確認をおこないました。
 
今回は、取得した温度データを7セグLED表示器に表示させるモジュールを作成します。

モジュール作成後、実機で全体の動作確認を行い、完成させたいと思います!
 
初めてこのブログを拝見していただいた方にこのブログの概要を少し紹介します。

このブログでは、温度センサー、7セグをFPGAで制御するものを製作する過程を紹介していきます。

(もし興味があったら、下に他の回のリンクを添付するので見ていただけると嬉しいです!)

どうやってLEDで点灯させる?

前回までにSPI通信を完成させました。いよいよ最後のモジュールの作成をおこないたいと思います。

 

第3回目の記事で作成していた7セグLED基板に、SPI通信で取得した温度データを表示させるモジュールを作ります。

  

ダイナミック点灯を用いて単純に表示させるだけなので、データを垂れ流しするようなモジュールにします!

 

ん?取得した温度データって、そのまま表示できるのでしょうか。。。

 

そんな単純ではなさそうと思ったので、早速調べてみることにしました。

ダイナミック点灯とデコードの機能

調べてみると、

7セグLEDに表示させる仕様の実現として、以下2点の機能が必要なことが分かりました。

 

①ダイナミック点灯機能

→ダイナミック点灯は、桁の切り替えを

 一定周期(人の目では切り替えていると分からない速さ)でおこない

 あたかも複数の桁を同時に点灯しているように点灯させる方法です。

 

②デコード機能

→温度センサーはバイナリー表記の温度データです。

 このバイナリーデータを7セグLED表示器の a~g までの数字と各桁に変換する必要があります。

 

上記2つの機能を活用して、バイナリーデータを数字表記で表示できるようなモジュールを作成します。

RTLとModel Simシミュレーション

機能検討とRTL記述してみた

二つの機能を実現させるようなモジュールを作成します。

  

今回作成するseg_dec.モジュールは、ダイナミック点灯と、デコードを実現するモジュールとなります。

 

 

ダイナミック点灯については、カウンターを用いて一の位と十の位をパタパタと切り替えられるように出力します。

 

デコード機能については、入力された16bitの温度データから整数8bit分を抜き取り

 

7セグLEDの a~g, DPと、整数8bitが対応するようにデコードします。

 

今回アノードコモンのLEDを使用しているため、最後の出力は反転させています。

 

以下にソースコード載せてみたので、興味ありましたら見てもらえると嬉しいです!

 

Model Simでシミュレーションしてみた

RTL記述が終わったので、次はModel Simにてシミュレーションをおこなっていきましょう!

 

Diamondで、テストベンチを作成し、テスト環境として温度データを入れます。

 

 

うん、問題なさそうですね!

 

出力波形を見てみると、桁の遷移と7セグLEDの出力が反転できているのが分かります。(dec_rからの出力の反転)

 

今回はデバッグをしやすくするために、カウンターの回数を少なくしてシミュレーションをおこないました。

 

さぁ、前回までに作成したSPIモジュールとつなげて実機確認をしたいと思います!(ちょっとドキドキ)

 

ついに!すべてのモジュールを繋ぎ合わせて実機確認!


SPI通信モジュールを作成したのもあり、ここまで順調にRTL記述、シミュレーションをおこないました。

 

次にすべてのモジュールを繋ぎ合わせ、FPGAにプログラミングデータを書き込んで実機で動くか確認したいと思います。

 

実機で使用するFPGAは、Lattice社 XO3LF-6900C-5BG256Cが搭載された評価ボードを使用します。

 

3.3v単一駆動、Flash内蔵で使い勝手のいいデバイスとなっています!

  

もし、興味のある方がいましたら以下より XO3LFの特長をご確認ください!

 

全体のモジュール表示、、完成!

RTL設計とシミュレーションは確認できたので、いよいよ実機確認です。

 

TOPモジュールにて、SPI通信モジュールとseg_decモジュールを繋ぎ合わせ、

 

CLKDIV(分周モジュール)とOSCH(内臓オシレータ)を追記します。

 

Synplify Proを単体で立ち上げ、RTLを可視化するとこんな感じ

 

 

Diamond上で、Translate DesignまでProcessをまわしエラーなくコンパイルできたら次にピン配置をおこないます。

 

Diamond SpereadSheetView上で設定します。

 

Port Assignments タブにてピン配置とIO Type、PULLMODEの設定をおこないます。

 

IO TypeはLVCMOS33、PULLMODEはPULLDOWNとします。これは、対向先のデバイスの仕様を見て設定をおこないます。

 

 

ピン配置が終わったら、Export FilesまでProcessをまわし、FPGAへ書き込むプログラミングデータファイルを生成します。

 

FPGAにプログラミングデータファイルを書き込み、

 

以下の写真のように温度センサー、FPGA評価ボード、7セグLED基板を接続します。

 

7セグLED基板に電池を入れて、FPGA評価ボードに電源を入れると、、、

 

それらしい数字が7セグLED上に表示されているのが分かります!

 

室内の温度とほぼ同じ温度となっていたため、上手く温度データから7セグLEDにデコードできていそうです。

 

思っていたよりも地味ですが、一通り完成してとてもうれしいです!!

 

もう少し機能をつけておけばよかったかな、と反省しています(笑) 

 

今回は、7セグLED表示器に表示させるための回路を作成し、

 

前回までに作成したSPI 通信モジュールと組み合わせ完成させました。

 

感想としては、

 

スクラッチから完成までたどり着けたことをとてもうれしく思います!

 

失敗もたくさんしましたが、失敗した分成長することができました。

 

りょすの細道SPI通信モジュール編は最終回となります。

 

いままで継続的に見に来て下さった方々ありがとうございました!

また、テーマを決めて製作する機会があれば更新したいと思います。では、 See ya!

 

Lattice FPGA 入門ブログについて

 

全記事を通して、温度センサーにて取得した温度(SPI通信)を、FPGA内部で変換して7セグLED表示器に表示するモジュールを製作しています!

 

もし、「この新人君は何を作っているんだろう?」と興味を持っていただいた方がいましたら

 

ぜひ以下ページより、モジュールの制作過程や全体像をチェックいただけると嬉しいです!

Diamond Archive Seminarについて

Lattice 設計ツール Diamond が無償で学べるアーカイブセミナーとなります。

 

本アーカイブセミナーでは、Lattice Diamondの基礎的な使い方を紹介します。

 

以下項目ごとに分かれているので、気になった部分だけ視聴することが可能です。

-------------------------------------------

【Diamond Archive Seminar】

1. はじめに

2. プロジェクトの作成

3.  RTLとIP生成

4. 論理シミュレーション

5. 配置配線とタイミング制約/解析

6. プログラミング

7. 内部ノード観測

-------------------------------------------

ぜひ以下ページより、チェックいただけると幸いです!

関連する情報