アフィリエイト広告
アフィリエイト広告

7セグメントLEDデコーダ TC4511 の表示フォントを変更する

7セグメントLEDデコーダ TC4511 が出力する表示フォントを変更する組み合わせ回路を作りました。

TC4511 が表示する数値のうち「6」「7」「9」のフォントが嫌いだという記事を、たまに目にします。で、違うデコーダを探しても、なんか TTL タイプしかないとか。よくわからんですけど。
まぁ俺はあまり気にしていないんだけど、気に入らなかったら、フォントを変更する回路を考えりゃいいじゃん、と思ったわけで。

表示フォントの変更点

図1 は、TC4511 のデータシートに載っている表示フォントの図。そしてこれを、図2 のように変更しようと思います。うーん、こうして並べてみると、やっぱり図2 のほうがしっくりくるんかなぁ。

図1. TC4511 の表示フォント

図2. 変更した表示フォント

変更する点は、「6」のセグメント a、「7」のセグメント f、「9」のセグメント d を、それぞれ点灯させること。それを、組み合わせ回路で実現します。

真理値表

TC4511 は、16進データを入力すると、それに応じた 7セグメントLED のビットデータを出力します。基本的な制御はそれにまかせて、組み合わせ回路で、必要なセグメントを追加点灯させるようにしましょう。

図3. 表示フォント変更の真理値表

そのために作った真理値表が、図3 です。

TC4511 が 1 を出力しているセグメントに対しては、組み合わせ回路からの出力は 1 でも 0 でもかまいません。したがって、データシートで出力が 1 の部分は don’t care でよいです。

組み合わせ回路では、「6」のセグメント a、「7」のセグメント f、「9」のセグメント d を 1 にします。

前に作ったダイナミック点灯の回路 (過去記事) に追加する予定ですので、ブランキングのための BI 信号も入力することにします。BI が 0 のときは、表示を消し、ゴーストを抑止すると同時に、輝度調整を可能にしています。

論理式

真理値表から求めた論理式は、下記のとおりです。

a = BID ⋅ B
d = BI ⋅ D ⋅ CB
f = BID ⋅ C ⋅ B = a ⋅ C

カルノー図は省略します。入力が 5要素ありますが、BI=0 の場合はすべて 0 ですので、考える必要ないですね。すべての式に、BI を AND するだけです。

VerilogHDL によるシミュレーション

求めた論理式で、期待した効果が得られるかどうか、簡単にシミュレーションしておきましょう。

回路記述

デコーダの出力と、組み合わせ回路の出力との論理和 (OR) をとります。その値が、期待したようなビットデータになるかどうかを、検証します。

  1. module SSLED_FONT_CHANGE (
  2.   input wire [3:0] INPUT_BCD,
  3.   input wire BLANK,
  4.   output wire [6:0] SEGMENT_CODE,
  5.   output wire [6:0] SEGMENT_CHANGED
  6. );
  7.   wire [6:0] CHANGE_CODE;
  8.   function [6:0] DECODE(
  9.     input [3:0] BCD
  10.   );
  11.     begin
  12.       case (BCD)
  13.         4'd0: DECODE = 7'b1111110;
  14.         4'd1: DECODE = 7'b0110000;
  15.         4'd2: DECODE = 7'b1101101;
  16.         4'd3: DECODE = 7'b1111001;
  17.         4'd4: DECODE = 7'b0110011;
  18.         4'd5: DECODE = 7'b1011011;
  19.         4'd6: DECODE = 7'b0011111;
  20.         4'd7: DECODE = 7'b1110000;
  21.         4'd8: DECODE = 7'b1111111;
  22.         4'd9: DECODE = 7'b1110011;
  23.         default: DECODE = 7'b000_0000;
  24.       endcase
  25.     end
  26.   endfunction
  27.   assign CHANGE_CODE[6] = BLANK & ~INPUT_BCD[3] & INPUT_BCD[1];
  28.   assign CHANGE_CODE[5] = 1'b0;
  29.   assign CHANGE_CODE[4] = 1'b0;
  30.   assign CHANGE_CODE[3] = BLANK & INPUT_BCD[3] & ~INPUT_BCD[2] & ~INPUT_BCD[1];
  31.   assign CHANGE_CODE[2] = 1'b0;
  32.   assign CHANGE_CODE[1] = BLANK & ~INPUT_BCD[3] & INPUT_BCD[2] & INPUT_BCD[1];
  33.   assign CHANGE_CODE[0] = 1'b0;
  34.   assign SEGMENT_CODE = DECODE(INPUT_BCD);
  35.   assign SEGMENT_CHANGED = DECODE(INPUT_BCD) | CHANGE_CODE;
  36. endmodule

38行目がデコーダの出力。39行目で、デコーダの出力と組み合わせ回路の出力とを OR しています。

テストベンチ

  1. module SSLED_FONT_CHANGE_TEST;
  2. reg [3:0] INPUT_BCD;
  3. reg BLANK;
  4. wire [6:0] SEGMENT_CODE;
  5. wire [6:0] SEGMENT_CHANGED;
  6. parameter STEP = 10;
  7. SSLED_FONT_CHANGE SFC0(INPUT_BCD, BLANK, SEGMENT_CODE, SEGMENT_CHANGED);
  8. initial begin
  9.   BLANK = 0;
  10.           INPUT_BCD = 4'd0;
  11.     #STEP INPUT_BCD = 4'd1;
  12.     #STEP INPUT_BCD = 4'd2;
  13.     #STEP INPUT_BCD = 4'd3;
  14.     #STEP INPUT_BCD = 4'd4;
  15.     #STEP INPUT_BCD = 4'd5;
  16.     #STEP INPUT_BCD = 4'd6;
  17.     #STEP INPUT_BCD = 4'd7;
  18.     #STEP INPUT_BCD = 4'd8;
  19.     #STEP INPUT_BCD = 4'd9;
  20.     #STEP INPUT_BCD = 4'd10;
  21.     #STEP INPUT_BCD = 4'd11;
  22.     #STEP INPUT_BCD = 4'd12;
  23.     #STEP INPUT_BCD = 4'd13;
  24.     #STEP INPUT_BCD = 4'd14;
  25.     #STEP INPUT_BCD = 4'd15;
  26.     #STEP
  27.   BLANK = 1;
  28.           INPUT_BCD = 4'd0;
  29.     #STEP INPUT_BCD = 4'd1;
  30.     #STEP INPUT_BCD = 4'd2;
  31.     #STEP INPUT_BCD = 4'd3;
  32.     #STEP INPUT_BCD = 4'd4;
  33.     #STEP INPUT_BCD = 4'd5;
  34.     #STEP INPUT_BCD = 4'd6;
  35.     #STEP INPUT_BCD = 4'd7;
  36.     #STEP INPUT_BCD = 4'd8;
  37.     #STEP INPUT_BCD = 4'd9;
  38.     #STEP INPUT_BCD = 4'd10;
  39.     #STEP INPUT_BCD = 4'd11;
  40.     #STEP INPUT_BCD = 4'd12;
  41.     #STEP INPUT_BCD = 4'd13;
  42.     #STEP INPUT_BCD = 4'd14;
  43.     #STEP INPUT_BCD = 4'd15;
  44.   #STEP $finish;
  45. end
  46. initial begin
  47.   $dumpfile("ssled_fontChange.vcd");
  48.   $dumpvars(0, SSLED_FONT_CHANGE_TEST);
  49. end
  50. endmodule

BLANK (BI) が 0 のとき、1 のとき、それぞれのときのセグメントのビットデータを出力し、比較します。

シミュレーション結果

SEGMENT_CODE はデコーダの出力データです。これに、組み合わせ回路の出力 CHANGE_CODE を OR すると、SEGMENT_CHANGED になります。

図4. 組み合わせ回路の出力シミュレーション結果

BLANK=0 のとき、SEGMANT_CHANGED は SEGMENT_CODE と同じです。
BLANK=1 のときに、6、7、9 の出力が変化しています。6 では 0x1F が 0x5F に変化したので、セグメント a (bit7) が 1 になったということです。7 は 0x70 → 0x72 なのでセグメント f (bit1) が、9 は 0x73 → 0x7B なのでセグメント d (bit3) が、それぞれ 1 になっています。

組み合わせ回路の論理式から、期待した結果が得られることが確認できました。

回路図

前に作ったダイナミック点灯の回路 (過去記事) の、TC4511 から 7セグメントLED の間に、今回作る組み合わせ回路を入れます。

図5. 表示フォントの変更組み合わせ回路図

入力データは、デコーダと組み合わせ回路の両方へ入ります。デコーダからは通常のビットデータが、組み合わせ回路からはフォントの変更データが出力されるので、両方を OR することで、表示フォントが変更されます。

変更するセグメントは a、d、f のみですが、出力回路のバランスが崩れるので、すべてのセグメントにバッファを入れました。

変更された表示フォント

図6. 変更後の表示フォント

図6 が、変更後の表示フォントです。
うん、やっぱりこっちのフォントのほうがいいかもね (^_^;)

ただ、こうなると 7セグメントLED 自体の表示の形が気になる。横線のセグメントが短いよ。これはもう 7セグメントLED を交換するよりしかたがないのだけど、うーん、気に入ったのがないんだよねぇ。
ん?表示器も作る?か? (;´Д`)

図7. ブレッドボードのようす

図7 は、実験中のブレッドモードです。

一番上が電源回路で、その下 4枚が 7セグメントLEDのダイナミック点灯回路です。4枚目に今回のフォント変更組み合わせ回路を作りましたので、TC4511 とのジャンパー線が飛び交っています。

下側の 3枚は、4ビット加算器による 10進カウンタ (過去記事) です。表示データの発生に使ってみました。

製作後記

そういえば、Arduino でフォントデータを作るとき、変更した方のフォントにしてますね。LCD などでよくみるフォントもそうだし。しかし、それだけのために、こんな組み合わせ回路を作る必要があるかってーと、どーなんだろーねぇ。むしろ、16進表示するとかのほうが使いみちあるかも。

まぁ、こんなこともできますね、ってことで、何かの参考にでもなれば。

タイトルとURLをコピーしました