アフィリエイト広告
アフィリエイト広告

ロジックICで作る電子サイコロ

電子サイコロを、ロジックIC で作ってみました。

この電子サイコロの回路は「しなぷすのハード製作記」を参考にさせていただきました。ありがとうございます。仕様、設計方法など詳細にご説明されていますので、ぜひご参照ください。

電子サイコロの仕様

ロジックICで作る電子サイコロ

電子サイコロというと、乱数を生成して〜と考えちゃうんだけど、しなぷすさんのこの電子サイコロは乱数を使っていません。1から 6までの数値を循環させて、人がスイッチを操作することで、そのうちのひとつの数値を選ぶ、という仕組み。

じっさい、6つの数が刻まれたサイコロを振ることでひとつの数を選ぶわけですから、理にかなっている、気がします。乱数を生成しているのは、人、ということですね。

ということで。
押しボタンを押したときに、約 20KHzのクロックを 4ビットカウンタでカウント、1~6の数を生成、循環させておく。押しボタンを離すとカウントが止まり、そのときのカウンタ出力が出目となる。
そんな仕組みを、ロジックIC でつくります。

電子サイコロの回路

基本的な回路構成はしなぷすさんの電子サイコロとおなじです。
が、カウンタは JKフリップフロップを利用することにします。理由は、組み合わせ回路が簡単になるから。そして、部品箱に CD4027B があるから。

サイコロの目の LED配置

図1. LEDの配置
図2. サイコロの出目とLED制御

サイコロは、図1 のように 7つの LEDを配置して出目を表示させます。

右列の Qa’、Qb’、Qc’ の LEDは、つねに左列の Qa、Qb、Qc とそれぞれ同時に点灯しますので、4組の LEDを点灯制御すればよいです。

したがって、出目に対して図2 のような 4ビットの値を出力させます。このビット列は、4ビットカウンタで出力することが可能です。その方法は、これまでにやってきた 4ビットカウンタと組み合わせ回路の応用です。むずかしくはないですね。

カウンタ回路の設計については「論理回路 / 10 進同期カウンタと 7 セグ LED」などを参照してください。

カウンタの設計

図3. JK-FFの出力の遷移

では、カウンタ回路を設計していきましょう。

JKフリップフロップの出力の遷移を覚えていますか? (参照「論理回路 / 4 進同期カウンタ (2bit)」)
図3 は、JKフリップフロップの出力の遷移から、入力の状態を示した表です。たとえば、Q が 0 から 1 に変化するとき、J=1 で、K は Don’t care です。
これをもとにして、図4 の真理値表を作成しました。

図4. 電子サイコロ 出目カウンタ 真理値表

出目に対する値が Qa~Qd、次に遷移する値が Da~Dd です。その遷移に対応する入力 J、K を表しています。出目以外の値は、すべて Don’t care です。

カルノー図は省略。真理値表より求めた論理式は、以下のとおりです。

Ja = Qc ⋅ Qd    Ka = Qb
Jb = Qa ⋅ Qd    Kb = 1
Jc = 1          Kc = Qb
Jd = 1          Kd = 1

真理値表はちょっとややこしいですけど、論理式はとても単純ですね。

カウンタ回路

論理式をもとにつくったカウンタ回路です。クロック回路なども含んでいます。

図5. 電子サイコロ 出目カウンタ回路図

上部が、JKフリップフロップによるカウンタ回路です。説明するまでもない 4ビット同期カウンタです。

左下は、これも何度も使ってきたインバータによる矩形波発振回路。今回は約 20KHzを発振しています。押しボタンスイッチの出力を ANDゲートに入れて、クロックの出力をオンオフしています。
その右のインバータの回路は初期化回路です。電源オン時に初期化パルスを出力します。今回は、点灯チェックのためにすべての LEDを点灯させました。押しボタンを押したときも全点灯しますので、まぁ同じ動き、ということで。

電源は 5Vです。なんでもいいのですが、今回は USBから取りました。乾電池 3本でいけるかもです (未確認)。74シリーズは最大電圧 7Vですので、ご注意を。

カウンタ回路のシミュレーション

カウンタ回路は、鉛筆カリカリチェックしてもよいのですが、たまに verilogHDL 使わないと忘れちゃうので、シミュレーションしてみましょう。

詳細な説明は割愛します。「VerilogHDL シミュレーション環境のインストール」など参照してください。
JKフリップフロップの記述は初めてですけど、みたとおりです。

回路記述
  1. module JKFF (
  2.   input wire J, K, CLK, SET,
  3.   output reg Q
  4. );
  5.   always @(posedge CLK, negedge SET) begin
  6.     if(1'b1 == SET) begin
  7.       Q <= 1'b1;
  8.     end
  9.     else if(1'b1 == J) begin
  10.       if(1'b1 == K) begin
  11.         Q <= ~Q;
  12.       end
  13.       else begin
  14.         Q <= 1'b1;
  15.       end
  16.     end
  17.     else begin
  18.       if(1'b1 == K) begin
  19.         Q <= 1'b0;
  20.       end
  21.     end
  22.   end
  23. endmodule
  24. module DICE (
  25.   input wire CLK, SET,
  26.   output wire [3:0] Q
  27. );
  28.   wire Y0, Y1;
  29.   assign Y0 = Q[0] & Q[1];
  30.   assign Y1 = Q[0] & Q[3];
  31.   JKFF ff0(.J(Y0), .K(Q[2]), .CLK(CLK), .SET(SET), .Q(Q[3]));
  32.   JKFF ff1(.J(Y1), .K(1'b1), .CLK(CLK), .SET(SET), .Q(Q[2]));
  33.   JKFF ff2(.J(1'b1), .K(Q[2]), .CLK(CLK), .SET(SET), .Q(Q[1]));
  34.   JKFF ff3(.J(1'b1), .K(1'b1), .CLK(CLK), .SET(SET), .Q(Q[0]));
  35. endmodule
テストベンチ
  1. module DICETEST;
  2.   reg CLK, SET;
  3.   wire [3:0] Q;
  4.   parameter CYCLE = 10;
  5.   DICE DICE(CLK, SET, Q);
  6.   always begin
  7.     CLK = 0; #(CYCLE / 2);
  8.     CLK = 1; #(CYCLE / 2);
  9.   end
  10.   initial begin
  11.     SET = 1;
  12.     #(CYCLE * 1.6) SET = 0;
  13.     #(CYCLE * 15) $finish;
  14.   end
  15.   initial begin
  16.     $dumpfile("diceTest.vcd");
  17.     $dumpvars(0, DICETEST);
  18.   end
  19. endmodule

図6 がシミュレーションの結果です。
初期化時の出力が 1111 ですが、1111 → 0000 → 0011 と遷移していきますので問題ないですね。その後は、真理値表どおりの出力が得られています。

図6. 電子サイコロ 出目カウンタのシミュレーション結果

サイコロ表示回路

図7. サイコロ出目表示回路図

図7 は、サイコロの出目を表示する LED回路です。

JKフリップフロップ CD4027B は 1mA程度しか出力できませんので、LEDの駆動にはトランジスタなどが必要です。

いつものように 2SC1815を使った回路です。LEDには 3mAほど流しています。高輝度LEDなら充分な電流です。お好みで調整してください。

ブレッドボード

図8. ブレッドボードのようす

ブレッドボードです。

左下が、矩形波発振回路と初期化回路のインバータ 74HC04。タクトスイッチをはさんで、ANDゲート 74HC08 と、JKフリップフロップ CD4027B が 2個です。

左上が、電源の USB-Bコネクタ。
その右に、出目表示の LEDが並んでいます。ここはサイコロらしくするために、冒頭の動画のようにカバーをしています。にわかづくりのご愛嬌です (^_^;)
右端は、LED駆動用のトランジスタ 2SC1815です。

まいど回路図には描いてませんが、ICにはパスコンをつける、未使用端子を適宜処理する、など、してあります。

製作後記

サイコロを振る、なんてシーン、ないよねぇ。こどものころに遊んだ双六ぐらいのもんだ。

しかし、最近孫が遊んでいた双六は、いわるゆサイコロでなくてルーレット式だった。だから、サイコロの目の並び方なんて、アナログ時計の文字盤のように、忘れ去られていく存在のような気がする (;´Д`)

そんなノスタルジーは置いといて。

この電子サイコロを 1000回振ってみました。その結果の出目率は、

1 : 17.2%        2 : 15.6%        3 : 16.8%
4 : 16.1%        5 : 15.8%        6 : 18.5%

となりました。

出目率が 1/6 になってない、などと言われますな。ふつうのサイコロだって 5 が出やすいっていうじゃないですか。出目率 1/6 のサイコロを作るって、ものすごい技術が必要なんだそうですよ。
サイコロとしては充分な出目率だと、俺は思います。

押しボタンを押しているとき、表示が循環しているので全点灯しているようにみえます。ここんところは、全消灯のほうがいいのかなぁとも、思います。押しボタンを押した時に、LEDの電源を落とすとか、トランジスタのベースを引っ張るとかしてやりゃいいので、回路的にむずかしくはないです。
表示がグルグル回るといったギミックも、一興かもしれません。出目が 1 のとき、表示が大きくなるなんてのも、楽しいかも。ちょっとむずかしくなるけどね。

お好みで、いろいろ考えちゃってくださいませ。

タイトルとURLをコピーしました