目次

ハードウエアテスト(その10)

 デジタル回路では、ゲートICをよく利用しました。
 AND、OR、NAND、NOR、排他的論理和等のゲートICを
 組み合わせ、所望の回路を構成します。

 2入力1出力の論理演算を、コンピュータがクイズ形式で
 出題して、人間が答えるシステムを作成してみます。

 2変数X、Yにコンピュータが論理値を入力し、演算結果を
 人間が答えるという仕様にしましょう。

 乱数を利用して、2変数X、Yに論理値を入力し、さらに
 論理演算種別も乱数で指定するとします。

 論理値は、0か1なので、乱数で2を超えない整数を
 発生させればよいでしょう。また、演算種別は5種と
 なるので5を超えない整数を発生させて対応します。

 演算種別は、次のように決めました。



 2変数X、Yの論理値から論理演算結果を求める
 サブルーチンを定義します。

200 ' logical computing
210 LET [0],X & Y
220 LET [1],X | Y
230 LET [2],X ^ Y
240 LET [3],[0] ^ 1
250 LET [4],[1] ^ 1
260 RETURN

 配列の[0]から[4]に個々の演算結果を代入して
 コンピュータ側は、答を求めてしまいます。

 2変数X、Yの論理値は、次のように求めます。

LET X,RND(2) : LET Y,RND(2)

 演算種別は、0から4のいずれかの整数なので
 次のように指定できます。

LET C,RND(5)

 2つの論理値を演算種別を求める処理は、次の
 ように定義すればよいでしょう。

20 LET X,RND(2) : LET Y,RND(2) : LET C,RND(5)

 2つの論理値と演算種別を人間に示すのは
 PRINT(?)を使えばよいでしょう。

30 IF C=0 ? X,Y,"? AND "
40 IF C=1 ? X,Y,"? OR "
50 IF C=2 ? X,Y,"? XOR "
60 IF C=3 ? X,Y,"? NAND "
70 IF C=4 ? X,Y,"? NOR "

 人間の方はINPUTで入力すればよいはず。

80 INPUT "YOUR ANSER",A

 コンピュータは正解を計算して、人間の入力と
 比較して正解、不正解を判断すればよいでしょう。

90  GOSUB 200
100 IF [C]=A ? "correct !" ELSE ? "wrong !"

 永久に続けることはできないので、終了処理を
 入れておきます。

80 INPUT "YOUR ANSER",A
90 IF A=#45 or A=#65 GOTO 140
100 LET A,(A-#30)
110 GOSUB 200
120 IF [C]=A ? "correct !" ELSE ? "wrong !"
130 GOTO 20
140 ? "exit"
150 END

 キーボードから入力した値は、'0'か'1'なので
 16進数では、#30か#31。これを数値の0か1に
 するため、100行目の処理を追加します。

 まとめると以下。

10 ' test logical computing
20 LET X,RND(2) : LET Y,RND(2) : LET C,RND(5)
30 IF C=0 ? X,Y,"? AND "
40 IF C=1 ? X,Y,"? OR "
50 IF C=2 ? X,Y,"? XOR "
60 IF C=3 ? X,Y,"? NAND "
70 IF C=4 ? X,Y,"? NOR "
80 INPUT "YOUR ANSER",A
90 IF A=#45 or A=#65 GOTO 140
100 LET A,(A-#30)
110 GOSUB 200
120 IF [C]=A ? "correct !" ELSE ? "wrong !"
130 GOTO 20
140 ? "exit"
150 END
200 ' logical computing
210 LET [0],X & Y
220 LET [1],X | Y
230 LET [2],X ^ Y
240 LET [3],[0] ^ 1
250 LET [4],[1] ^ 1
260 RETURN

 このプログラムは、人間の訓練に使います。

 実際に、AND、OR、XOR、NAND、NORのゲートICを
 ブレッドボード上において使う、トレーナーを
 考えてみます。

 論理値をゲートICに与え、ゲートICの出力値を
 入力しておきます。これと人間の入力値を比較
 して判定します。





 論理値を乱数で生成して、変数X、Yに代入し
 ゲートICに与えます。結果を変数Zに格納する
 処理を作成して対応します。


20 LET X,RND(2) : LET Y,RND(2) : GOSUB 100
30 INPUT "YOUR ANSER",A
40 IF A=#45 or A=#65 GOTO 80
50 LET A,(A-#30)
60 IF Z=A ? "correct !" ELSE ? "wrong !"
70 GOTO 20
80 ? "exit"
90 END

 サブルーチンは、論理値を出力してゲートICから
 値を入力する処理を定義すればよいでしょう。

100 ' gate IC handling
110 ? X,Y,"? result"
120 OUT 1,X
130 OUT 2,Y
140 Z=IN(3)
150 RETURN

 合体させて完成させます。

10 ' test gate IC
20 LET X,RND(2) : LET Y,RND(2) : GOSUB 100
30 INPUT "YOUR ANSER",A
40 IF A=#45 or A=#65 GOTO 80
50 LET A,(A-#30)
60 IF Z=A ? "correct !" ELSE ? "wrong !"
70 GOTO 20
80 ? "exit"
90 END
100 ' gate IC handling
110 ? X,Y,"? result"
120 OUT 1,X
130 OUT 2,Y
140 Z=IN(3)
150 RETURN

 ラベルを利用すると、次のようにも書けます。

10 ' test gate IC
20 @LOOP
25 LET X,RND(2):LET Y,RND(2):GSB @GHND
30 INPUT "YOUR ANSER",A
40 IF A=#45 or A=#65 GOTO @EXIT
50 LET A,(A-#30)
60 IF Z=A ? "correct !" ELSE ? "wrong !"
70 GOTO @LOOP
80 @EXIT
85 ? "exit"
90 END
100 @GHND
110 ? X,Y,"? result"
120 OUT 1,X
130 OUT 2,Y
140 Z=IN(3)
150 RTN

 ゲートICは、ブレッドボードに実装。




目次

inserted by FC2 system