3.2 比較器
いろいろの場面で無意識によく使っている論理です。これがないと、言語の文構造が成り立たないかもしれません。
3.2.1 信号値と定数の一致比較
これが、もっとも頻繁に使う比較器の使用例だと思います。
リスト10 信号と定数の一致比較
論理式だけ示すと、q.3 & !q.2 & !q.1 & q.0 になります。これが0 のときに計数を続行、1 のときに計数を停止しています。

3.2.2 信号値と定数の大小比較
リスト11は、図3.7 のようにQA を0 から増計数していって10 で止めます。QB を15 から減計数していって4 で止めます。
これは、信号値と定数の大小を比較する論理になります。

大小を比較する論理も、1 ビットから拡張して作ることができます、図3.8 がa > b の真理値表で図3.9 がa = b の真理値表です。c もd も0 のときはa < b になります。このふたつの真理値表を使って、大小の比較をすることができます。
リスト11 信号値と定数の大小比較
これを、図3.13 のように8 個連結して、8 ビットの比較器を作ります。最終段の比較器に結果が出ています。比較器や加算器は、1 ビットの論理を作っておいてビットの数だけ連結すれば、簡単に作ることができます。
言語の中では、演算子で手軽に使える比較器もリスト12 のような論理ですから、リスト11 のqa>9 の表記も同じことをあちらこちらに書くとむだに論理を大きくしてしまいますので、qa>9 で1 になる信号を一か所だけ書いておいて、それを何か所かで利用すれば、同じことをしている比較器はひとつだけで済みます。また、リスト11 のqa>9 のqa は増計数器なので、比較器を使わない次の書き方が、コンパイルされた論理式を小さくします。

リスト12 8ビットの比較器
図3.14は、リスト12 を実行したものですが、入力値のa とb に対応する結果は、図3.12 の真理値表のようになっています。
3.2.3 信号値と信号値の大小比較
リスト12 のように作らないでも、演算子でリスト13のように簡単に利用できます。
リスト13 信号値どうしの比較器の使用例
図3.15 はリスト13 を実行したものです。演算子を使った設計は便利なものですが、リスト12で作った8 ビットの比較器を手続きにすれば、たとえば、y=cmp8(a,b); のように使えるので、演算子を使わないで自分で組み上げた論理だけでも簡単に言語で設計することができます。

entity main
input RESET;
output Q[4];
bitr q[4];
Q=q;
if (RESET)
q=0;
else
switch(q)
case 9: q=q;
default: q=q+1;
endswitch
endif
ende リスト10は、Q を0 から計数していって9 で止める論理です。これは信号値と定数の一致を比較する論理になります。q が9 になったときに1 になる真理値表です。論理式だけ示すと、q.3 & !q.2 & !q.1 & q.0 になります。これが0 のときに計数を続行、1 のときに計数を停止しています。
図3.6 信号と定数の一致比較実行
3.2.2 信号値と定数の大小比較
リスト11は、図3.7 のようにQA を0 から増計数していって10 で止めます。QB を15 から減計数していって4 で止めます。
これは、信号値と定数の大小を比較する論理になります。
図3.7 定数の大小比較実行
大小を比較する論理も、1 ビットから拡張して作ることができます、図3.8 がa > b の真理値表で図3.9 がa = b の真理値表です。c もd も0 のときはa < b になります。このふたつの真理値表を使って、大小の比較をすることができます。
![]() | ![]() |
| 図3.8 a > b | 図3.9 a = b |
リスト11 信号値と定数の大小比較
entity main
input RESET;
output QA[4];
output QB[4];
bitr qa[4];
bitr qb[4];
QA=qa;
QB=qb;
if (RESET)
qa=0;
else
if (qa>9)
qa=qa;
else
qa=qa+1;
endif
endif
if (RESET)
qb=15;
else
if (qb<5)
qb=qb;
else
qb=qb-1;
endif
endif
ende 1ビットから拡張するときに、上位のビットの比較の結果も受けて現ビットの比較を行うのが、図3.10 のa > b の真理値表と図3.11 のa = b の真理値表です。このふたつの真理値表の結果を合わせると、図3.10 のように、大小一致の比較器の真理値表になります。![]() |
![]() |
![]() |
| 図3.10 a > b | 図3.11 a = b | 図3.12 比較器 |
これを、図3.13 のように8 個連結して、8 ビットの比較器を作ります。最終段の比較器に結果が出ています。比較器や加算器は、1 ビットの論理を作っておいてビットの数だけ連結すれば、簡単に作ることができます。
言語の中では、演算子で手軽に使える比較器もリスト12 のような論理ですから、リスト11 のqa>9 の表記も同じことをあちらこちらに書くとむだに論理を大きくしてしまいますので、qa>9 で1 になる信号を一か所だけ書いておいて、それを何か所かで利用すれば、同じことをしている比較器はひとつだけで済みます。また、リスト11 のqa>9 のqa は増計数器なので、比較器を使わない次の書き方が、コンパイルされた論理式を小さくします。
switch(qa)
case 10: qa=qa;
default: qa=qa+1;
endswitch リスト12 の手続きのcmp は、図3.10 と図3.11 の1 ビットの真理値表を言語にしたものです。実効譜のmainでは、これを図3.13 のように8 個連結して8 ビットの比較器を作っています。図3.13 8 ビットの比較器の構成
リスト12 8ビットの比較器
procedure cmp
input a,b,ci,di;
output c,d;
switch(a,b,ci)
case 0,0,0: c=0;
case 0,1,0: c=0;
case 1,0,0: c=1;
case 1,1,0: c=0;
case 0,0,1: c=1;
case 0,1,1: c=1;
case 1,0,1: c=1;
case 1,1,1: c=1;
endswitch
switch(a,b,di)
case 0,0,0: d=0;
case 0,1,0: d=0;
case 1,0,0: d=0;
case 1,1,0: d=0;
case 0,0,1: d=1;
case 0,1,1: d=0;
case 1,0,1: d=0;
case 1,1,1: d=1;
endswitch
endp
entity main
input a[8],b[8];
output c,d;
bitn int0cmp[2];
bitn int1cmp[2];
bitn int2cmp[2];
bitn int3cmp[2];
bitn int4cmp[2];
bitn int5cmp[2];
bitn int6cmp[2];
bitn int7cmp[2];
c=int0cmp.0;
d=int0cmp.1;
int0cmp=cmp(a.0,b.0,int1cmp.0,int1cmp.1);
int1cmp=cmp(a.1,b.1,int2cmp.0,int2cmp.1);
int2cmp=cmp(a.2,b.2,int3cmp.0,int3cmp.1);
int3cmp=cmp(a.3,b.3,int4cmp.0,int4cmp.1);
int4cmp=cmp(a.4,b.4,int5cmp.0,int5cmp.1);
int5cmp=cmp(a.5,b.5,int6cmp.0,int6cmp.1);
int6cmp=cmp(a.6,b.6,int7cmp.0,int7cmp.1);
int7cmp=cmp(a.7,b.7,0,1);
int0cmp.2=1;
int1cmp.2=1;
int2cmp.2=1;
int3cmp.2=1;
int4cmp.2=1;
int5cmp.2=1;
int6cmp.2=1;
int7cmp.2=1;
ende

図3.14 8 ビットの比較器の実行
図3.14は、リスト12 を実行したものですが、入力値のa とb に対応する結果は、図3.12 の真理値表のようになっています。
3.2.3 信号値と信号値の大小比較
リスト12 のように作らないでも、演算子でリスト13のように簡単に利用できます。
リスト13 信号値どうしの比較器の使用例
entity main
input RESET;
output QA[8];
output QB[8];
output C,D;
bitr qa[8];
bitr qb[8];
QA=qa;
QB=qb;
if (RESET)
qa=100;
else
qa=qa-1;
endif
if (RESET)
qb=0;
else
qb=qb+1;
endif
if (qa==qb)
D=1;
else
if (qa>qb)
C=1;
else
C=0;
endif
endif
ende 比較器の使用は、リスト13のように信号値どうしを比較しなければならないときだけ利用して、信号値が定数と一致しているかどうかなどの判断は、前記の方法を利用するのがよいでしょう。図3.15 はリスト13 を実行したものです。演算子を使った設計は便利なものですが、リスト12で作った8 ビットの比較器を手続きにすれば、たとえば、y=cmp8(a,b); のように使えるので、演算子を使わないで自分で組み上げた論理だけでも簡単に言語で設計することができます。
図3.15 信号値どうしの比較器の使用例の実行
コラム
リレー式計算機の開発の物語(1)を読んだことがあります。その本は専門家に向けたものではありませんが、中にはAND ゲートだとかOR ゲートだとかの話も出てきます。その中で「これらの論理記号を駆使してつくりたい装置の機能を実現することを「論理設計」というのだそうである。」と書かれていました。また論理設計で作られた図面からリレーを使った電気回路にするのが回路設計だという主旨のことも書かれていて結びの言葉に「ディジタル装置の設計というのは、論理設計と回路設計の両面がある、というのである」と書かれていました。
今から16 年ほど前の本ですが「論理設計と回路設計の両面がある」というところはそのとおりだなぁと思います。シンボルによるものであっても言語によるものであっても、私たちのやっていることは論理設計のほうだと思います。その情報から開発ツールがチップ・データにするのが回路設計といえるのかもしれません。
言語設計へのプログラマの参入について回路設計だからプログラマにはできないという人もあるようですが、論理設計とプログラム設計には根本的ではないものの様子が違うところがあるというべきでしょう、論理設計と回路設計という別の概念が一体になって動いているのであって、両面があると捉えるのが正しい認識のように思います。
(1) NHK 電子立国日本の自叙伝(下) 相田洋著p.117 より青字引用部分
渕上賢二







コメントする