公開日:2024/12/14
title.png

33rd Season


#33-1 SPI-TFTをPMODに繋ぐ(論理設計)

 Cmod A7ボード(FPGA)を使って、オリジナル16ビットCPUコアMoscoviumの開発を進めています。

 Moscoviumで使いたいと思って購入したSPI-TFT表示器(下図、以降単にSPI-TFT)がありました。

a183_spitft.jpg

 しかし一度、Moscoviumに接続してから使っていません。理由は、ちょっと使い難かったから、です。その使い勝手を向上しようと思い、前回、Cmod A7ボードのPMODコネクタに接続するためのアダプタボードを工作しました。

 今回は、MoscoviumでSPI-TFTを制御するための専用I/Oユニットを設計して行きます。

SPI-TFT制御ユニット

 こちらの記事でSPI-TFTをMoscoviumに接続した際には、汎用I/OポートPORT8I8Oユニットと、汎用16ビットタイマTIM162ユニットを使いました。今回は、それらのI/Oポートを、PMODコネクタに繋がったFPGA端子に割り当てる必要があります。
 そこで、汎用のI/Oユニットは使わず、専用のSPI-TFT制御STFT61ユニットを設計して使う事にします。以下図にSTFT61ユニットのブロック図を示し、解説を続けます。

a331_stft61.png

※薄黄色の箱はCPUからアクセス可能なI/Oレジスタです。

  STFT61ユニットブロック図の解説:

 I/Oポート×6本(stft_pioe[5:0])およびPWM出力×1チャンネル(stft_pwmo)と、PMOD端子(pmod_iop[7:0])との対応は、以下表の通りとします。

PMOD端子 対応 STFT61ユニット
pmod_iop[7] stft_pwmo
pmod_iop[6] stft_pioe[5]
pmod_iop[5] stft_pioe[4]
pmod_iop[4] stft_pioe[3]
pmod_iop[3] stft_pioe[2]
pmod_iop[2] × OV7670のpclk制約が掛かっているため、
STFT61ユニットでは割り当てしない。
pmod_iop[1] stft_pioe[1]
pmod_iop[0] stft_pioe[0]

 一部対応が変則的だったり飛んでいるビットが有ったりするので、確認しながら使ってください。FPGAですので、気に入らなければ、各自変更して使う事も可能です。

I/Oレジスタ仕様

 以下表にI/Oレジスタマップを示し、I/Oレジスタ仕様を続けます。

Addr Name R/W Bit:15〜8 Bit:7〜0 Memo
0xf190 stftctl RW PW
ME
PI
NV
POEN[5:0] spi-tft control
0xf192 stftpind R PIND[5:0] port direct input data
stftpset W PSET[5:0] port set output data
0xf194 stftpins R PINS[5:0] port synchronized input data
stftpclr W PCLR[5:0] port clear output data
0xf196 stftduty RW DUTY[7:0] pwm duty
0xf198 reserved
0xf19a reserved
0xf19c reserved
0xf19e reserved

 BUSC出力のセレクト信号はbcs_stft_nです。上表の範囲でアサートされるので、STFT61ユニット内では、アドレスbadr[3:0]を復号してレジスタを特定しています。このI/Oユニットはバイトアクセス禁止です。必ずワードアクセスしてください。

  I/Oレジスタ仕様:

 SPI-TFTの制御に必要な、汎用I/Oポートと1チャンネルのPWM出力タイマだけを、機能を限定して作り込んだので、小規模なI/Oユニットに仕上がりました。

I/Oポート

 以下にI/Oポートのブロック図を示しておきます。

a331_stftport.png

※青色破線は、STFT61ユニットと、最上位モジュールの境界です。

 I/Oレジスタ仕様と合わせて、ご理解の一助としてください。

デザイン

 新規設計したSTFT61ユニットを搭載したマイコンとして、MSOC115TF3208を作成しておきました。特徴は以下の通りです。

 Cmod A7ボード用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。

btn_moscovium.png

 デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。

コンパイル結果

 STFT61ユニットを搭載したMSOC115TF3208を、コンパイル(論理合成・配置配線)してみました。結果は以下の通りです。

  コンパイル結果:

挿したら使える実験

 こちらを参照して、SPI-TFT制御STFT61ユニットを搭載したマイコンMSOC115TF3208をCmod A7ボード(FPGA)に書き込んでください。
 Cmod A7ボード、アダプタボード、SPI-TFTを以下接続表に従って接続して実験します。

Cmod A7ボード 接続 アダプタボード 接続 SPI-TFT
PMODコネクタ ピンヘッダ  
  ピンソケット ピンヘッダ

 わざわざ表にするまでもないほど簡単ですよね?しかも、手間いらず。満足です(1^−^)v。

 以下、実験中の様子を示します。

a331_expr.jpg

 アダプタボードの工作は、そこそこ大変だったけど、十分、労力に見合う優位を享受できそうです。

プログラム

 MoscoviumにSPI-TFTを接続した時に作った、日本語表示プログラムを改定しましたので、以下にリンクしておきます。

  改訂版プログラム:stft_kprint.asm

 当時、汎用のPORT8I8OユニットとTIM162ユニットを使っていたところから、専用のSTFT61ユニットを使った制御へ変更しました。上のリンクからダウンロードしたままだと、旧汎用I/Oユニット版(かつPrimerボード用)ですので、以下の記述箇所を変更後、アセンブルして書き込みしてください。手順については、こちらをご参照ください。

  #asm "mcoc_irom.mif"  // 古いPrimerボード用、コメント
  asm "mcoc_irom.mem"  // Cmod A7ボード用に変更
    :
    : (中略)
    :
  equ use_stft61,1  // stft: stft61 unit; 1=use / 0=not



 上のプログラムを使い、PCからMoscoviumマイコンを制御する、デモ用スクリプトにも改定が必要でした。

  改訂版デモ用スクリプト:fontjp_kpr_demo.olv

※スクリプト(.olv)の実行には拙作Olive+をWindowsにインストールしてください。

 デモ用スクリプトを作成した当時は、まだPrimerボード(FPGA)を使っていた時代で、UART8N1ユニットには1Kバイトと言う巨大なFIFOバッファが搭載されていました。
 Cmod A7ボードに乗り換えた時、自作の小容量FIFOユニットを作成したので、現在のFIFOバッファサイズは64バイトに縮小してあります。

 シリアルモニタにはハードウェアフロウ制御(CTS,RTS)が未対応なため、PCからのデータ送信が速すぎて、64バイトのFIFOバッファでは溢れてしまった様です(バッファオーバフロウ)。そこで、スクリプトでデータを送信する時、適切な時間待ちをして、FIFOバッファがオーバフロウしない様に改定しました。

火入れ

 配線ミスやショートなどが無いことを徹底的に確認した後で、いよいよ、Cmod A7ボードとSPI-TFTを接続し、正常に期待通り動作する事を確認することができました。

 デモ用スクリプトの実行結果に関しては、「#18-5 MoscoviumとSPI-TFT」の実験と同じ内容ですので、以下動画を参照してください。




 工作したアダプタボードの様な治具は、一番最初に使って動作を確認できるまでの、所謂「火入れ」の儀式が一番ドキドキします。STFT61ユニットの様な論理回路は「火入れ」する前に、心行くまでシミュレーションで動作確認できるので、あまりドキドキ感は無かったりします。……個人的な感想です。


btn_arduino.png

btn_prev.png btn_next.png

home