第11回分

ステートマシン

状態遷移はクロックの立ち上がりでないとだめなんでしょうか?

必ずしもそういうわけではありませんが、 立ち上がりにあわせることが多いようです。

タイマの状態遷移図でDONEはなぜあるのでしょう?RUNから直接IDLEでよいのでは?

たしかにそうですね。

ステートマシンは現実では何に使われるのでしょう?

デコーダなどの単純な組み合わせ論理回路だけでは、 クロックにあわせていろいろな動作する論理回路はつくれませんので、 ほとんどあらゆる論理回路、といえると思います。

ステートマシンの状態遷移に無条件のものがあるのはなぜ?

カウンタの例を考えるとよいと思います。 状態遷移そのものに意味がある場合もあるので、 このような無条件の状態遷移が必要な場合もあります。

状態遷移で、IDLE→IDLEのように戻る物も「遷移」と呼び、その条件も「遷移の条件」と呼ぶのでしょうか?

言われてみればちょっと変な気もしますが、そのように呼びますね。

状態変数の決め方がよくわかりません

これは、えいや、で結構です。 ちゃんとした決め方、というのは、かなり奥が深く、 たとえばステートマシンの消費電力を減らすための割り当て方や 次状態決定部の論理回路の規模を最小にするための割り当て方、などが存在します。

ステートマシンの出力信号決定部などからなる構成は習っていないはずです

え。まぢですか。

ステートマシンの状態遷移は、クロックに同期しているので、1タイミングずつ遅れていく、という理解でよいでしょうか?

そのような理解でよいと思います。

タイマの動作で、カウントダウン中は時間を変えられないのですか?

まあ、今回のタイマは、そういう仕様、ということです。

タイマが一番最初に取り入れられた製品は何かわかりますか?

さあ、なんでしょうねえ・・・

符号拡張

2の補数表現の負の数を忘れていた

思い出すいい機会でしたね。

7ビットのー1は"1111111"ですが、127を表したいときはどうすればいいのでしょう?

表せませんね。 7ビットで正負の数を表す場合には、+63〜ー64まで、です。

符号拡張は何のためのものなのでしょう?

数の正負を保ったまま、ビット数をあわせるための操作です

符号拡張で増えるのは00...0か11...1のどちらかだけなんでしょうか?

そういうことになります。

符号拡張はビットシフト演算と考えてよいですか?

ビット数が増えていますから、シフト演算、ではないですね。

符号拡張を使うと、ビット数が異なる数どうしの演算ができるので便利そうだと思った

そうですね。

データバスのビット数を制限するのは、配線(導線)の本数が少ない方がいい、ということでしょうか?

基本的にはそういうことです。 無限に配線を使ってよければ、何本でもよいのですが、 現実にはなるべく減らしたいので、最小限の本数にします。

記述と回路の質

消費電力が大きいと回路の質が低下するそうですが、大きい消費電力は回路のどこに影響するのでしょう?

ええと、表現のしかたがわるかったですかね。 質の高い回路=消費電力が低い回路や高速な回路、美しい回路、のような意味です

データパスと制御部を分けることと、記述を手続きできではなく一般的・独立的に記述することは、同様な効果を得られると考えてよいでしょうか?

そのような理解でよいと思います。

構成の意識の違いにより、合成後の回路の質が変わってくるのはなぜでしょう?

論理合成のプログラムが、未完成だから、でしょうね。 本来ならば、同じ機能の回路なのですから、同じように最適な回路が 合成されるべきですが、なかなかそうはいかないのが現実(現状)です。

構成を意識しないVHDL記述では、具体的にどこがよくないのでしょうか?実際に矛盾が生じることはあるのでしょうか?

動作自体は、問題はありません。 ただ、全体の回路規模が大きくなったりしがち、ということです。

大きい回路では、データパス・制御部のように分けるほうがよいとのことですが、どの程度の大きさの回路から分けるべき?

うーむ。どんなもんでしょうね。 個人的には、このタイマぐらいの回路であれば、 どちらでもよいような気はします。

タイマの構成を意識しない記述では、カウントダウンは1になったら終了ということなのでしょうか?

いえ、cnt_tmpが1減る動作と、cnt_tmpの値をif文でチェックする動作は 同時に起こりますので、cnt_tmp=1ならば、done='1'にして DONE状態に遷移しないとまずいのですね。

構成を意識しない記述の方が、記述が短くてよいように思えるのですが、回路の質が落ちるのはなぜでしょう?

回路の構成が整理されていることを明示しているから、といえるかと思います。

構成を意識した記述としない記述では、どれぐらい回路の質が違ってくるのでしょう?

教科書に具体例が載っていますので、一例として参考にしてみてください。

その他

タイマの制御部の中の「if(done/='0')then...」の条件の意味がよくわかりません

doneが'0'でないとき、つまりdone='1'のとき、ということですが、 それはカウントダウンが終わったとき、ということですね。

VHDL記述のport map...の部分がよくわからない

呼び出しているインスタンスの、どのピンにどの信号をつなぐか、を 示す書き方です。 実はさりげなく前回あたりから、2通り目の書き方が出てきていました。

i0 hoge port map (a=>aa, b=>bb);
↑のように書くと、hoge回路のaという名前の端子にaaという信号を、 bという名前の端子にbbという信号をつなぐ、という意味になります。

i0 hoge port map (aa, bb);
↑のように書くと、hoge回路の端子のうち、最初の端子にはaaという信号を、 その次の端子にbbという信号をつなぐ、という意味になります。

梅雨のど真ん中ですが、回路の動作には影響はあるのでしょうか?

あまり影響はないようですね。

回路が複雑になると、プログラムのように上から下へ処理が流れるわけではないので、考えるのが難しいです

たしかにそうですね。

前回の演習の7セグメントの回路は、最初のカウンタに付け足すのではない最初から作れますか?

もちろんできますよ。ぜひチャレンジしてみてください。

もう少しゆっくりしゃべってください

こればっかりはほんとうにすいません。 あまり分量を減らすわけにもいかないのが悩ましいところです。

黒板の下の方は見えにくいので、あまり下の方には書かないでください

これは、気をつけていたのですが、もう少し上の方がいいですね。 気をつけます。
戻る