← ブログに戻るデジタルデコーダ

BCD から 7 セグメントへのデコーダー:数値を表示へ変換する

4 ビット BCD の数字を、真理値表、K マップ最小化、そして定番の 74LS47 ドライバ IC を使ってデジタル表示器の 7 セグメントへ対応付けます。

DennyDenny
読了まで約12分
Chalkboard feature illustration for “BCD から 7 セグメントへのデコーダー:数値を表示へ変換する”

要約: BCD から 7 セグメントへのデコーダーは、4 ビットの二進化十進数(0〜9)を受け取り、デジタル表示器の a〜g のうち必要な組み合わせを点灯します。対応は 10 行の真理値表で定義されます。各セグメントのブール式を表から導き、K マップで最小化したうえで、74LS47(コモンアノード)や 74LS48(コモンカソード)のような IC で実装します。

7 セグメント表示器は、デジタル電子回路でもっとも見覚えのある出力装置の一つです。時計、電子レンジ、電卓、スコアボード、昔のガソリン計量機まで、いずれもこれを使っています。画面に現れる各数字の背後には、4 ビットの数を「どの LED を点けるか」を表す 7 ビットのパターンへ変える小さな組み合わせ回路があります。それが BCD-7 セグメントデコーダーであり、ブール代数 と カルノー図 の実践的で分かりやすい応用例です。

この記事では BCD を定義し、セグメント名の慣例を示し、真理値表を作り、各セグメントのブール方程式を導出します。さらにコモンアノードとコモンカソードの配線を比較し、回路全体を実装する 74LS47 / 74LS48 IC を紹介します。最後に挙げるシミュレータテンプレートでは、実際に自分で配線できます。

BCD とは?

BCD(Binary-Coded Decimal、二進化十進数)は、十進数の各桁 0〜9 を 4 ビットで表す符号化方式です。通常の二進数とは異なり、BCD では 1010〜1111(十進数の 10〜15)という符号を使いません。

十進数字BCD(4 ビット)A B C D
000000 0 0 0
100010 0 0 1
200100 0 1 0
300110 0 1 1
401000 1 0 0
501010 1 0 1
601100 1 1 0
701110 1 1 1
810001 0 0 0
910011 0 0 1
10〜151010〜1111未使用(ドントケア)

この記事での約束は、A を最上位ビット、D を最下位ビットとすることです。教科書によっては逆の順番を使いますが、変数名を付け替えれば方程式は同じです。

通常の二進数でなく BCD を使う理由は何でしょうか。十進の各桁が数字表示器に直接対応し、固定の桁数と小数点位置をもつ十進量なら、二進小数への変換なしに十進の桁を保持できるからです。ただし算術演算が正確なのは、数学的な結果が選んだ桁数と尺度に収まる場合だけです。除算や循環小数になる結果には、依然として丸め規則が必要です。

記憶効率を比べるには分母を明確にする必要があります。BCD は十進 1 桁につき 4 ビットを使う一方、10 種類の記号の情報量は log⁡210≈3.322\log_2 10\approx3.322 ビットです。各 BCD ニブルの理論上の符号空間の約 16.9% は未使用です。言い換えると、4 ビットは log⁡210\log_2 10 より約 20.4% 多くなります。特定の範囲に限られた整数なら、ひとつの割合を機械的に当てはめるのではなく、実際の二進数幅と BCD 幅を比較してください。

未使用の 6 符号、すなわち 1010〜1111 は、セグメント方程式を最小化するとき ドントケア として扱えます。ただし、システムがこれらの入力に対する表示出力を無関係だと保証する場合に限ります。リセット中、バス遷移中、または故障時に無効な符号が現れ得るなら、意図して空白またはエラーパターンを割り当てます。ドントケアは設計上の許可であり、ハードウェアにその入力が絶対に来ないという主張ではありません。

7 個のセグメント

標準的な 7 セグメント表示器は、8 の形に配置された 7 個の LED からなり、慣例として a〜g と呼びます。

   ┌─── a ───┐
   │         │
   f         b
   │         │
   ├─── g ───┤
   │         │
   e         c
   │         │
   └─── d ───┘
  • a は上側の横棒です。
  • b は右上の縦棒です。
  • c は右下の縦棒です。
  • d は下側の横棒です。
  • e は左下の縦棒です。
  • f は左上の縦棒です。
  • g は中央の横棒です。

十進数字ごとに点灯する組み合わせは決まっています。

数字点灯するセグメント
0a, b, c, d, e, f
1b, c
2a, b, d, e, g
3a, b, c, d, g
4b, c, f, g
5a, c, d, f, g
6a, c, d, e, f, g
7a, b, c
8a, b, c, d, e, f, g
9a, b, c, d, f, g

DigiSim の SEVEN_SEGMENT_DISPLAY コンポーネントは、まさにこの順序で 7 入力を受け取ります。DIGIT_DISPLAY はより高水準の抽象化で、4 ビットの BCD 入力を直接受け、内部で復号します。

完全な真理値表

BCD 符号化とセグメントの対応を組み合わせると、16 行(有効な 10 行 + ドントケアの 6 行)と 7 列のセグメントからなる表になります。

ABCD数字abcdefg
000001111110
000110110000
001021101101
001131111001
010040110011
010151011011
011061011111
011171110000
100081111111
100191111011
1010—×××××××
1011—×××××××
1100—×××××××
1101—×××××××
1110—×××××××
1111—×××××××

この表は アクティブハイの論理セグメント指令、つまり 1 が「このセグメントを点灯要求する」ことを前提にしています。コモンカソード用ドライバではこの極性をそのまま使える場合が多く、コモンアノード用ドライバでは通常アクティブロー出力になります。実際のドライバ段は電流の向き、電圧降下、出力構造も異なるため、違いは回路図上のインバータだけではありません。

セグメント方程式の導出

上の各セグメント列は、4 入力の一つのブール関数です。6 行のドントケアを利用すれば、K マップによる最小化は素朴な積和形よりずっと短い式を与えます。ここで使うのは 積和形(Sum of Products) と K マップ による簡約です。

セグメント a

セグメント a は数字 0、2、3、5、6、7、8、9 で点灯し、1 と 4 で消灯します。ドントケアを最適に扱うと、K マップの最小化結果は次のとおりです。

a=A+C+B⋅D+B‾⋅D‾a = A + C + B \cdot D + \overline{B} \cdot \overline{D}

(B‾\overline{B} は NOT B を意味します。書籍によっては B′B' と表記します。)項 B‾⋅D‾\overline{B} \cdot \overline{D} は B と D がともに 0 のときで、0 と 2 を効率よく覆います。B⋅DB \cdot D は両方が 1 のときで 3、5、7、9 を覆います。AA 単独は 8 と 9(および 10〜15 のドントケア)を、CC 単独は 2、3、6、7 を覆います。

この式では各積項に AND を 1 個使い、最後に OR でまとめます。正確なセル数やトランジスタ数は、論理ファミリ、反転信号を利用できるかどうか、合成時のマッピングによって変わります。

セグメント b

セグメント b は 0、1、2、3、4、7、8、9 で点灯し、5 と 6 で消灯します。K マップから次を得ます。

b=B‾+C‾⋅D‾+C⋅Db = \overline{B} + \overline{C} \cdot \overline{D} + C \cdot D

セグメント c

セグメント c は 0、1、3、4、5、6、7、8、9 で点灯し、2 だけで消灯します。K マップの結果は次です。

c=B+C‾+Dc = B + \overline{C} + D

これはもっとも単純な式です。出力 0 の行が一つしかなく、残りをドントケアで埋められるため、項は三つだけです。

セグメント d

セグメント d は 0、2、3、5、6、8、9 で点灯し、1、4、7 で消灯します。K マップから次を得ます。

d=B‾⋅D‾+C⋅D‾+B⋅C‾⋅D+B‾⋅C+Ad = \overline{B} \cdot \overline{D} + C \cdot \overline{D} + B \cdot \overline{C} \cdot D + \overline{B} \cdot C + A

セグメント e

セグメント e は 0、2、6、8 で点灯し、1、3、4、5、7、9 で消灯します。K マップから次を得ます。

e=B‾⋅D‾+C⋅D‾e = \overline{B} \cdot \overline{D} + C \cdot \overline{D}

両方の項は D‾\overline{D} を共有します。すなわち e=D‾(B‾+C)e=\overline{D}(\overline{B}+C) とも書けます。この入力規約で e が点灯するには偶数であることが必要ですが、それだけでは十分ではありません。数字 4 は D=0D=0 でも e は消灯します。因数分解した形なら、必要な反転に加えて OR 1 個と AND 1 個で実装できます。

セグメント f

セグメント f は 0、4、5、6、8、9 で点灯し、1、2、3、7 で消灯します。K マップから次を得ます。

f=A+B⋅C‾+C‾⋅D‾+B⋅D‾f = A + B \cdot \overline{C} + \overline{C} \cdot \overline{D} + B \cdot \overline{D}

セグメント g

中央の横棒であるセグメント g は 2、3、4、5、6、8、9 で点灯し、0、1、7 で消灯します。K マップから次を得ます。

g=A+B⋅C‾+C⋅D‾+B‾⋅Cg = A + B \cdot \overline{C} + C \cdot \overline{D} + \overline{B} \cdot C

これらの式は、ここで述べたアクティブハイとドントケアの仮定における有効な最小化の一例です。同じ最小形でも見た目が異なることがあり、市販デコーダーの内部ネットワークがこの教科書的な積和形と一致する必要はありません。

コモンアノードとコモンカソード

7 セグメント表示器には二つの物理的な配線方式があります。違いは、各 LED のどちら側を一つの共通ピンにまとめるかです。

コモンカソード

7 個すべての LED の カソード(負極)を一つの共通ピンに接続し、そのピンをグラウンドへつなぎます。各アノードは個別に駆動します。セグメントを点灯するにはアノードをハイにします。

  • ドライバ出力: アクティブハイ — 1 でセグメントが点灯します。
  • 真理値表の解釈: 上の表をそのまま使えます。
  • 対応 IC: 74LS48 — 出力はアクティブハイです。

コモンアノード

7 個すべての LED の アノードを一つの共通ピンに接続し、そのピンを V_CC へつなぎます。各カソードは個別に駆動します。セグメントを点灯するにはカソードをローへ引き下げます。

  • ドライバ出力: アクティブロー — 0 でセグメントが点灯します。
  • 真理値表の解釈: 各出力列をすべて反転します。
  • 対応 IC: 74LS47 — 出力はアクティブロー(オープンコレクタ)です。

ブール論理の水準では、極性の変更は出力反転で表せます。実機では、必要な電流を供給または吸い込めるドライバを選び、点灯する各セグメントの電流経路に電流制限要素を入れてください。LED セグメントを無制限の電圧源へ直接つないではいけません。

74LS47 と 74LS48

74LS47 と 74LS48 は TTL の BCD-7 セグメントデコーダー/ドライバ機能を備えた IC です。便利な参照例ではありますが、名前だけで極性互換の置換品とみなさず、必ずデータシートで注文可能な正確なデバイスを選び、配線してください。

IC出力極性表示器の種類
74LS47アクティブロー(オープンコレクタ)コモンアノード
74LS48アクティブハイ(内部プルアップ付き)コモンカソード

古典的なデバイス表記では、通常 A が最下位 BCD 入力、D が最上位です。この記事の方程式では A を MSB、D を LSB としました。74LS47/48 のピンレベル設計に方程式を写す前に、変数を付け替えてください。

両 IC には有用な補助入力が三つあります。

  • LT(Lamp Test): BCD 入力に関係なく、ローに引くと 7 出力すべてをオンに強制します。すべての LED が動作することを確認するために使います。
  • RBI(Ripple Blanking Input): BCD 入力 0000 とともにローに引くと、0 を表示せず表示器を 消灯します。多桁表示の先頭 0 を抑制する用途で、00073 を 73 にできます。
  • BI/RBO(Blanking Input / Ripple Blanking Output): 強制ブランキングとリップルブランキング連鎖に使う二機能ピンです。ほかの制御入力によって振る舞いが変わるため、通常の双方向論理ピンとして扱わず、デバイスの機能表に従ってください。

この三つのピンにより、複数のデコーダー/表示器ペアを連鎖し、先頭のゼロが自動的に消える多桁数値表示器を作れます。

無効な BCD 入力(1010〜1111)に対する振る舞いは IC 固有で、数字ではない特有のセグメントパターンを出します。デバッグ信号としては役立ちますが、機種をまたいで利用できるものではありません。

実世界での用途

BCD-7 セグメント復号は、数値表示を持つ機器でよく使われます。

  • デジタル時計: カウンターまたは保存された時刻の桁が、しばしば多重化ドライバを介して組み合わせセグメント生成へ入ります。秒と分には modulo-60 の動作が必要で、通常は一の位と十の位に分けます。
  • 電卓と計測器: 複数桁で多重化されたセグメント駆動を共有する場合があります。コントローラーは一度に 1 桁とそのセグメントパターンを選びます。リフレッシュレート、ピーク電流、デューティ比、明るさ、ゴーストは一緒に設計する必要があります。
  • 多桁電圧計と周波数カウンター: カウンターが BCD 符号化レジスタへ入力し、レジスタがデコーダーへ、デコーダーがセグメントを点灯します。
  • スコアボードと走行距離計: 同じ多重化の工夫を使いますが、多くの場合はより明るい LED アレイを用います。

DigiSim で作る

一般的なデコーダーの構成要素は DECODER コンポーネントで確認できます。BCD-7 セグメントという特定の用途なら、変換を内蔵した DIGIT_DISPLAY を置くか、デコーダーを自分で作って 7 出力を SEVEN_SEGMENT_DISPLAY へ入力します。

4 個の入力スイッチを A、B、C、D(最上位から最下位)として配線します。まず上の方程式でセグメント a を実装します。

  1. AND ゲートを二つ置きます。一つは B⋅DB \cdot D 用、もう一つは B‾⋅D‾\overline{B} \cdot \overline{D} 用です。
  2. AA、CC、二つの AND 出力を 4 入力 OR でまとめます。

スイッチを BCD 符号 0〜9 に切り替え、セグメント a が正しい場合に点灯することを確認します。次に上の方程式に従って b〜g を追加します。

最後に符号 10〜15 を試します。これらをドントケアとして用いたなら、実際のパターンを記録し、表示が見えているときに上流論理がそれらを防ぐことを確認してください。故障を示す設計なら、ドントケアを定義済みの空白またはエラー記号に置き換え、もう一度最小化します。

組み合わせ回路の次の記事 BCD:二進化十進数の基礎 では、BCD 加算、無効な桁または 10 進の桁上がりが生じた場合の 6 加算補正、パック形式とアンパック形式の BCD 保存を扱います。7 セグメント表示器を駆動するデコーダーとエンコーダー と併読すると、少数の二進入力が多くの表示パターンから一つを選ぶ仕組みを体系的に確認できます。

参考資料

アイデアを実際に動く回路にしましょう。