Cmod A7ボード(FPGA)を使って、オリジナル16ビットCPUコアMoscoviumの開発を進めています。
Moscoviumで使いたいと思って購入したSPI-TFT表示器(下図、以降単にSPI-TFT)がありました。
しかし一度、Moscoviumに接続してから使っていません。理由は、ちょっと使い難かったから、です。その使い勝手を向上しようと思い、前回、Cmod A7ボードのPMODコネクタに接続するためのアダプタボードを工作しました。
今回は、MoscoviumでSPI-TFTを制御するための専用I/Oユニットを設計して行きます。
こちらの記事でSPI-TFTをMoscoviumに接続した際には、汎用I/OポートPORT8I8Oユニットと、汎用16ビットタイマTIM162ユニットを使いました。今回は、それらのI/Oポートを、PMODコネクタに繋がったFPGA端子に割り当てる必要があります。
そこで、汎用のI/Oユニットは使わず、専用のSPI-TFT制御STFT61ユニットを設計して使う事にします。以下図にSTFT61ユニットのブロック図を示し、解説を続けます。
※薄黄色の箱は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レジスタ仕様を続けます。
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ポートのブロック図を示しておきます。
※青色破線は、STFT61ユニットと、最上位モジュールの境界です。
I/Oレジスタ仕様と合わせて、ご理解の一助としてください。
新規設計したSTFT61ユニットを搭載したマイコンとして、MSOC115TF3208を作成しておきました。特徴は以下の通りです。
Cmod A7ボード用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。
デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。
STFT61ユニットを搭載したMSOC115TF3208を、コンパイル(論理合成・配置配線)してみました。結果は以下の通りです。
コンパイル結果:
こちらを参照して、SPI-TFT制御STFT61ユニットを搭載したマイコンMSOC115TF3208をCmod A7ボード(FPGA)に書き込んでください。
Cmod A7ボード、アダプタボード、SPI-TFTを以下接続表に従って接続して実験します。
Cmod A7ボード | 接続 | アダプタボード | 接続 | SPI-TFT |
PMODコネクタ | ⇔ | ピンヘッダ | ||
ピンソケット | ⇔ | ピンヘッダ |
わざわざ表にするまでもないほど簡単ですよね?しかも、手間いらず。満足です(1^−^)v。
以下、実験中の様子を示します。
アダプタボードの工作は、そこそこ大変だったけど、十分、労力に見合う優位を享受できそうです。
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ユニットの様な論理回路は「火入れ」する前に、心行くまでシミュレーションで動作確認できるので、あまりドキドキ感は無かったりします。……個人的な感想です。