mikecatのアイコン画像
mikecat 2022年12月09日作成 (2022年12月12日更新) © CC BY 4+
製作品 製作品 Lチカ Lチカ 閲覧数 663
mikecat 2022年12月09日作成 (2022年12月12日更新) © CC BY 4+ 製作品 製作品 Lチカ Lチカ 閲覧数 663

Kageki (TD4互換機) で電子サイコロ

Kageki (TD4互換機) で電子サイコロ

自作CPU Advent Calendar 2022 9日目

TD4の命令を実行できる自作CPU「Kageki」で電子サイコロを作ってみた。

Dice Board

Dice Board 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

目を b2b1b0b_2b_1b_0 と表す (bib_i はそれぞれのビットを表す) と、AG、BF、CE、Dはそれぞれ以下のように表せる。

  • AG=b2b1AG = b_2 \lor b_1
  • BF=b2BF = b_2
  • CE=b2b1CE = b_2 \land b_1
  • D=b0D = b_0

これを用いると、0および7も整合性のとれた形で表現できる。
あとは、これを回路で表せばよい。
全てNANDゲートで表せるよう、以下の工夫をした。

  • ANDは、負論理 (出力がLOWのとき点灯) のNANDで表現した。
  • ORは、ドモルガンの法則 b2b1=¬(¬b2¬b1)b_2 \lor b_1 = \lnot (\lnot b_2 \land \lnot b_1) を用い、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程度のクロックで実行するのがよさそうである。

1
  • mikecat さんが 2022/12/09 に 編集 をしました。 (メッセージ: 初版)
  • mikecat さんが 2022/12/09 に 編集 をしました。 (メッセージ: アドベントカレンダーのリンク忘れを修正)
  • mikecat さんが 2022/12/12 に 編集 をしました。 (メッセージ: 基板設計データのリンク忘れを修正)
ログインしてコメントを投稿する