この文書では,教材に備わる4桁の7セグメントのピンアサインと制御方法について説明します.
1:概要
教材に備わる4桁の7セグメントは,各桁ごとに表示したい数値(4[bit])を入力すると,ダイナミック点灯方式で数字の表示をしてくれます.また,表示と非表示を切り替えることができます.
2:ブロック図
下にブロック図を示すとともに,各端子の説明を図の下にある表で示します.
端子名 | 入力/出力 | バス幅 | 説明 |
DIS1_NUM | 入力 | 4 | 教材のDP1と書かれている7セグメントLEDに表示される数字です. |
DIS2_NUM | 入力 | 4 | 教材のDP2と書かれている7セグメントLEDに表示される数字です. |
DIS3_NUM | 入力 | 4 | 教材のDP3と書かれている7セグメントLEDに表示される数字です. |
DIS4_NUM | 入力 | 4 | 教材のDP4と書かれている7セグメントLEDに表示される数字です. |
CLK | 入力 | 1 |
ダイナミック点灯方式で表示させるために使用されるクロック(40[MHz])です. |
IN_CLR | 入力 | 1 | 表示/非表示を切り替えるための端子です.Highだと点灯,Lowだと消灯です. |
DIGIT | 出力 | 4 |
ダイナミック点灯方式では,4個の7セグメントLEDから1個を指定してから, |
PATTERN | 出力 | 8 |
表示したいパターン信号です.同じセグメント(たとえばセグメントA)は |
3:外部回路
下に示す回路図では,DP4に関係するトランジスタと制御ラインを表しています.アノード側にはPNP型トランジスタが取り付けられていますので,ベースをLowにするとアノードに電流が流れます.カソード側にはNPN型トランジスタが取り付けられていますので,ベースをHighにするとカソードからグランドに電流が流れます.
各セグメントは下図のように割り振られています.従いまして,DP4に「1」というパターンを表示する場合には,DPB_BとDPC_BをLow,その他のDPx_BをHighにし,またDP4_BをHighにすればよいのです.
4:ピンアサイン
ピンアサインを下表で示します.この表をもとにISE WebPACKのPinAHeadでピンを割り振ってください.以前説明した7セグメントLEDを制御する回路のピンアサインでは,DIGITになっている4ビットの信号をDP1_B~DP4_Bに,PATTERNになっている8ビットの信号をDPA_B~DPDP_Bに接続すればよいでしょう.
ピン名 | 回路図上の名称 | FPGAのピン番号 | 信号の種類 | ポート名 |
セグメントA | DPA_B | P115 | LVCMOS33 | PATTERN[0] |
セグメントB | DPB_B | P120 | LVCMOS33 | PATTERN[1] |
セグメントC | DPC_B | P123 | LVCMOS33 | PATTERN[2] |
セグメントD | DPD_B | P104 | LVCMOS33 | PATTERN[3] |
セグメントE | DPE_B | P102 | LVCMOS33 | PATTERN[4] |
セグメントF | DPF_B | P112 | LVCMOS33 | PATTERN[5] |
セグメントG | DPG_B | P105 | LVCMOS33 | PATTERN[6] |
セグメントDP | DPDP_B | P126 | LVCMOS33 | PATTERN[7] |
DP1のカソードコモン | DP1_B | P124 | LVCMOS33 | DIGIT[0] |
DP2のカソードコモン | DP2_B | P118 | LVCMOS33 | DIGIT[1] |
DP3のカソードコモン | DP3_B | P116 | LVCMOS33 | DIGIT[2] |
DP4のカソードコモン | DP4_B | P111 | LVCMOS33 | DIGIT[3] |
クロック | CLK | P94 | LVCMOS33 | CLK |
5:内部信号
4桁の7セグメントをダイナミック点灯方式で表示する場合,次に示す内部信号が必要となります.
名称 | reg/wire | ビット幅 | 個数 | 初期値 | 備考 |
PATTERN | reg | 8 | 1 | 8'b1111_1111 | ポート宣言の信号をregにしている. |
ALL_PATTERNS | reg | 8 | 4 | 4個とも8'b1111_1111 | 4桁分のパターン. |
DIGIT | reg | 4 | 1 | 4'b0001 | ポート宣言の信号をregにしている. |
DIVIDED_CLK | wire | 1 | 1 | なし | およそ1.2[kHz]に分周されたクロック. |
DISPLAY_STATUS | reg | 1 | 1 | 1'b0 | 表示の状態.0なら非表示,1なら表示. |
ALL_PATTERNはビット幅8,個数4ですので次のようになります.
reg [7:0]ALL_PATTERNS[3:0];
また,4個とも8'b1111_1111で初期化するには,下記のようにinitial文を使えばよいです.
/* 初期状態では全消灯にしておく */ initial begin ALL_PATTERNS[0] = 8'b1111_1111; ALL_PATTERNS[1] = 8'b1111_1111; ALL_PATTERNS[2] = 8'b1111_1111; ALL_PATTERNS[3] = 8'b1111_1111; end
次にDISPLAY_STATUS信号の役割について説明します.ダイナミック点灯方式では,1桁ずつ表示していくとき表示する値を変えていきます.この値を変えるとき,一時的に全部の7セグメントLEDを非表示にしないと隣接する数字のパターンがうっすらと表示されてしまいます.このため,DIVIDED_CLKが立ち上がりエッジのタイミングでDISPLAY_STATUSをトグル(1'b0なら1'b1,1'b1なら1'b0にすること)し,DIVIDE_CLKが立ち下がりエッジのタイミングでDISPLAY_STATUSが1'b1なら表示する桁をずらしてパターンを表示し,そうでないなら非表示にします.
6:FPGAに作成する回路の構成
ここでは,作成する回路の概略を示します.
- 分周したクロック(およそ1.2[kHz])を得て,DIVIDED_CLKとつなげる.
- 与えられたDIS1_NUMから,パターンを生成する.このとき,4ビットの信号(0x0~0xF)を7セグメントLEDに表示できるパターンに変換するCreatePattern関数を呼び出す.変換するきっかけ(トリガ)はDIS1_NUMであり,これが変化したときにパターンを生成するようにする.
- DIS1_NUMと同様に,与えられたDIS2_NUMから,パターンを生成する.
- DIS1_NUMと同様に,与えられたDIS3_NUMから,パターンを生成する.
- DIS1_NUMと同様に,与えられたDIS4_NUMから,パターンを生成する.
- DIVIDED_CLKの立ち上がりエッジで,表示状態(DISPLAY_STATUS)をトグルする.
- DIVIDED_CLKの立ち下がりエッジで次のことを行う.
- 表示するなら,つまりDISPLAY_STATUSが1で,IN_CLKも1なら次のことを行う.
- 描画する桁(DIGIT)を巡回左シフトする.
- 描画する桁のパターンをPATTERNに設定する.
- 表示しないなら,PATTERNを非表示にする.
- 表示するなら,つまりDISPLAY_STATUSが1で,IN_CLKも1なら次のことを行う.
なお,CreatePattern関数は,引数は4ビットのNUM,戻り値が8ビットです.前に示した7セグメントLEDの内部構造をもとに関数を作成してください.たとえば,NUMが4'b0000であったら,8'b1100_0000;を返せばよいです.同様に,NUMが4'b0001~4'b1111についても変換するようにしてください.