この記事はセルオートマトンによるCPU作成連載記事の15本目です。(2023/01/10)
前回のディスプレイの記事では4ビット2進数の入力で1桁の7セグメントディスプレイを作りました。1桁ずつ独立したディスプレイと制御回路でしたので、10進数で2桁以上になる場合は、10進数の1桁ごとに2進数4桁を与える必要があります。これは2進化10進数(binary-coded decimal または BCD)と呼ばれます。
たとえば10進数で234
という数を考えます。これは2進数で11101010
ですが、この数をディスプレイに表示するためには2進化10進数0010 0011 0100
に変換する必要があります。
2進数を2進化10進数に変換する方法を調べた結果は、10で割る方法とDouble Dabbleの説明の記事に書きました。これを踏まえDouble Dabbleによる変換回路を作りました。
次の回路が2進数8桁を2進化10進数10桁(10進数で3桁相当)に変換する回路です。0から255までの数値を左にあるカウンター回路で生成し、右の変換回路に渡しています。
動かし始めやカウントアップのタイミングでは出力にゴミが出力されますが、しばらくすると出力が落ち着きます。
上の変換回路には同じ形をした回路が7個斜めに配置されています。そのうちの1つを取り出したのが次の回路です。回路の左側は0から15までの4ビットカウンタで、右側では次の表のような処理をしています。5以上の場合に3を加算、4以下の場合はそのままです。
入力 | 出力 |
---|---|
0 ~ 4 | 入力値をそのまま出力 |
5 ~ 9 | 入力値に3加算した値を出力 |
この回路の処理内容をもう少し詳しく見てみると、次のようになります。この論理式を回路にしたものが上の回路です。10以上が入力されることはありませんので、10以上の入力に対する出力は考慮していません。
入力 | 出力 | ||||||||
---|---|---|---|---|---|---|---|---|---|
値 | 4桁目(8) | 3桁目(4) | 2桁目(2) | 1桁目(1) | 値 | 4桁目(8) | 3桁目(4) | 2桁目(2) | 1桁目(1) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
2 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 1 | 1 | 3 | 0 | 0 | 1 | 1 |
4 | 0 | 1 | 0 | 0 | 4 | 0 | 1 | 0 | 0 |
5 | 0 | 1 | 0 | 1 | 8 | 1 | 0 | 0 | 0 |
6 | 0 | 1 | 1 | 0 | 9 | 1 | 0 | 0 | 1 |
7 | 0 | 1 | 1 | 1 | 10 | 1 | 0 | 1 | 0 |
8 | 1 | 0 | 0 | 0 | 11 | 1 | 0 | 1 | 1 |
9 | 1 | 0 | 0 | 1 | 12 | 1 | 1 | 0 | 0 |
この「5以上の場合に3を加算、4以下の場合はそのまま」を組み合わせることで2進数から2進化10進数に変換する方法はDouble Dabbleと呼ばれています。「2進数を10進数に変換するDouble Dabbleの説明を試みる」の記事でDouble Dabbleの説明をしました。
最後に、2進化10進数への変換回路と7セグメントディスプレイを組み合わせたのが次の回路です。左上から下に向かって、クロックループ、値の設定が可能なカウンタ、2進化10進数への変換回路が並び、右半分はこれまでの7セグメントディスプレイです。
今回の回路をあとで再利用しやすいように、7セグメントディスプレイの下にDouble Dabbleによる変換回路をつなげて再配置したものを作りました。(2023/01/18)