質問の内容は「10進カウンターについて、10番目のパルスが入った時にカウンターがリセットされるのはどういう理屈なんですか?教えて下さい
」っての。
さぁ、何を悩んでいらっしゃるのだろう。
まず手っ取り早い答えを書いてしまおう。
10進カウンタってのは、0⇒1⇒2⇒・・・⇒8⇒9⇒0矢印1・・・っていうカウントをするモノだ。
カウント値9の特にパルスが入ったら、カウント値を0に戻すためにカウンタをリセットするのだ。
デジタルの世界では(2のn乗)進数カウンタが普通なので、カウンタをリセットしてやらないと
カウント値9(=2進数の1001)の次はカウント値10(=2進数の1010)になってしまうのだ。
ちなみに、普通に10進カウンタって言ったら、10進数1桁のカウンタを言うんだ。 |
もすこし知った風に書いてみると、こうなる。
デジタルの回路は、10進数よりも2進数と、2進数をタバねて作れる (2のn乗)進数が自然だ。
だから、デジタル回路で4bitカウンタを作ると、4'b1001 の次は 4'b1010 にカウントアップするのが自然であって、自動的にゼロ=4'b0000
には戻らない。
だから、4'd9 の次に 4'd0 に故意に戻してやらないと、10進カウンタは作れない。
カウント値を故意に4'd0に戻してやるために、カウンタをリセットするのだ。 |
あー、4'bxxxxってのは、4bit長の2進数ってイミで、4'dxってのは、4bit長の10進数ってイミね。
これ、もしかして、カウンタをVelilogで作ってみたりすると、もっと明確かも。
左側はVelilogで書いた10進カウンタで、右側は1行ごとのコメントね。
module Counter(Clock,Reset,Q);
input Clock,Reset;
output [3:0] Q;
reg [3:0] Q;
always @ ( posedge Clock ) begin
if (Reset) Q <= 4'h0;
else if (Q==4'd9) Q <= 4'd0;
else Q <= Q+1;
end
endmodule |
Counterという名称の回路と入出力端子を定義
入力端子を定義
出力端子を定義。Qってのがカウント値出力だ。
回路内部のFlipFlopを定義
Clock信号の立ち上がりで動くFlipFlopを記述
Reset入力が'1'の時にはカウント値を初期化してゼロにする
カウント値が4'd9の時には、次のClockでカウント値を4'd0にする。
それ以外では現在のカウント値に1を足した値をカウント値にする。
FlipFlop記述の終了を宣言
Counter回路の記述の終了を宣言 |
まぁ、このヘンまでが、ふつーの回答案かな。
これらの答えで満足する人は、この先を読んではいけない。きっと混乱するw 何故混乱するかって?
上の回答は、「デジタル回路に慣れた人が使う暗黙の了解」を、なにげに使ってる。
こっから下は、この暗黙の部分に踏み込んでるから、ちょっとだけ哲学的あるいは宗教的な思考になってる。
だから、フツーの人は読まない方がイイ。 ヒマな人だけ読んでくれw
|
まずは「カウンタ」ってどんなモンだか、判るかな? 数を数えるモノだ。
何の数を数えるかって? クロック入力のパルスの数、もしくはエッジの数だ。
基本的なカウンタは、初期化でカウント値がゼロになって、クロック1発入る毎に、カウント値を進めていく。
(もちろん初期値がゼロではないカウンタも世の中には存在するが、特に初期値指定が無い限り初期値はゼロだろー)
1番目のクロックパルスでカウント値が1になって、2番目のクロックパルスでカウント値が2になって、、、(中略)、、、10番目のクロックパルスでカウント値が10になって、11番目のクロックパルスでカウント値が11になって、、、(以下略)
ほーら、10番目のクロックでカウント値はリセットされていないでしょぉw
単純に「カウンタ」って言ったら、クロックが何発入ろうが、決してリセットされない。
ツイデに言うと、上に書いた基本的なカウンタの動作って、10進数を扱うカウンタでも2進数を扱うカウンタでも、おんなじ。
ただ、カウントする数の表現方法が違うだけだ。
|
上の説明を読んで、「え゛〜?!」とか思う人って、結構多い思う。ボクも、上の段落を書きながら「え゛〜?!」とか思った。
でもカウンタの本質って、上に書いたとおりだ。ただし、そんなカウンタは現実にはお目にかかれない。
なんで上の「基本的なカウンタ」が現実に存在しないかって?
現実世界において「無限大」を表現可能なものは無限大の規模になっちゃうからだ。
で、上の基本的カウンタってのは、カウント値の上限が無く無限大まで数えられるカウンタ、すなわち「∞進カウンタ」だ。
|
現実に存在し得るカウンタは、必ずカウント値の上限があって、数を表現する方法が決められる。
65535まで数えられて、カウント値を2進数で表現するカウンタは、16bit2進カウンタ、または65536進カウンタだ。
16bit2進カウンタと65536進カウンタは、回路としては全く同じ。何に着目して名前を付けたかが違うだけ。
じゃぁ10進カウンタって何だ? 普通は、数を10進数で表現するカウンタの1桁分を言う。FlipFlopの数は4ヶだ。
1桁の10進数で数えられる数は、ゼロから9までだ。
9番目のクロックパルスでカウント値が9になって、その次のクロックパルスで10進カウンタはどう動くべきか?
世の中には、カウント値がカウント可能な最大値に到達した後は、クロックパルスが何発入ろうが最大値を維持するカウンタ、なんてものザラに存在する。
10進カウンタなんたけど、10までカウントして、「10っていうカウント値はオーバーフローを示す」っていう定義のカウンタだって存在する。
ただし、一般的な1桁の10進カウンタは、9の次はゼロに戻る。
何故それが一般的かってぇと、1桁の10進カウンタを2ッ以上繋げてn桁の10進カウンタを作る場合のコトを考えれば理解できる。
カウント値が9の次のカウント値は10になるワケだけれど、10進カウンタの2桁目が1になるのと同時に1桁目は0に戻ってくれないと困る。
だから10進カウンタの1桁分だけ抜き出した場合、カウント値9の次はカウント値0だ。
|
そういうワケで、最初の質問文で、「10進カウンタ」という単語を、「10進数1桁のカウンタ」って書き直すせば、答えは簡単に判ると思う。
で、「9の次のカウント値をゼロに戻す」っていう動作を、大幅にハショって「リセットする」って表現を使っている。
つまり「1桁の10進カウンターは、10番目のパルスが入った時にカウント値をリセットしてゼロに戻す」って書けば、そんなに悩まなくても良い問題になるかと思う。
|
ちなみに、20世紀の人類にとって10進数ってのはごく自然な数え方。
けれどそれは、「我々の遠いご先祖サマが数を数えれるようになった時に、たまたま10本指の生命体に進化していた」って言うダケのコト。
我々には10進数がいかに自然に感じたとしても、全宇宙ひっくるめて見た場合は10進数が自然であるとは限らない。
タコが知能を持ったら、きっと8進数を使うだろう。
イカが知能を持ったら、きっと我々の良き友人になるだろう。
12本指の生命体に進化した火星人は、平気で12進数を使うだろう。 (ホントか?)
16本指の生命体に進化した金星人は、論理学が得意かもしれない。 (・_・;)
ムカデが知性を持ったら、きっとキモチワルイ。
う・・ん、これはきっと眠たいんだ、寝よう、おやすみぃ(^^;
|