第8回分

VHDL全般

elsifとelse ifの、結局どちらが正しいのでしょう?

すいません、すべて誤字で、elsif、が正しいです。

ifはthenと続くが、else ifがbeginで始まるのはなぜ?

すいません、これも誤字で、thenが正しいです。

process文の中のプログラムの内容は一定時間に何回ぐらい実行されるのでしょう?

実行される、というより、センシティビティリストに書かれた 信号が変化したときに、それの変化が出力に伝わるような 回路がつくられる、という理解でよいと思います。

加算器の例で、入力が8ビット、出力が9ビット、ということだったが、出力にはキャリーが含まれるので、結果としてビット数は同じという理解でよいでしょうか?

出力x(加算結果)は8ビット、ですね。 内部で、加算結果を求めている変数tmpが9ビットで、その最上位の1ビットは キャリー出力、残りの8ビットが出力x、になっています。

加算器の例で、ビット幅をあわせるのは、最初からビット数を増やしておいてもよいでしょうか?

出力の方が、キャリー出力の分だけ1ビット多いので、 一時的にでも、内部で9ビットで求めないといけませんね。

エンコーダの例で、右の方を優先する、とあったあ、それをプログラム上でも記述しなければならないのか?

if文を使った記述例では、if文の条件は上から順に評価されていきますので、 結果として、一番右(a(0))が1であれば、それが最優先で評価されることになります。

VHDLで、入力と出力を与えて、作っているものはなんでしょう?

入力と出力の間の関係を決めるもの、つまり論理回路、でしょうか。 禅問答みたいですね。

シングルクオートとダブルクオートの違いはなんでしょう?

1ビットの数値はシングルクオート、2ビット以上はダブルクオート、です。

乗算器の論理合成の結果は、使うライブラリや論理合成ツールによって異なるということでしたが、どれぐらいの差が出るのでしょう?

明示的に並列乗算器を使う、などの指定はできないことが多いので 一概にはいえませんが、同じライブラリ(トランジスタ性能など)であれば ほぼ部分積の段数で決まるでしょうね。

パリティジェネレータがよくわからなかった

多ビットのXOR演算を求める関数br_xorをつくっているところがポイントですので、 ぜひもう一度復習してみてください。

不定値は、初期化していないときに現れるのでしょうか?

初期化していない変数でシミュレーション上現れます。 ただし、実際には電圧が低い0、となることが多いようです。 そのほか、順序回路では、フリップフロップのセットアップ時間が 足りない場合など、値を確定させられない場合でも現れます。

不定値でも、回路は0か1かに判定しないといけないのではないのでしょうか?

不定値とは、実際にはどのように出力されてくるのでしょう?

その通りで、実際には、ほとんど場合、0か1、になります。 しかし、本来、論理回路は、値が「確定」しているべきですので、 「どっちになるかわからない」状態がありうる回路は、マズい、といえます。

加算器の例でのtmpの初期化と代入時でそれぞれ:=と=>を使っていたが、その使い分けは?

変数(variable)への値の代入は:=を使い、 信号の割り当て/接続は<=を使います。

エンコーダの例で、when "xxxxxxx1x"と書くと、"xxxxxxx1"とで矛盾が生じるので、"xxxxxx10"と書けばよいのでしょうか?

そういうことですね。

クロックと同期して働く回路はどのように作ればよいのでしょう?

それは、中間テスト明けに、ゆっくりやりましょう。

除算器は作れないでしょうか?

前回ありましたが、 減算器を繰り返して使う、という構成が一般的のようです。

パリティジェネレータの例で、for文のiは初期化しなくてもよいのでしょうか?

あの例でのiは、i in a'rangeとありまsので、 aのビット幅の範囲で順番に設定されていきます。

通信でのパリティを用いたエラーの処理はどのようにやるのでしょう?

それは、今回のパリティジェネレータの機能ではありませんね。 エラー訂正回路、のようなものを設計することになります。

エンコーダやデコーダはどのようなときに使うのでしょう?

機能通り、デコーダは、2N本から1本だけを選ぶ場合で、 例えばメモリの中のアクセス対象のセルをアドレスバスで選ぶ場合、 なんかも使いますね。

セレクタはどのようなときに使うのでしょう?

機能通り、いくつかの信号からどれか1つを選びたい場合、でしょうか。

whenなどで不定値Xを用いたVHDL記述は、実際の回路ではどのようになるのでしょう?

真理値表やカルノー図でいうところの「don't care」項の扱いと同じと考えると よいかと思います。

variableとsignalの違いは?

variableは値を決めるために一時的に使うもの、 signalは、それによって値を決めたもの、 というような感じでしょうか。

センシティビティリストの要素が複数ある場合は、そのどれか1つが変化しただけで回路が動作する、ということでしょうか?

動作する、というか、それらの変数の変化が出力に反映されるような 回路になる、ということです。

VHDL記述はは回路の機能であり動作であるということは、どのように効率のよいソースを書いても計算時間は変わらないということでしょうか?

これはなかなか深い問題です。 理想的には、計算時間(回路の動作速度、ということですね)は変わらない、といえます。 しかし、実際には、記述方法によってできあがる回路に差が出る場合が多く、 従って記述にはコツがあります。 これは、この授業の後半で扱う予定です。

VHDLで自作の関数は作れるのでしょうか?

funciont、で作れますよ。

乗算器では*だけで済んだのに、加算器はなぜtmpを使ったりしないといけない?

実は本質的な理由はないように思いますが、 出力が、キャリーと和で分かれている、ということから、 わかりやすくするため、というところでしょうか。

シフタを、乗算器や除算器と乗数/除数を生成するデコーダを組み合わせた回路で作る方法より良い方法はあるんでしょうか?

シフタは、x<=a*2、のように書いてもいいのだろうか?

それでも確かにできますね。 ただ、シフタは、バレルシフタと呼ばれるよい回路が知られているので、 それを使うのがよさそうです。

その他

半加算器や全加算器などのメジャーな部品はライブラリとして提供されていないんでしょうか?

たいていの場合は、あります。

中間テストでは、プログラムをすべて書くような問題もあるのでしょうか?

さすがにそこまでは出さない予定です。 まだ問題つくってませんので、保証はできませんけど。

中間テストでは、プログラムの穴埋めや記述問題が出るのでしょうか?

さあどうでしょう・・・ 穴埋めぐらいは作ろうかと思っていますが、 まだ問題つくってませんので・・・

実際にVHDLを用いてCPUやマイコンの設計は行われているのでしょうか?

最近はほとんどそのようです。

テストに出る問題をアップしてください

さすがにそれはご勘弁ください。

授業中、教科書の該当ページを言ってもらえると助かります

たしかにそうですね。 Webページの資料の方には書いてあるのですが、 授業中も、参照するようにしてみます。

中間試験で持ち込み可にしていただいてありがとうございます

いえいえ。 でも、持ち込み可というとは、「教科書などに書いてあること」は 問われないわけで、「それをちゃんと理解しているか」が問われるわけで、 必ずしも問題が簡単になる、というわけではないですよ。 たしかに丸暗記はしなくてもいいですけど。

授業で、どこが重要なのかよくわからない

なるべく、注意するべき点を明示しているつもりなのですが、 ちょっとまだわかりにくいですかね。 なるべく注意をしてみたいと思いますが、 みなさん自身の、ポイントを読み取る努力も、お願いします。

メモをとれないので、もう少しゆっくり話してほしい

これはなかなかなくせませんね。 もう少し授業の分量を減らしてみましょうかね。

例題や演習を増やしてほしい

分量の兼ね合いが難しいところではありますが、 勘案してみたいと思います。 でもあんまし演習ばかりだと説明もしてくれ、といわれるしなあ・・・

板書をもう少しきれいに書いてください

こればっかりは謝るしかありません。 努力はしますが、なかなかすぐには変われないので・・・
戻る