7セグメントLEDデコーダ TC4511 が出力する表示フォントを変更する組み合わせ回路を作りました。
TC4511 が表示する数値のうち「6」「7」「9」のフォントが嫌いだという記事を、たまに目にします。で、違うデコーダを探しても、なんか TTL タイプしかないとか。よくわからんですけど。
まぁ俺はあまり気にしていないんだけど、気に入らなかったら、フォントを変更する回路を考えりゃいいじゃん、と思ったわけで。
表示フォントの変更点
図1 は、TC4511 のデータシートに載っている表示フォントの図。そしてこれを、図2 のように変更しようと思います。うーん、こうして並べてみると、やっぱり図2 のほうがしっくりくるんかなぁ。
変更する点は、「6」のセグメント a、「7」のセグメント f、「9」のセグメント d を、それぞれ点灯させること。それを、組み合わせ回路で実現します。
真理値表
TC4511 は、16進データを入力すると、それに応じた 7セグメントLED のビットデータを出力します。基本的な制御はそれにまかせて、組み合わせ回路で、必要なセグメントを追加点灯させるようにしましょう。
そのために作った真理値表が、図3 です。
TC4511 が 1 を出力しているセグメントに対しては、組み合わせ回路からの出力は 1 でも 0 でもかまいません。したがって、データシートで出力が 1 の部分は don’t care でよいです。
組み合わせ回路では、「6」のセグメント a、「7」のセグメント f、「9」のセグメント d を 1 にします。
前に作ったダイナミック点灯の回路 (過去記事) に追加する予定ですので、ブランキングのための BI 信号も入力することにします。BI が 0 のときは、表示を消し、ゴーストを抑止すると同時に、輝度調整を可能にしています。
論理式
真理値表から求めた論理式は、下記のとおりです。
a = BI ⋅ D ⋅ B d = BI ⋅ D ⋅ C ⋅ B f = BI ⋅ D ⋅ C ⋅ B = a ⋅ C
カルノー図は省略します。入力が 5要素ありますが、BI=0 の場合はすべて 0 ですので、考える必要ないですね。すべての式に、BI を AND するだけです。
VerilogHDL によるシミュレーション
求めた論理式で、期待した効果が得られるかどうか、簡単にシミュレーションしておきましょう。
回路記述
デコーダの出力と、組み合わせ回路の出力との論理和 (OR) をとります。その値が、期待したようなビットデータになるかどうかを、検証します。
- module SSLED_FONT_CHANGE (
- input wire [3:0] INPUT_BCD,
- input wire BLANK,
- output wire [6:0] SEGMENT_CODE,
- output wire [6:0] SEGMENT_CHANGED
- );
- wire [6:0] CHANGE_CODE;
- function [6:0] DECODE(
- input [3:0] BCD
- );
- begin
- case (BCD)
- 4'd0: DECODE = 7'b1111110;
- 4'd1: DECODE = 7'b0110000;
- 4'd2: DECODE = 7'b1101101;
- 4'd3: DECODE = 7'b1111001;
- 4'd4: DECODE = 7'b0110011;
- 4'd5: DECODE = 7'b1011011;
- 4'd6: DECODE = 7'b0011111;
- 4'd7: DECODE = 7'b1110000;
- 4'd8: DECODE = 7'b1111111;
- 4'd9: DECODE = 7'b1110011;
- default: DECODE = 7'b000_0000;
- endcase
- end
- endfunction
- assign CHANGE_CODE[6] = BLANK & ~INPUT_BCD[3] & INPUT_BCD[1];
- assign CHANGE_CODE[5] = 1'b0;
- assign CHANGE_CODE[4] = 1'b0;
- assign CHANGE_CODE[3] = BLANK & INPUT_BCD[3] & ~INPUT_BCD[2] & ~INPUT_BCD[1];
- assign CHANGE_CODE[2] = 1'b0;
- assign CHANGE_CODE[1] = BLANK & ~INPUT_BCD[3] & INPUT_BCD[2] & INPUT_BCD[1];
- assign CHANGE_CODE[0] = 1'b0;
- assign SEGMENT_CODE = DECODE(INPUT_BCD);
- assign SEGMENT_CHANGED = DECODE(INPUT_BCD) | CHANGE_CODE;
- endmodule
38行目がデコーダの出力。39行目で、デコーダの出力と組み合わせ回路の出力とを OR しています。
テストベンチ
- module SSLED_FONT_CHANGE_TEST;
- reg [3:0] INPUT_BCD;
- reg BLANK;
- wire [6:0] SEGMENT_CODE;
- wire [6:0] SEGMENT_CHANGED;
- parameter STEP = 10;
- SSLED_FONT_CHANGE SFC0(INPUT_BCD, BLANK, SEGMENT_CODE, SEGMENT_CHANGED);
- initial begin
- BLANK = 0;
- INPUT_BCD = 4'd0;
- #STEP INPUT_BCD = 4'd1;
- #STEP INPUT_BCD = 4'd2;
- #STEP INPUT_BCD = 4'd3;
- #STEP INPUT_BCD = 4'd4;
- #STEP INPUT_BCD = 4'd5;
- #STEP INPUT_BCD = 4'd6;
- #STEP INPUT_BCD = 4'd7;
- #STEP INPUT_BCD = 4'd8;
- #STEP INPUT_BCD = 4'd9;
- #STEP INPUT_BCD = 4'd10;
- #STEP INPUT_BCD = 4'd11;
- #STEP INPUT_BCD = 4'd12;
- #STEP INPUT_BCD = 4'd13;
- #STEP INPUT_BCD = 4'd14;
- #STEP INPUT_BCD = 4'd15;
- #STEP
- BLANK = 1;
- INPUT_BCD = 4'd0;
- #STEP INPUT_BCD = 4'd1;
- #STEP INPUT_BCD = 4'd2;
- #STEP INPUT_BCD = 4'd3;
- #STEP INPUT_BCD = 4'd4;
- #STEP INPUT_BCD = 4'd5;
- #STEP INPUT_BCD = 4'd6;
- #STEP INPUT_BCD = 4'd7;
- #STEP INPUT_BCD = 4'd8;
- #STEP INPUT_BCD = 4'd9;
- #STEP INPUT_BCD = 4'd10;
- #STEP INPUT_BCD = 4'd11;
- #STEP INPUT_BCD = 4'd12;
- #STEP INPUT_BCD = 4'd13;
- #STEP INPUT_BCD = 4'd14;
- #STEP INPUT_BCD = 4'd15;
- #STEP $finish;
- end
- initial begin
- $dumpfile("ssled_fontChange.vcd");
- $dumpvars(0, SSLED_FONT_CHANGE_TEST);
- end
- endmodule
BLANK (BI) が 0 のとき、1 のとき、それぞれのときのセグメントのビットデータを出力し、比較します。
シミュレーション結果
SEGMENT_CODE はデコーダの出力データです。これに、組み合わせ回路の出力 CHANGE_CODE を OR すると、SEGMENT_CHANGED になります。
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 の間に、今回作る組み合わせ回路を入れます。
入力データは、デコーダと組み合わせ回路の両方へ入ります。デコーダからは通常のビットデータが、組み合わせ回路からはフォントの変更データが出力されるので、両方を OR することで、表示フォントが変更されます。
変更するセグメントは a、d、f のみですが、出力回路のバランスが崩れるので、すべてのセグメントにバッファを入れました。
変更された表示フォント
図6 が、変更後の表示フォントです。
うん、やっぱりこっちのフォントのほうがいいかもね (^_^;)
ただ、こうなると 7セグメントLED 自体の表示の形が気になる。横線のセグメントが短いよ。これはもう 7セグメントLED を交換するよりしかたがないのだけど、うーん、気に入ったのがないんだよねぇ。
ん?表示器も作る?か? (;´Д`)
図7 は、実験中のブレッドモードです。
一番上が電源回路で、その下 4枚が 7セグメントLEDのダイナミック点灯回路です。4枚目に今回のフォント変更組み合わせ回路を作りましたので、TC4511 とのジャンパー線が飛び交っています。
下側の 3枚は、4ビット加算器による 10進カウンタ (過去記事) です。表示データの発生に使ってみました。
製作後記
そういえば、Arduino でフォントデータを作るとき、変更した方のフォントにしてますね。LCD などでよくみるフォントもそうだし。しかし、それだけのために、こんな組み合わせ回路を作る必要があるかってーと、どーなんだろーねぇ。むしろ、16進表示するとかのほうが使いみちあるかも。
まぁ、こんなこともできますね、ってことで、何かの参考にでもなれば。