ARMによるカラーLCDでの簡単なテキスト/グラフィックの効率的な表示


12

カラーLCDにシンプルなグラフィックスを表示するARMベースのデバイスを設計するとき、できれば特定のARMまたはLCDベンダーに縛られることなく、高速更新を可能にするものをどのように設計するのが最善でしょうか?私の現在のプロジェクトでは、PICのSPIポートによって電光石火で高速駆動できる白黒ディスプレイを使用しています(1/60秒で複雑なディスプレイを再描画)。一般的なカラーLCDディスプレイにはSPIポートがあるように見えますが、160x120 LCDを無地で塗りつぶすのに30msかかり、320x240に120msのベストケース(10MHzシフトクロック)がかかります。

コントローラーのピンを空けることができれば、パラレルモードの方が良いかもしれませんが、各ピクセルに3つのメモリストア命令(データを設定するための1つ、 1つはクロック出力を高く設定し、もう1つはクロック出力を低く設定します)。一部のARMチップにはメモリバスインターフェイスがありますが、多くの場合、アドレスとデータの多重化、または無関係なアドレスビットの出力に多くのピンを使用します(LCDには1つのアドレスビットが必要です)。

ILITEKのILI9320またはRenesasのHD66789を見ると、CPLDを使用してSPIをパラレルデータに変換し、ビット/ピクセルを出力するモードを含めることは興味深いと思われるアプローチの1つです。ルネサスのデータシートを見ると、すべてのパラレルポートデータビットがシリアルデータピンを追跡し、ピクセル以外のすべてにシリアルモードを使用することにより、最小限のハードウェアでピクセルごとの書き込みを取得できる可能性があります(CPLDは不要)書き込み、比較/マスク関数を使用して、すべてゼロのピクセルが透明になり、すべて1のピクセルがGRAMの選択されたビットを設定するか、すべて1のピクセルが透明になり、すべてゼロのピクセルが選択されたビットをクリアします。IKITEKデータシートの「機能」セクションは、同様の機能を備えていることを示していますが、レジスタマップにはありません。

コードが主に単色のテキストとグラフィックスを表示すると仮定すると、理想的なアプローチは、CPLDを使用してARMのSPIポートをディスプレイのパラレルポートに接続し、CPLDに前景色/背景色をロードできるようにすることです。これは、「透明」ピクセルを書き込む手段があれば特に便利です。フォントを2色のビットマップとして指定すると、フォントデータをSPIポートに直接ロードできます。これにより、2つのARMクロックごとに1ピクセルの割合でフォントデータを表示できます。一方、このような表示制御タスクを処理するのに十分なCPLDのコストは約2ドルです。

主に単色のテキストまたは単純な(16色または64色など)グラフィックを表示することが目的である場合、ARMとカラーLCDを接続する最良の方法は何ですか?

編集

キャラクターモードLCD、独自のドライブ方式を使用したカスタム3:1多重化セグメントベース、コントローラー内蔵の白黒グラフィックLCD、白黒マイクロコントローラの汎用DMA(4レベルのグレースケールを提供)とインターフェイスするためのCPLDベースのコントローラを独自に設計した白色LCD。私はディスプレイをジッピーにすることに誇りを持っています。グラフィックコントローラーの1つは、一定のデータを書き込む場合でも、全画面更新に約1/10秒を必要とするちょっとした犬でしたが、ほとんどのディスプレイでは、1/50秒未満でかなり複雑な画像をレンダリングできます。

私がやるプロジェクトの多くはバッテリー駆動であるため、消費電流が問題になります。私がやったDMAベースのディスプレイコントローラーはうまくいきましたが、それはライン駆動のプロジェクト用でした。グラフィックLCDから妥当な電流を引き出す唯一の方法は、ディスプレイバッファーと列ドライバーを組み合わせたコントローラーを使用することだと思います。チップ間で多くのディスプレイをフレームごとに送信すると、1ビットあたり1ビットのディスプレイでも多くのエネルギーが無駄になります。ピクセルあたり16ビットのカラーディスプレイでは、さらに悪化します。

私はカラーLCDのデータシートを見始めたばかりです。多くのディスプレイはILITEK ILI9320に似たコントローラーを使用しているように見えますが、その一般的な設計に基づいたコントローラー用のデータシートはすべて「予備」とマークされています。ILITEKのようなものの中には、マスキングと透過性の機能があると主張するものもありますが、それらのレジスタはリストしません。実際のチップにそのような機能があるが、「予備の」データシートにそれらの機能が含まれていないのか、機能を省いて言及するのを忘れたのかはわかりません。実際にそのようなすべてのチップに透過機能がある場合、それらのために設計することは理にかなっているようです; そうでない場合、そうではありません。

ほとんどのプロジェクトでは、通常の画面は中程度の数の任意サイズの単色フォントで任意に配置されたテキストで構成されると予想されます。フォントは、おそらくピクセルごとのビットデータとして保存されます。Cortex-M3を使用して、並列データでディスプレイを作成する場合、2つのピクセルを書き込むコードの「内部ループ」は、おそらく次のようになります。

  rol r0、r0、#2; Cで1ビット、Nでもう1ビットを取得
  itcs
  strhcs r1、[r3、#DATA_OFS]; データを書き込む
  strhcc r2、[r3、#DATA_OFS]; データを書き込む
  strb r4、[r3、#CLOCK_SET_OFS]; クロックを高く設定する
  strb r4、[r3、#CLOCK_CLR_OFS]; クロックを低く設定
  itmi
  strhmi r1、[r3、#DATA_OFS]; データを書き込む
  strhpl r2、[r3、#DATA_OFS]; データを書き込む
  strb r4、[r3、#CLOCK_SET_OFS]; クロックを高く設定する
  strb r4、[r3、#CLOCK_CLR_OFS]; クロックを低く設定

まさに世界最速というわけではありません。クロック設定/クリア命令への書き込みを削除すると役立ちます。私の推測では、両方のクロック書き込みを排除する素晴らしいアーキテクチャに依存しない方法はありませんが、1つを排除することを可能にするかなり一般的な方法があるかもしれません単一のメモリストア操作に応じて短時間)。

SPIポートを使用し、ビットあたり1ピクセルをクロックするハードウェアを追加すると、ディスプレイアクセスが大幅に高速化されます。マスクと透明度なしでディスプレイを使用する場合、CPLDはアドレスカウンターを含める必要があり、各ピクセルに対してピクセルデータのワードをクロックするか、次のピクセルの位置のアドレス設定コマンド(カウンターが必要) )。対照的に、ディスプレイにマスキングと透明度がある場合、CPLDに16ビットでクロックを供給した後、追加ビットごとに1ワードのデータをディスプレイに出力するモードをサポートする必要がありますLSBはSDIピンを追跡します(CPLDを使用する必要はないかもしれません-ほんの数個の通常のロジックチップ)。透明度の色を、LSBを反転させて書きたい色に設定します。

マスキングと透明度に依存する美しいデザインを思いつき、そのような機能を備えたディスプレイのみが30週間のリードタイムを持っていることを発見したくありません。一方、そのようなディスプレイが多くのベンダーから入手可能であり、広く利用されている場合は、可用性についての妄想に劣ったデザインを使用させられたくありません。


1
要件には特定のARMベンダーに縛られていないことが含まれますが、マイクロコントローラーのLPC LH754xxファミリーには統合LCDドライバーが含まれているため、答えではありません。
ケビンフェルメール

@reemrevnivek:小さなLCDドライバーを備えたARMチップが多数あります。チップオングラスシナリオ以外で使用できるパッケージに表示される有用なサイズのグラフィックディスプレイに適したドライバーを搭載したチップを想像することはできません。チップにはコントローラーが搭載されている場合がありますが、チップオングラスコントローラーを搭載したLCDの方が電力効率が高く、操作が簡単です。あなたが言及したチップをチェックしますが、興味深いかもしれません。
スーパーキャット

@supercat-ピクセルクロック、フレーム同期、ライン同期制御ライン、パラレルピクセルデータバスを備えたRGBインターフェイスを備えたLCDを考えています。COG制御ディスプレイを使用する予定ですか?
ケビンフェルメール

1
@reemrevnivek:それは私が考えていたものです。彼らは携帯電話のような多くの携帯バッテリー駆動デバイスで使用されているので、彼らはかなり一般的であるように見えます。コントローラーが組み込まれたCOGディスプレイは、連続的にクロックされるRGBデータを必要とするディスプレイよりもはるかに電力効率が高くなります。
-supercat

@reemrevnivek:質問をより詳細に更新しました。
スーパーキャット

回答:


7

マイクロコントローラを使用してLCDを駆動する場合の問題は、LCDが常に注意を必要とすることです。これはSPI上で駆動されるCPLD(もちろんDMAを使用)で緩和できますが、その後、別の問題が発生します。カラーLCDには多くのことが必要ですデータの。白黒の320x240は9.6KBでわずかですが、24ビットカラーにすると、突然1/60秒で230KBのデータを配信する必要があります。(ただし、下位20ビットを1つの設定に関連付けるだけで、4ビット、16色のコントロールを取得できることを忘れないでください)。24ビットフレームバッファーは、ほとんどのマイクロコントローラーのオンボードRAMに収まりません。おそらく、外部RAMチップからの読み取り、データの出力、およびその他の処理を行う時間がないでしょう。CPLD(またはFPGA)とRAMチップを使用してこれを行おうとすると、2ドルの価格をはるかに超えて、疑問に陥ります。

マイクロコントローラーとカラーLCDを接続する従来のソリューションは、SSD1963のようなディスプレイコントローラーです。これは非常に単純なブロック図です。

MCUからRAMへのバッファとレジスタ、そしてそこからLCDインターフェースへ

レジスタ設定可能なパラレルLCDインターフェースとインターフェースされた大きなRAMフレームバッファー(翻訳:2ドル以上)へのパラレル入力。パラレル入力は通常、メモリバスインターフェイスと互換性があります。

カラーLCD市場は、ウェブ上で常に簡単に見つけることができるとは限らず、通常はOEMのみのドメインであり、残りはコントローラーとディスプレイを統合している企業からディスプレイを購入しています。私が見つけた最高のリソースは、Crystal Fontz、特にグラフィックLCDの選択に関するこのページです。次のオプションを含むコントローラーの一番下までスクロールします(注:すべてがカラーコントローラーではない)。

  • Epson S1D13521B01 Eインクブロードシート(​​1モジュール)
  • Epson S1D13700(11モジュール)
  • Epson SED1520互換(8モジュール)
  • Himax HX8345互換(1モジュール)
  • ILITek ILI9325互換(3モジュール)
  • KS0107 / KS0108互換(26モジュール)
  • Novatek NT7534(14モジュール)
  • Orise Technology OTM2201A(1モジュール)
  • Orise Technology SPFD5420A(1モジュール)
  • RAiO RA8835(1モジュール)
  • Sanyo LC7981(13モジュール)
  • Sino Wealth SH1101A(2モジュール)
  • Sitronix ST7920(29モジュール)
  • Solomon SSD1303(1モジュール)
  • Solomon SSD1305(9モジュール)
  • ソロモンSSD1325(2モジュール)
  • ソロモンSSD1332(1モジュール)
  • ソロモンSSD2119(2モジュール)
  • ST STV8105(1モジュール)
  • Toshiba T6963(23モジュール)

@reemrevnivek:コントローラーを内蔵したカラーLCDを考えていました。それらはかなり一般的なように見えますが、一般的な表示シナリオが単色のテキストの表示であっても、私が見たものは一般にCPUがピクセルあたり多くのビットでクロックすることを期待しているようです。CPLDを使用してDMAベースの4レベルグレースケールLCDコントローラーを実装しましたが、非常にうまく機能しましたが、それはライン駆動のデバイスでした。
-supercat

1
@supercat- CPUが各フレームでピクセルあたり多くのビットをクロックすることを期待するLCDコントローラーはほとんどありません。彼らは通常、専用のグラフィックスハードウェアがこれを行うことを期待しています。基本的に、かなり大きい(つまり> 128 * 128)RGBディスプレイに到達すると、画面の画像を生成するのに必要な処理能力が十分に大きくなり、ある種の専用GPUが(MCUに統合されている場合でも)ほとんど常に存在します。
コナーウルフ

1
@supercat-ただし、ASCIIからラスターへの変換を行う特殊なCPLDは、基本的に(カスタム)特殊なグラフィックスハードウェアです。基本的には、車輪を再発明しないでください。ビデオインターフェイスが組み込まれたMCUを購入し、自分で設計する方が簡単で費用効率が高いと思います。
コナーウルフ

1
とにかく、もしあなたが本当に自分でロールバックしたいなら、私はいくつかのデュアルポートSRAM ICを使用し、LCDへの出力用に1つのポートを使用し、MCU用にもう1つを使用すると言います。これにより、MCUは必要な速度でメモリの内容を変更でき、LCDはそのリフレッシュレートで実行できます。
コナーウルフ

1
@Fake Name:ASCIIからラスターへの変換ではありません。基本的には、ピクセルごとのビットからピクセルごとのビットへの変換です。あなたは私が見ているものを誤解していると思います。私はドライバーのみを備えたディスプレイを探していませんが、ドライバーとコントローラーを含むディスプレイを探しているので、画面上のものが変更されたときにのみデータを供給する必要があります。
スーパーキャット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.