ICL7137 (2)

 5 セグメント・パターンから BCD (Binary Coded Decimal) への変換部分を、 PLD (Programmable Logic Device) である Lattice GAL16V8 を使って「ランダム・ロジック」によるハードウェアとして実現した例を示します。
 GAL16V8 の OLMC (Output Logic MacroCell) のモードとして、「Registered」モード以外の「Complex」モードあるいは「Simple」モードに設定すれば、入力を 10 本、出力を 8 本使えるので、2 桁分の回路をひとつのチップにおさめることができます。
 入出力の割り当てのようすを下に示します。

 ロジックは Atmel (Microchip) の「WinCUPL」で記述しました。

Name     SEG2BCD ;
PartNo   00 ;
Date     2019/09/02 ;
Revision 01 ;
Designer pcm1723 ;
Company  individual ;
Assembly None ;
Location  ;
Device   g16v8 ; /* GAL16V8 */

/* 7 segment pattern to BCD encoder */

/* *************** INPUT PINS *********************/
/* active low inputs for annode common LED */
/* digit 1 */
PIN 1    = !seg_1a;  
PIN 2    = !seg_1b;
PIN 3    = !seg_1e;
PIN 4    = !seg_1f;
PIN 5    = !seg_1g;

/* digit 2 */
PIN 6    = !seg_2a;  
PIN 7    = !seg_2b;
PIN 8    = !seg_2e;
PIN 9    = !seg_2f;
PIN 11   = !seg_2g;

/* *************** OUTPUT PINS *********************/
PIN [19..16] = [bcd1out3..0] ;
PIN [15..12] = [bcd2out3..0] ;

/***** product terms for segment pattern decode *****/
/***** digit 1 *****/

code_1blank = (!seg_1a & !seg_1b & !seg_1e & !seg_1f & !seg_1g);

/* ICL7137 pattern */
code_10     = ( seg_1a &  seg_1b &  seg_1e &  seg_1f & !seg_1g);
code_11     = (!seg_1a &  seg_1b & !seg_1e & !seg_1f & !seg_1g);
code_12     = ( seg_1a &  seg_1b &  seg_1e & !seg_1f &  seg_1g);
code_13     = ( seg_1a &  seg_1b & !seg_1e & !seg_1f &  seg_1g);
code_14     = (!seg_1a &  seg_1b & !seg_1e &  seg_1f &  seg_1g);
code_15     = ( seg_1a & !seg_1b & !seg_1e &  seg_1f &  seg_1g);
code_16     = ( seg_1a & !seg_1b &  seg_1e &  seg_1f &  seg_1g);
code_17     = ( seg_1a &  seg_1b & !seg_1e & !seg_1f & !seg_1g);
code_18     = ( seg_1a &  seg_1b &  seg_1e &  seg_1f &  seg_1g);
code_19     = ( seg_1a &  seg_1b & !seg_1e &  seg_1f &  seg_1g);

/* another pattern */
code_10a    = (!seg_1a & !seg_1b &  seg_1e & !seg_1f &  seg_1g);
code_16a    = (!seg_1a & !seg_1b &  seg_1e &  seg_1f &  seg_1g);
code_17a    = ( seg_1a &  seg_1b & !seg_1e &  seg_1f & !seg_1g);

/***** digit 2 *****/
code_2blank = (!seg_2a & !seg_2b & !seg_2e & !seg_2f & !seg_2g);

/* ICL7137 pattern */
code_20     = ( seg_2a &  seg_2b &  seg_2e &  seg_2f & !seg_2g);
code_21     = (!seg_2a &  seg_2b & !seg_2e & !seg_2f & !seg_2g);
code_22     = ( seg_2a &  seg_2b &  seg_2e & !seg_2f &  seg_2g);
code_23     = ( seg_2a &  seg_2b & !seg_2e & !seg_2f &  seg_2g);
code_24     = (!seg_2a &  seg_2b & !seg_2e &  seg_2f &  seg_2g);
code_25     = ( seg_2a & !seg_2b & !seg_2e &  seg_2f &  seg_2g);
code_26     = ( seg_2a & !seg_2b &  seg_2e &  seg_2f &  seg_2g);
code_27     = ( seg_2a &  seg_2b & !seg_2e & !seg_2f & !seg_2g);
code_28     = ( seg_2a &  seg_2b &  seg_2e &  seg_2f &  seg_2g);
code_29     = ( seg_2a &  seg_2b & !seg_2e &  seg_2f &  seg_2g);

/* another pattern */
code_20a    = (!seg_2a & !seg_2b &  seg_2e & !seg_2f &  seg_2g);
code_26a    = (!seg_2a & !seg_2b &  seg_2e &  seg_2f &  seg_2g);
code_27a    = ( seg_2a &  seg_2b & !seg_2e &  seg_2f & !seg_2g);

/***** encode to BCD *****/
/***** digit 1 *****/
bcd1out0 = (code_11 # code_13 # code_15 # code_17 # code_19             # code_17a # code_1blank);
bcd1out1 = (code_12 # code_13 # code_16 # code_17            # code_16a # code_17a);
bcd1out2 = (code_14 # code_15 # code_16 # code_17            # code_16a # code_17a);
bcd1out3 = (code_18 # code_19                                                      # code_1blank);

/***** digit 2 *****/
bcd2out0 = (code_21 # code_23 # code_25 # code_27 # code_29             # code_27a # code_2blank);
bcd2out1 = (code_22 # code_23 # code_26 # code_27            # code_26a # code_27a);
bcd2out2 = (code_24 # code_25 # code_26 # code_27            # code_26a # code_27a);
bcd2out3 = (code_28 # code_29                                                      # code_2blank);

 ICL7137 の「0」~「9」の表示パターン 10 種と、「6」、「7」、「0」の別パターン 3 種との合計 13 種のパターンをデコードしています。
 この 13 種以外のパターンについては積極的にデコードしておらず、結果的に 13 種以外のパターン入力については、BCD 値として「0」が出力されます。
 ICL7137 では、「オーバーレンジ」を示すのにハードウェアの信号線は用意されておらず、LED ディスプレイの

  • 1000 の位が「1」
  • 100 の位、10 の位、1 の位の 3 桁がいずれも「ブランク」(全セグメント消灯)

つまり、「1⌴⌴⌴」あるいは「-1⌴⌴⌴」という表示になることで表現しています。
 5 セグメントの「ブランク」状態をデコードすればオーバーレンジを検出でき、BCD 出力値として 0x0a ~ 0x0f のいずれかの値を出力すれば、数値データを受け取る側のマイコンでもオーバーレンジを認識できます。
 ここでは、簡単に「ブランク」→「9」と変換することにして、オーバーレンジの状態では普通の数値として「1999」あるいは「-1999」と、最大値あるいは最小値に「飽和」した値が出力されるようにしています。
 ソフトウェアによる実現としては、各セグメントの値 (正論理) とインデックスの変数の各ビットとを

  • セグメント a → b0
  • セグメント b → b1
  • セグメント e → b2
  • セグメント f → b3
  • セグメント g → b4

のように対応させて、下の 32 バイトのテーブルを引けば簡単に変換できます。

uint8_t const seg2bcd[32] = {
  9, 0, 1, 7, 0, 0, 0, 0,
  0, 0, 0, 7, 0, 0, 0, 0,
  0, 0, 0, 3, 0, 0, 0, 2,
  0, 5, 4, 9, 6, 6, 0, 8,
};  //  uint8_t const seg2bcd[]