この回路の、ドコがどう割り算かって?
さぁ(^^; そういう学術的な難しい質問には、筆者はよー答えません(^^;
それでもちゃんと動くから、ほれ、シミュレーション結果でも見てみなはれ(笑)
ちなみに、この回路、3で割ってみたい数を、IN入力に入れるんだけど、符号なし8bitだからね。つまり0〜255。
で、クロックが止まった時にKOTAE出力に出てる値が3で割った答え、AMARI出力に出てる値が3で割った余りだ。
どーだ判りやすい端子名だろー。でも、割り算の答えって、何で「商」って言うんだろうねぇ。。。。
とりあえず、符号なし8bitの最大値、0xFFを3で割ってみる。

えっと、0xFF÷3=255÷3=85+0/3=0x55+0/3。 ほら、合ってるじゃん。
んじゃ次にゼロ(0x00)でも割ってみようかね。

そりゃ答えは当然、商ゼロ余りゼロだわなぁ。
何か適当な数、0x25でも割ってみよう。

えーと、0x25÷3=37÷3=12+1/3=0x0C+1/3。 ほらみろ、合ってるじゃん。
もちっと大きい数、0x98でも割ってみよう。

うーんと、0x98÷3=152÷3=50+2/3=0x32+2/3だ。 どーだまいったか(笑)
|
どんな手抜き回路だとしても、動いてしまえばコッチのもの、勝てば官軍、後はのとなれ山となれ(^^;
おっとイケナイ、せっかく松下先生が質問コーナーからリンク貼ってくれたんだ。
ちとはマジメに解説せねば(^^;
とゆーワケで、上のノペラッとタダっ広い回路、よーく見てみよーかね。
まぁ、よーく見てもよーく見なくても、回路は上段・中段・下段の3つの部分に分かれてる。
上段の回路は、8bitの並列入力直列出力シフトレジスタになってて、
IN入力の値を取り込んで、1クロックに1bitづつ、上位bitから順番に中段の回路に送ってる。
冗談みたいに単純な回路だ(^^;
下段の回路は、8botの直列入力並列出力シフトレジスタになってて、
中段の回路の出力を、1クロックに1bitづつ取り込んで、8bit幅のタバにして出力してる。
これまた単純な回路だ。
問題は中段の回路だぁね。ここで3で割る処理をしている。
中段の回路の動作を、上段回路からの入力をSIN、2個のFlipFlopの出力を左からF1とF2、
下段回路への出力をSOUTとして、
SINとF1、F2の状態ごとに、クロックが1発入ったときにどう動くか、表にしてみようかね。
クロックが入る
前の状態 |
|
クロックが入った
後の状態 |
|
左記を10進数で
判りやすく描いてみると・・ |
SIN |
F1 |
F2 |
SOUT |
SIN’ |
F1’ |
F2’ |
0 |
0 |
0 |
0 |
|
? |
0 |
0 |
|
0÷3 ⇒ 商0、余り0 |
1 |
0 |
0 |
0 |
? |
1 |
0 |
1÷3 ⇒ 商0、余り1 |
0 |
1 |
0 |
0 |
? |
0 |
1 |
2÷3 ⇒ 商0、余り2 |
1 |
1 |
0 |
1 |
? |
0 |
0 |
3÷3 ⇒ 商1、余り0 |
0 |
0 |
1 |
1 |
? |
1 |
0 |
4÷3 ⇒ 商1、余り1 |
1 |
0 |
1 |
1 |
? |
0 |
1 |
5÷3 ⇒ 商1、余り2 |
0 |
1 |
1 |
− |
− |
− |
− |
ありえなーい |
1 |
1 |
1 |
− |
− |
− |
− |
ありえなーい |
わかるかなー。
つまりSOUTってのは、SIN、F1、F2を3bitの2進数としてして見た値を3で割った商になってて、
F1とF2にはその余りが残るんだわ。
別の言い方をすると、F2×4+F1×2+SINの値が3より小さければ、F2’×2+F1’×1はF1×2+SINの値が入る。
3より大きければ、F2’×2+F1’×1の値はF2×4+F1×2+SINの値から3を引いた値になる。
ちなみに、F2とF1が両方とも'1'になる組み合わせは、回路がちゃんと動いていれば起こり得ない。
上の表で、F2’とF1’が両方とも'1'になるパターンで、存在してないでしょ。
F2とF1が両方とも'1'だと、F2×4+F1×2+SINの値が6より大きくなっちゃうから、
ひとつ前のクロックで3で割れるハズなんだ。だから、ありえなーい。
念のため書いておくけど、2進数に対して上位側に1bitシフトするってのは、数値を2倍するコトだからね(^^;
|
なんか、ややこしげなロジックでしょー。
でもこれ実は、筆算で割り算するときの方法と、まったく一緒だったりする。
小学生の頃から電卓使ってる人には、もしかしたら理解できないかもしれない(^o^;
例えば、0x98÷3=152÷3=50+2/3=0x32+2/3を2進数の筆算でやるとさ、こんなんなる。

ほら、上の桁から1bitづつ区切って見てって、3より大きければ3引いて、次のbitをくっつけて。。。
筆算で横線引いて下の段に降ろしていくのは、割り算回路で「クロックが1発入る」のと同じ。
筆算の場合、3を引き算できない場合にゃハショって横線描かないけどね(^^;
筆算で見ている箇所がどんどん右下にズレていくのは、割り算回路で「シフトレジスタでシフトする」のと同じ。
この割り算回路、本当に筆算と同じ動作をしているんだよ。
|
さぁ、割り算回路がシフトレジスタと大小判定と引き算で出来るってコトが判った。
そしたら、任意の数を、任意の数で割り算する回路も、作ってみよーかね。
ま、いつかそのうちね(^^; また気が向いた時にでも(^^;
|