FC2カウンター FPGAの部屋 スパルタン3EスターターキットのLCD表示回路まとめ
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

スパルタン3EスターターキットのLCD表示回路まとめ

スパルタン3EスターターキットのLCD表示回路のまとめをしようと思う。

仕様を書くのを忘れたので書き足します。

1.upper_4hex_data(15 downto 0)を4桁の16進キャラクタでLCDの左上に表示する。
2.lower_4hex_data(15 downto 0)を4桁の16進キャラクタでLCDの左下に表示する。
3.それ以外のLCDの表示はブランクとする。


スパルタン3EスタータキットのLCDは以下のように初期化する。
まずは4ビット(LCDのデータバスは4ビット分のみFPGAに接続されている)インターフェースで以下の図のように書き込む。(s2esk_startup_rev2.pdfより引用)
Spartan3E_LCD_1_060421.png

図1 スパルタン3EスターターキットのLCD初期化シーケンス1

その後、RS=0,RW=0にして8ビットのコマンドを書く。(s2esk_startup_rev2.pdfより引用)
Spartan3E_LCD_2_060421.png

図2 スパルタン3EスターターキットのLCD初期化シーケンス2

そのときに、4ビットインターフェースなので上位、下位と書いて8ビット分とする。(ug230.pdfの50ページより引用)
Spartan3E_LCD_3_060421.png

図3 キャラクタLCDインターフェースのタイミング

これを全部ステートマシンでやると負担が重いので、図3のupper 4bits書いて1us wait、lower 4bits書く、もしくは4-bit write(lower 4bitsのみ)というシーケンスだけステートマシンで実現して、図1、図2の初期化の手順はFPGAにPicoBlazeプロセッサを組み込んで、PicoBlazeに任せることにした。
LCD_StateMachine_060430.png

図4 upper 4bits, lower 4bits書き込み用ステートマシン

図4はupper 4bits, lower 4bits書き込み用ステートマシンだ。(ファイル名LCDOPESM.DIA, LCDOPESM.vhd)この上の階層はLCD_operation.vhdだ。LCD_operation.vhdにはLCDOPESM.vhdとupper 4bitとlower 4bit間の1usを計るタイマーとLCD_Eの出力時間を計るためのタイマーが実装されている。どちらも回路を削減し、動作周波数を改善するため、最上位のビットを使用しているので、ぴったりの値ではない。
LCD4HexDisp.vhdには、PicoBlaze本体(kcpsm3.vhd)、PicoBlazeのプログラム(instrom.vhd)、先ほどのLCD_operation.vhdがインスタンスされている。
加えてPicoBlaze用の入出力ポート用のロジックが実装されている。出力ポートはPicoBlazeのOUTPUT命令の出力をラッチする。入力ポートはPicoBlazeのINPUT命令に対応するために、IO番地に従って入力を選択するためのセレクタである。
LCDからのデータ入力は一旦input_data_latchにラッチしておいてからポート番号0からのINPUT命令によって読み込む仕組みである。(でもこれはテストしていないので、読み込めない可能性がある。データのホールド時間が少ないとだめかもしれない。)
インターバルタイマーは初期化時最初のwaitの15msを8ビットの値で設定できなければならない。12ビットカウンタをかませて8ビット値をセットできるダウンカウンタを作ると183(10進)で約15msになった。
入出力ポートの割り当ては以下の通り。

PicoBlazeの出力ポート仕様
* ポート番号0 : LCD_RWの値(bit0), LCD_RSの値(bit1), 4bit access(bit2), それ以上のビットは空き
* ポート番号1 : 書き込みデータ8ビット。(キャラクタ)読み出しの場合もダミーデータをここに書く。
* ポート番号2 : インターバルタイマー設定値8ビット。50MHzクロックをあらかじめ12ビットのカウンタで分周しているので、1を設定すると82usカウントする。

PicoBlazeの入力ポート仕様
* ポート番号0 : LCDから読み出したデータ8ビット
* ポート番号1 : インターバルタイマー・タイムアウトフラグ(bit0), LCD操作ステートマシン終了信号(bit1), それ以上は空き
* ポート番号2 : 外から入力されたデータを読むポート、upper_4hex_data(15 downto 8)
* ポート番号3 : 外から入力されたデータを読むポート、upper_4hex_data(7 downto 0)
* ポート番号4 : 外から入力されたデータを読むポート、lower_4hex_data(15 downto 8)
* ポート番号5 : 外から入力されたデータを読むポート、lower_4hex_data(7 downto 0)


Test_LCD4HexDisp.vhdはupper_4hex_dataに"1234"、lower_4hex_dataに"5678"を代入しているだけである。

次にinstrom.psmの説明。

; 出力ポート
constant OUT_LCD_CTL_PORT, 00
constant OUT_LCD_WR_DATA_PORT, 01
constant OUT_INTVAL_TIMER_PORT, 02
;
;入力ポート
constant IN_LCD_RD_DATA_PORT, 00
constant IN_INT_TIMER_TO_PORT, 01
constant IN_UPPER_4HEX_1_PORT, 02 ; upper_4hex_data(15 downto 8)
constant IN_UPPER_4HEX_2_PORT, 03 ; upper_4hex_data(7 downto 0)
constant IN_LOWER_4HEX_1_PORT, 04 ; lower_4hex_data(15 downto 8)
constant IN_LOWER_4HEX_2_PORT, 05 ; lower_4hex_data(7 downto 0)

constant ASCII_0, 30
constant ASCII_1, 31
constant ASCII_2, 32
constant ASCII_3, 33
constant ASCII_4, 34
constant ASCII_5, 35
constant ASCII_6, 36
constant ASCII_7, 37
constant ASCII_8, 38
constant ASCII_9, 39
constant ASCII_A, 41
constant ASCII_B, 42
constant ASCII_C, 43
constant ASCII_D, 44
constant ASCII_E, 45
constant ASCII_F, 46

constant LCD_RW_POS, 01
constant LCD_RS_POS, 02
constant INV_RS_VAL, FD
constant ACCESS_4BIT_POS, 04

constant INTVAL_TO_FLAG_POS, 01
constant LCD_SM_END_FLAG_POS, 02

; s0-インターバルタイマーカウンタセット用
; s1-LCD_RS,LCD_RW,4bit access用
; s2-書き込みデータ


この辺は、入出力ポート番号やビットの意味を定義しているところだ。s0-インターバルタイマーカウンタセット用、s1-LCD_RS,LCD_RW,4bit access用(4bit access以外はLCDの制御信号としてLCDにつながっている)、s2-書き込みデータ というように各レジスタを何に使っているか覚えておくと読みやすいと思う。
後はひたすら初期化データを書き込んで、インターバルタイマーに時間をセットし、そのタイムアウトチェックをするという作業を繰り返す。これは図1、図2に書かれている手順で行っている。
初期化が終了すると、upper_4hex_data(15 downto 8)から順番に読んで、4ビットごとに16進数をアスキーキャラクタに変換する。そのアスキーキャラクタをLCDに書き込んでインターバルタイマのタイムアウトを待つ。これをlower_4hex_data(7 downto 0)まで行う。後はそれを繰り返して表示している。

そういえば書き忘れましたが、テストベンチも入っていますのでシミュレーションも出来ます。プロパティからシミュレーション時間を25ms位にすると全部見られると思います。かなり時間がかかりますが。。。wave.doもあるのでインポートすると主要なsignalも見られます。
  1. 2006年05月08日 13:26 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:4

コメント

はじめまして

Spartan3E starter kitのマニュアルに書いてある数字とST7066Uのマニュアルに書いてある数字が異なっているように思えるのですが、こういうことにあまり詳しくないので判断できません。具体的にはFigure5-6の40ns, 230ns, 10nsですが、ST7066Uのマニュアルだと、たぶん0ns, 140ns, 10nsじゃないかと思います。5V駆動のところをみています(p.33)。どちらが正しいと思われますか?
  1. 2006/05/11(木) 00:06:24 |
  2. URL |
  3. Sim #mQop/nM.
  4. [ 編集 ]

はじめまして、コメントありがとうございます。
ST7066Uのマニュアルは見たことなかったのですが、LCD_Eのパルス幅が140nsで、LCD_Eの立下りまでのセットアップ時間が40ns、ホールド時間が10nsのようです。
Spartan3E starter kitのマニュアルよりはだいぶ条件がゆるくなってるようです。データに390オーム入っているので時定数によってデータがなまっているということなのかもしれませんが、よくわかりません。
Spartan3E starter kitのマニュアルに沿ってやっていれば大丈夫なのではないでしょうか?事実動きましたし。
この辺は目で見るのであまり早く動かしてもどうせ見えないし、プロセッサも表示専用でやることそれしかないので問題にはならないと考えています。
#そういえば、初期化シーケンスも違っているみたいですね?どうしてでしょうか?
  1. 2006/05/11(木) 05:19:14 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

さっそくのお答えありがとうございます

やっぱり数字は異なっているのですね。
なるほど、最小の時間なので多い分には平気なわけですか。勉強になります。
starter kitのマニュアルに載っていたHitachi HD44780のデータシートも見てみました。こちらは初期化のシーケンスが3,3,3,2を送ることになっているのでマニュアルと一致しています。また、時間の数字も40ns, 230ns, 10nsで一致していました。憶測ですが、開発時のchipはHD44780で製品版と異なっていたのかもしれませんね。
  1. 2006/05/11(木) 23:02:51 |
  2. URL |
  3. Sim #mQop/nM.
  4. [ 編集 ]

こんにちは。
そうですか、そういうことですか!!情報ありがとうございます。
あまり深く考えないでスタータキットのマニュアルどおりに作ったんですけど。ST7066Uだったら初期化ルーチンも全部ステートマシンでやっても簡単そうですね。直してやってみようかな?
タイミングの件に関しましては、データシートにMAXの値が書いてありませんので、静的動作だと考えられます。よってスイッチでぱちぱち信号を入れても動作すると考えられます。(当然チャタリングは処理しなければいけませんが)ダイナミック動作の物はMINとMAXの値が書いてあるので、その間のタイミングで操作しなければいけません。DDR SDRAMとかそうですね。
  1. 2006/05/12(金) 04:59:03 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/216-416bc088
この記事にトラックバックする(FC2ブログユーザー)