2011年11月24日木曜日

Spartan 3E Starter Kit のLCDを使う


by yosikawa » 2011年2月27日(日) 02:11
Spartan 3E Starter Kit にはLCDが付いている。
PicoBlazeを使ってLCDを表示する。
簡単に使えるように、モジュール化する。
ただし、入力は未実装で、現在は表示のみ。
ソース及びコンパイル済みのbitファイルを添付する。
 T7_LCD.zip
(113.09 KiB) 



PicoBlaze を用いたLCD表示モジュールの設計

1. 目的

FPGAでLCDを簡単便利に使うためのモジュール。

使用例:
・16ビットの数値を10進数/16進数で表示する。
・1~16ビットのビットパターンを XOXX のように表示する。
・任意の文字を表示する。
・ロータリエンコーダで数値を入力する。
・所定の文字列のメッセージを表示する。(プログラムの修正が必要)


2. 仕組み

入力ポートにコマンドを与えることで、表示する。

例:
always @(posedge clk) begin
case(port_id) begin
8'h00 : in_port <= { 3'd3, 5'd0 }; // 2バイト16進数出力
8'h02 : in_port <= value[7:0]; // 数値
8'h03 : in_port <= value[15:8]; // 数値(上位)

8'h04 : in_port <= { 3'd1, 5'd4 }; // 1文字出力 (位置5桁目)
8'h06 : in_port <= 8'h56; // 文字 'V'

8'h08 : in_port <= { 3'd4, 5'd8 }; // ビットパターン (位置8桁目)
8'h09 : in_port <= { 4'd0, 4'd8 }; // ビット数8ビット
8'h0A : in_port <= bits[7:0]; // 8ビット信号

default : in_port <= 0;
endcase
end


3. コマンド仕様

(1) 概略

入力ポートのうち、連続する4ポートを組とする。
全部で32組、計128ポートを 8'h00~8'h7F に割り当てる。
不要なポートは 0 を出力すればよい。
小さいポートアドレスから順に処理されるため、アドレスの大きい方が優先する。
(例えば 8'h00~8'h03 で表示した内容を、8'h04~8'h07 の表示が上書きする等)
解釈の手順は、先ず32組のコマンドを順に処理し、処理結果は32文字分の内部メモリに反映される。次に32文字分の内部メモリの内容を順に画面に表示していく。約1.4ms で画面全体を更新する。以後繰り返す。

入力ポートアドレスマップ:

nn + 0 : CCCYXXXX (8ビットのビットパターン)
nn + 1 : パラメータ
nn + 2 : 下位バイト
nn + 3 : 上位バイト
(nn は 8'h00~8'h7C の範囲の4バイトごとの値)

CCC : コマンドコード 3'd0~3'd7
Y : 表示位置Y座標。0のとき一行目。1のとき二行目。
XXXX : 表示位置X座標。0~15桁目に表示する。
パラメータの意味はコマンドに依存する。
上位バイト、下位バイトの意味はコマンドに依存する。


(2) 1文字表示コマンド (CCC=3'd1)

nn + 0 : 001YXXXX
nn + 1 : (無視される)
nn + 2 : 表示する文字のASCIIコード
nn + 3 : (無視される)

指定された文字を指定された座標に表示する。


(3) 数値表示 (CCC=3'd2)

nn + 0 010YXXXX
nn + 1 : tbsz0www
nn + 2 : 下位バイト
nn + 3 : 上位バイト

t : 表示形式を指定する。0のとき16進数、10のとき10進数。
b : バイト数を指定する。0のとき2バイト、1のとき1バイト(上位バイトを無視)。
s : 符号の有無を指定する。0のとき符号無し、1のとき符号付き2の補数。
z : ゼロサプレスを指定する。0のときゼロサプレスしない、1のときゼロサプレスする。
www : 表示桁を指定する。0のときは左詰めで表示する。

指定された値を表示する。
符号付きのときはwwwwで指定された桁数のうち1桁は符号表示分に割り当てられる。
指定された桁数で表示できない値のときは "E" を表示する。


(4) 数値入力 (CCC=3'd3) (未実装)

nn + 0 011YXXXX
nn + 1 : tbszdwww
nn + 2 : 下位バイト
nn + 3 : 上位バイト

t : 表示形式を指定する。0のとき16進数、10のとき10進数。
b : バイト数を指定する。0のとき2バイト、1のとき1バイト(上位バイトを無視)。
s : 符号の有無を指定する。0のとき符号無し、1のとき符号付き2の補数。
z : ゼロサプレスを指定する。0のときゼロサプレスしない、1のときゼロサプレスする。
d : BCD形式を指定する。0のとき通常の2進数、1のときBCD形式で入力する。
www : 表示桁を指定する。0のときは左詰めで表示する。

ロータリスイッチなどを使って、16進数の値を入力する。
表示されない桁の値は0になる。
符号付きのときはwwwwで指定された桁数のうち1桁は符号表示分に割り当てられる。
nn+2, nn+3 で指定する16ビット値は、現在の値を表す。
入力された値は同じポート番号の出力ポートに出力される。
外部回路で、出力ポートの値をラッチして入力ポートに戻す必要がある。


(5) 2進数表示 (CCC=3'd4)

nn + 0 : 100YXXXX
nn + 1 : 000pwwww
nn + 2 : 下位バイト
nn + 3 : 上位バイト

wwww : 表示桁を指定する。wwww=0のときは16桁として扱う。
p : 1のとき、4桁ごとにスペースを空ける。0のときは間を空けない。

指定された値を2進数で表示する。
1のビットはXで、0のビットはOで表示する。
lsbから、表示桁で指定されたビット数の値を表示し、残りのビットは無視する。
p=1 のときに間を空けた分の桁はwwwwの桁数に含まれない。


(6) 2進数入力 (CCC=3'd5) (未実装)

nn + 0 : 101YXXXX
nn + 1 : 000pwwww
nn + 2 : 下位バイト (1発設定パターン)
nn + 3 : 上位バイト (1発設定パターン)

wwww : 表示桁を指定する。wwww=0のときは16桁として扱う。
p : 1のとき、4桁ごとにスペースを空ける。0のときは間を空けない。

プッシュスイッチを使って、2進数の値を入力する。
1のビットはXで、0のビットはOで表示する。
p=1 のときに間を空けた分の桁はwwwwの桁数に含まれない。
nn+2, nn+3 で指定する16ビット値は、現在の値を表す。
入力された値は同じポート番号の出力ポートに出力される。
外部回路で、出力ポートの値をラッチして入力ポートに戻す必要がある。


(7) 拡張コマンド (CCC=3'd0)

nn + 0 : 000DDDDD
nn + 1~3 : DDDDDの値に依存する。

CCC=3'd0のときは拡張コマンドとなり、以下の意味を持つ。

(a) NOP (DDDDD=5'd0)

nn + 0 : 00000000
nn + 1~3 : 未使用(無視される)

何もしない。


4. 入力操作 (未実装)

入力コマンドが発行されている間は、数値の入力が可能となる。
以下の入力信号を使って操作する。

input_enable (入力イネーブル): ハイのとき入力可能。ローのときは表示のみ。
input_mode (入力モードスイッチ): ハイのとき入力モード、ローのとき選択モード。
input_cancel (キャンセル): 入力をやめて、元に戻す。
rotary_right (ロータリスイッチ): ロータリスイッチの割り込みがかかった時、右方向ならハイ。
mvfig_left/mvfig_right (桁移動左/右): 入力中のフィールドの入力桁を左右に移動する。
input_b1/input_b0 (2進数入力1/0): 2進数入力のとき、それぞれ1、0を入力する。
(割り込み): ロータリスイッチの左右回転で割り込みをかける。

以下の手順で操作する。

(1) 入力イネーブルをハイにする。
入力モードスイッチをローにして、選択モードにする。

(2) ロータリスイッチを左右に回して、入力欄を選択する。
選択された入力欄が10/16進数のときは最下位の桁にカーソルが表示される。
選択された入力欄が2進数のときは最上位の桁にカーソルが表示される。
入力コマンドが発行されていなければ、カーソルは表示されない。

(3) 入力モードスイッチをハイにして、入力モードにする。

(4) 10/16進数入力のときは、ロータリスイッチを左右に回して数値を入力する。
桁移動左/右で入力桁を移動する。
キャンセルを押すと入力をキャンセルして最初の値に戻す。選択モードになる。
最大値を超えると、最小値に循環する。(逆も同様)

(5) 2進数入力のときは、プッシュスイッチで入力する。
ロータリスイッチ又は桁移動左/右で、入力桁を移動する。
2進数入力1/0で現在の桁の値を変更し、自動的に次の桁に移動する。
キャンセルを押すと入力をキャンセルして最初の値に戻す。選択モードになる。

(6) 入力モードスイッチをローにして選択モードにすると、入力を確定する。
すると、自動的に次の入力欄にカーソルが移動する。
キャンセルによって選択モードになったときは、入力モードスイッチを
一旦ローにしてやり直す。

誤入力を避けるため、入力モードの状態でnn + 0やnn + 1のレジスタの値が変化したときは、キャンセルボタンが押された時と同様に入力はキャンセルされる。


5. ポートマップ

ポートアドレスはアセンブラソースの定数設定で変更できる。以下はデフォルト値。

入力 8'h00~8'h7F LCD入出力コマンド用
入力 8'hF0   LCD入力 (未使用)
入力 8'hF1   スイッチ入力 { input_enable, input_mode, input_cancel, rotary_right, mvfig_left, mvfig_right, input_b1, input_b0 }

出力 8'h02~8'h7F LCD入力コマンドに対応する入力結果を出力する。
出力 8'hF0   LCD出力

割り込み ロータリスイッチが左右に1ステップ回転するごとに割り込みがかかる。

以上

0 件のコメント:

コメントを投稿