- 締切済み
VHDLにおける「generic」について
VHDLの設計にて、 上位のモジュールから下位へgenericを用いて integer値を渡したいのですが、 この時に最上位のモジュールにおける信号「A」の状態をみて、 下位へ渡す integer値を切替えることは可能でしょうか。 例えば Aが '0'なら integer に 10を代入、 Aが '1'なら integer に 15を代入して下位に渡すという感じです。 やりたいことの記述イメージを書いてみました。 --Top モジュールです ・ ・ (略) ・ architecture component Module <- 下位モジュールの宣言 generic( value: integer:=10 <- generic を宣言 初期値は10 ); ここの値を信号「A」の状態によって切り替える port( din : std_logic; dout: std_logic ); end component; signal A: std_logic; <- 信号「A」を宣言 ・ この値('0'、'1')を見て integer値を決める ・ (略) ・ 単純にif文を使えば、Aの状態によって value へ異なる値を代入することはできますか? それともgenericで一度宣言したら、その後は値を変更できないのでしょうか。 上記に示した方法でなくても、上位のモジュールで何かの値を判断し、下位に渡す generic の integer値を変更できれば構いません。 参考記述、ご紹介頂けると助かります。 説明が分かりづらいかもしれませんが、よろしくおねがいします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- bug_bug
- ベストアンサー率78% (36/46)
論理合成対象だと仮定して・・・ generic値は論理合成時に静的に確定している定数である必要があるので ロジック動作中に動的に変更することは基本的に無理です. valueが変数ならportから入力する必要があります. bit幅の定数など, どうしてもgenericする必要があるならば generic値の異なる2つを両方インスタンシエーションしておいて 上位側にてsignal A相当の信号によってdoutを選択すればOKでは? valueの使い道が分からないのでこれがベストとは言い切れませんが.
補足
ご回答ありがとうございます。 もうちょっと詳しく書きますと、 「value」はカウンタ値の比較対象として使用しており、value 以外にも複数あります。 シミュレーション時に、実際に使用する値を入れているとシミュレーション時間がやたらとかかってしまうので、 シミュレーションを行う時だけはこれらの値を小さくしたいのです。 それぞれの値をひとつずつ書き換えればそれで済むのですが、トップモジュールにおける何かひとつの信号(本質問でいえばsignal A)の '0'(シミュレーション) or '1'(シミュレーションではない) をみてシミュレーション用の値へ一気に書き換えられないかと思い、 今回の質問をさせて頂きました。実際には下記のような記述を考えていました。 ---Topのモジュールです。 generic( simulation: std_logic:='0'; <-- '0'ならシミュレーションモード ); ・ ・ (略) ・ architecture component Module <- 下位モジュールの宣言 generic( generic_value: integer:=10 ); port( din : std_logic; dout: std_logic ); end component; constant value integer:='10'; constant value_sim integer:='2' signal value_top integer; ・ ・ (略) ・ module_A: Module generic map( generic_value => value_top <--simulation の値によって value か value_sim のどちらかを代入する。 ・ ・ (略) ・ 上記のように通常用とシミュレーション用の value を宣言して置き、 simulation の値を見て、value と value_sim のどちらを下位のモジュールに渡すかを選択したいのです。 if文でsimulation の値をみて value もしくは value_simを value_topに代入して下位に渡そうとしたのですが、 「genericに signalは代入できません」というようなエラーが出て、コンパイルできません。 このようなことは実現可能でしょうか?よろしくお願いします。