key :
時計回路
ぶっちゃけ、先ほどの10進カウンタ×3に+αすれば出来てしまう。
新たに作る回路と言えば、10進カウンタをちょっと改造するだけの6進&2進カウンタと7セグメント表示用のデコーダ位かな?
あと、23:59:59の次にちゃんと00:00:00になる様に微妙に10進カウンタを調整しないと・・・
・カウンタの仕様変更
考えその1 | 00:00:00 |
時計を作る上で注意したいのが、23:59:59の次にちゃんと00:00:00なるかどうか。 今までの回路だと、下位の桁だけをチェックしていたけど、1時間の位においては、20時間になった際&3:59:59になった際という条件でもリセットを行わなくてはいけない。 同様に、10時間の位もリセットの動作は23:59:59のタイミングで行わなくてはいけない。 方法としては、20時間になったという情報を1時間の位に送る。若しくは、1時間の位の内部に10時間の位に相当するカウンタを設けてそれを利用するなどが考えられる。また、リセットを行う条件の際にHになる信号を作り、その信号が入るとリセットされるように端子を設けるということも考えられる。 今回は、今後の使い勝手の事を考えて、リセット用の端子を新たに追加する。 |
![]() |
RTL記述 | 解説 |
module cnt_10(clock,reset,cnt_en,res_fo,data_set,data,Q); input clock,reset,cnt_en,res_fo,data_set; input [3:0] data; output [3:0] Q; reg [3:0] Q; always @(posedge clock or negedge reset) begin if (reset == 0) Q <= 4'h0; else if (data_set == 1'b1) Q <= data; else if (((Q == 4'h9) && (cnt_en == 1)) || (res_fo == 1)) Q <= 4'h0; else if (cnt_en == 1) Q <= Q + 4'h1; else Q <= Q; end endmodule |
追加記述は赤字の所のみ。後は、そこに入れる信号を上手く作るだけ。![]() そして、青字の箇所をNに変更すれば、N進のカウンタが完成する。 |
・時計全容
考えその1 | 00:00:00 |
回路を記述する前に、回路図を書くのだけれど、ちょっとでかくなって扱いづらくなってきたのでボックス化。 あとかこれをうまく組み合わせて使うだけー。 |
![]() |
回路 | 解説 |
![]() |
見てもらえば大体分かると思うけれど、各ボックスのcnt_enには、下位ボックスの最大カウント数の合計。 そして、1時間、10時間の位においては、23:59:59になった際にHになる信号をres_foに入力している。 res_foによる強制リセットが無い他のボックスはその箇所はアースに落としておけば大丈夫です。⇒ .res_fo(1'b0) あとはそれぞれの信号を入力すればOK これの記述は コチラ |
7セグデコーダは002に書いてあるので、それを使っちゃえば問題ないんで各Qに接続すればOK。