- 締切済み
HDLでの回路設計
入力信号A(2bit) 制御入力信号C 出力X1、X2 Cが0→AをX1にそのまま出力 Cが1→Aの上位ビットをX2に出力 この機能を持つ切り替え回路をHDLで設計したいと思うのですが、 いまひとつよく分かりません。 Aを連接演算で表す(?)とかAを右に1シフトさせて、それを1bitの X2に出力する(ビット幅が違うけど大丈夫なのだろうか?)など、 考えてみてもそれをどう書けばいいのかわかりません。 根本的に考え方が違っているのかもしれませんが・・・。 教えていただけないでしょうか。お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Werner
- ベストアンサー率53% (395/735)
ああ、自学ではなく教える人がいるんですね。 とりあえず私なら問題がおかしいと文句言い(質問し)に行きます。 文句言いに行かないならA.No3のコードで提出する。 > これだと制御入力信号Cは意味がないのでは? 意味無いですよ。 でもその問題を見てる限りではそれで良さそう(正しそう)に思えるから 私は疑問を呈してるんです。 出力X1に出力したい信号が「Aをそのまま」しかないので、 切り替える必要性がないんですよ。 > 出力しない方が未定義(でしたか?)だとできないのでしょうか? できないと言ってる訳じゃなくて、 未定義をdon't careだと素直に解釈すると 前に示したように切り替えする必要性が無くなるから、 それは切り替え回路といえるの? という疑問です。 切り替えるって言ってるのに、ただ信号分配してるだけですよ、これでは。 例えば、 『制御入力信号Cが0ならばAの信号をそのまま出力Xに、 制御入力信号Cが1ならばAの信号の上位bit下位bitを入れ替えて出力Xに出力する。』 なら切り替えているという感じがしますけどねえ。 一応、あえてxを出力するように書くと以下のようになりますが、 ANo.3の書き方でなくわざわざこのような書き方をする必要性は普通はないですね。 (xを能動的に代入すること自体まずしない。) module FIRST(A,C,X1,X2); input [1:0] A; input C; output [1:0] X1; output X2; assign X1 = (C == 1'b0) ? A : 2'bxx; assign X2 = (C == 1'b1) ? A[1] : 1'bx; endmodule
- Werner
- ベストアンサー率53% (395/735)
function ってoutput書けましたっけ? 普通は、関数名に代入するとそれが返り値として使えるという形になるのですが。 ↓こんな感じで。 function [1:0] func_X; input [1:0] A; input C; begin if(C==1'b0) func_X = A; else func_X = ~A; end endfunction assign X1 = func_X(A, C); なお、これくらいならfunctionつかわなくても以下のように書けます。 assign X1 = (C==1'b0) ? A : ~A ; A.No2で言及したのと同じ事ですが、 以下の記述ではダメなのですか? module FIRST(A,C,X1,X2); input [1:0] A; input C; output [1:0] X1; output X2; assign X1 = A; assign X2 = A[1]; endmodule これで常にX1にAが出力されているので もちろんC==1'b0の時にもX1にAが出力されています。 X2についても同じ。 > C==0ならばX1だけを、C==1ならばX2だけを出力したいのですが、どうすればいいのかわからないのです。 outputが2系統あるのに切り替えをしたい理由が私には分からないです。 outputが1系統しかないので、Cの値によってAかBのどちらかを出力するselectorを作ろうというのならまだ分かりますが…。 C==0ならX1だけをと言いますけど、じゃあC==0のときのX2はどうするのですか? なんでもいい(don't care)なら先に示したコードのようにCを見る必要はなくなります。 > シュミレーションや論理合成などはその中でならやりましたが、 > 自分が作ったものをシュミレーションできません。 > つまり、シュミレータなどはなく、学習中のシュミレーションなどは、あたかもシュミレータが > あるかのようにしているだけらしいです。 この辺りのことが、よく分からないです。 自分が作ったものでなければシミュレーションできるのでしょうか。 回路は外から信号を入れないと動かないので、 シミュレーションするためには「外から信号を入れる」というシミュレーション記述を 書かなくてはいけないことは分かってますか? ModelSimなどのシミュレータは本当にないのですか? シミュレーションできないとしたら、 期待通りに動作していることをいったいどうやって確認するつもりだったのでしょうか? # たまに見かける間違い ×シュミレーション、シュミレータ ○シミュレーション、シミュレータ
補足
>これで常にX1にAが出力されているので >もちろんC==1'b0の時にもX1にAが出力されています。 >X2についても同じ。 これだと制御入力信号Cは意味がないのでは? 課題について問われても、そういう問題を出されたとしか言えないのですが・・・。 『入力信号A(2bit)に対して、制御入力信号Cが0ならばAの信号をそのまま出力X1に、 制御入力信号Cが1ならば、Aの信号の上位1bitを出力X2に出力する。 この機能を持つ切り替え回路について、HDLで回路設計しろ。』 としか記されていないんです。 動作については先生が判断するのではないかと思いますが。 >自分が作ったものでなければシミュレーションできるのでしょうか。 いえ、シミュレーションのやり方はやりましたが、それはあくまで仮想的なものです。 あたかもシミュレーションしたかのように見せているだけで、実際はシミュレータを使っているわけではないのです。 そういうソフトらしいので。 >outputが2系統あるのに切り替えをしたい理由が私には分からないです。 僕は、まだ日が浅いのでそういうのはいまひとつ分からないのですが、『outputが2系統あって、切り替えできる』という動作をするようにはできるのですか? 出力しない方が未定義(でしたか?)だとできないのでしょうか?
- Werner
- ベストアンサー率53% (395/735)
結局どのHDLなのか教えてくれないし…。 (あと「AをX1にそのまま出力」あたりの疑問についても。) 勝手にVerilogHDLで説明しますが、 > input [1:0] A; なら A[0] でAの0ビット目、A[1] でAの1ビット目が取れます。 A == 2'b01 なら A[0] == 1'b1 A[1] == 1'b0 です。 (これは実際に確認してみれば分かると思います。 まさか設計してるのにシミュレータが無いって事はないでしょう?) こんなのは基本的なところなのでよく分からなければ(またはVHDLとか使ってるなら) 使ってる文法書や入門書でも読み返してください。 > 未定義でもいいのだと思いますが。 未定義(というよりdon't careか)なのでしたら、 信号Cを見る必要が無くなりますね。 常に ・AをX1にそのまま出力 ・Aの上位ビットをX2に出力 してれば良いわけで。 # もし質問を続けるなら、使っている言語と、 # 作成中のコードくらいは提示してください。
補足
すいません。書き忘れていました。VerilogHDLです。 X1も2bitだと思います。 コードなんですが、 module FIRST(A,C,X1,X2); input [1:0] A; input C; output [1:0] X1; output X2; function [1:0] X; input [1:0] A; input C; output [1:0] X1; output X2; begin if(C==1'b0) X1 = A; else X2 = A[1]; end endfunction assign ___________ endmodule とりあえずこういう形になっているのですが、アンダーバー部分がわかりません。 C==0ならばX1だけを、C==1ならばX2だけを出力したいのですが、どうすればいいのかわからないのです。 doutを宣言してX1,X2を代入するとしても、それは結局X1,X2に出力しているのではなく、 もともとX1、X2を宣言する意味がなくなるのではと思いますし・・・。 それと、CD-ROM(?)で学習しています。ワークブックみたいなものもついていますが、 パソコンにCDをインストールし、それを起動させて学習しています。 シュミレーションや論理合成などはその中でならやりましたが、自分が作ったものをシュミレーションできません。 つまり、シュミレータなどはなく、学習中のシュミレーションなどは、あたかもシュミレータが あるかのようにしているだけらしいです。 まだ始めて1週間くらいで、見当違いのことをいっているかもしれませんが、おねがいします。
- Werner
- ベストアンサー率53% (395/735)
「この機能」がどんな機能なのか分からないのですが…。 > Cが0→AをX1にそのまま出力 Aは2bitだけどそのまま出力するって事はX1も2bit? このときのX2の値は未定義なの? > Cが1→Aの上位ビットをX2に出力 このときのX1の値は未定義? どのHDL使ってるのか知らないけど、 多ビット信号から一部ビットだけ切り出したいなら A[0]、A[1] みたいにして各ビットの値が使えるはず。
補足
> A[0]、A[1] みたいにして各ビットの値が使えるはず。 もしAが01だとすると、A[0]は1ということですか? > X2の値は未定義なの? > X1の値は未定義? 特に記されていませんので、未定義でも文法上問題ないようでしたら 未定義でもいいのだと思いますが。
お礼
なるほど。Wernerさんがこの問題に対して疑問を持っている理由がなんとなくわかりました。 書けるけど書く意味がわからないということでしょうか。 とりあえず先生に尋ねてみようかと思います。 長々とお付き合いいただきありがとうございました。 わざわざコードまで書いていただき感謝しています。 これからもっと学習を重ねていきたいと思います。