自作CPU Advent Calendar 2022 9日目
TD4の命令を実行できる自作CPU「Kageki」で電子サイコロを作ってみた。
Dice Board
3ビットの入力を、以下のようにサイコロの目で表示する。
0 1 2 3
○ ○ ○ ○ ● ○ ● ○
○○○ ○●○ ○○○ ○●○
○ ○ ○ ○ ○ ● ○ ●
4 5 6 7
● ● ● ● ● ● ● ●
○○○ ○●○ ●○● ●●●
● ● ● ● ● ● ● ●
また、最上位ビットに1にすると、ブザー音を鳴らす。
開発
まず、サイコロの目を以下のようにA~Gとおき、よく使われるサイコロの目である1~6について点灯させる位置をまとめる。
A B
CDE
F G
点灯させる位置を✓で表す。
目 | A | B | C | D | E | F | G |
---|---|---|---|---|---|---|---|
1 | ✓ | ||||||
2 | ✓ | ✓ | |||||
3 | ✓ | ✓ | ✓ | ||||
4 | ✓ | ✓ | ✓ | ✓ | |||
5 | ✓ | ✓ | ✓ | ✓ | ✓ | ||
6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
すると、AとG、BとF、CとEが全く同じ点灯パターンであることがわかる。
そこで、これらをまとめる。
さらに、論理の観察がしやすいよう、目を2進数で表す。
目 | AG | BF | CE | D |
---|---|---|---|---|
001 | ✓ | |||
010 | ✓ | |||
011 | ✓ | ✓ | ||
100 | ✓ | ✓ | ||
101 | ✓ | ✓ | ✓ | |
110 | ✓ | ✓ | ✓ |
目を と表す ( はそれぞれのビットを表す) と、AG、BF、CE、Dはそれぞれ以下のように表せる。
これを用いると、0および7も整合性のとれた形で表現できる。
あとは、これを回路で表せばよい。
全てNANDゲートで表せるよう、以下の工夫をした。
- ANDは、負論理 (出力がLOWのとき点灯) のNANDで表現した。
- ORは、ドモルガンの法則 を用い、NANDゲート3個で表した。
さらに、入力をそのまま出力するBFおよびDについても、入力の仕様を統一するためNOT (NANDの一方の端子をVCCに固定) を挟み、負論理で点灯させるようにした。
残りのNANDゲートを用いて発振回路を組み、オン/オフの信号でブザーを鳴らせるようにした。
電子サイコロ
仕様
出力ポートの下位3ビットに現在の目(1~6)を出力する。(最初にサイコロを振る前は0を出力する)
入力ポートの最上位ビットが1の間、現在の目を切り替える。
現在の目を切り替えるとき、ブザー音出力用に、一旦出力ポートの最上位ビットを1にする。
プログラム
場所 機械語 アセンブリ言語
----------------------------------
0 00100000 LOOP: IN A
1 00001000 ADD A, 1000
2 11100000 JNC LOOP
3 01011010 ADD B, 1010
4 11100111 JNC NOWRAP
5 01111001 MOV B, 1001
6 11111001 JMP WRAPPED
7 01011111 NOWRAP: ADD B, 1111
8 00000000 ADD A, 0000
9 10010000 WRAPPED: OUT B
A 01011000 ADD B, 1000
B 10010000 OUT B
C 11110000 JMP LOOP
0番地~2番地で、キーが押されていない場合止める。
3番地で、目を進める。
進める前の目が6だった場合は、ここでキャリーが出るので、5番地で1に戻す。
進める前の目が6でなかった場合は、キャリーが出ず、7番地で1を引いて目を1進めた状態にする。
このどちらの場合でも、かかるステップ数が同じになるように調整している。
また、最上位ビットを立てる。
9番地で、新しい目を出力し、出力の最上位ビットを1にする。
A番地~C番地で、出力の最上位ビットを0にし、最初に戻る。
実行結果
入力ポートに Pmod BTN モジュールを、出力ポートに Dice Board を接続して実行した。
100Hzのクロックで実行すると、目押しができる程度の速さになった。
1kHz程度のクロックで実行するのがよさそうである。
投稿者の人気記事
-
mikecat
さんが
2022/12/09
に
編集
をしました。
(メッセージ: 初版)
-
mikecat
さんが
2022/12/09
に
編集
をしました。
(メッセージ: アドベントカレンダーのリンク忘れを修正)
-
mikecat
さんが
2022/12/12
に
編集
をしました。
(メッセージ: 基板設計データのリンク忘れを修正)
ログインしてコメントを投稿する