• 締切済み

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値を変更できれば構いません。 参考記述、ご紹介頂けると助かります。 説明が分かりづらいかもしれませんが、よろしくおねがいします。    

  • inst
  • お礼率65% (92/141)

みんなの回答

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.1

論理合成対象だと仮定して・・・ generic値は論理合成時に静的に確定している定数である必要があるので ロジック動作中に動的に変更することは基本的に無理です. valueが変数ならportから入力する必要があります. bit幅の定数など, どうしてもgenericする必要があるならば generic値の異なる2つを両方インスタンシエーションしておいて 上位側にてsignal A相当の信号によってdoutを選択すればOKでは? valueの使い道が分からないのでこれがベストとは言い切れませんが.

inst
質問者

補足

ご回答ありがとうございます。 もうちょっと詳しく書きますと、 「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は代入できません」というようなエラーが出て、コンパイルできません。 このようなことは実現可能でしょうか?よろしくお願いします。

関連するQ&A

  • VHDLに関して

    複数ビットの信号を宣言する際に std_logic_vector を用いますが、その後のdowntoやtoの意味がよく分かりません。 下の画像だとdowntoですが、toでは何故ダメなのでしょうか? また、selはstd_logicでいいと思うのですが何故複数ビットの扱いなのでしょうか? すみませんが、初心者なのでできるだけ分かりやすく説明していただけると幸いです。 宜しくお願いします。

  • VHDL 多重(?)階層の作り方

    top_Aというモジュールは下位モジュールとして A1、A2、A3というモジュールを内包しているものとします。 top_Bというモジュールは下位モジュールとして B1、B2、B3というモジュールを内包しているものとします。 ここで top_Cというモジュールを作って top_C component top_A component top_B ・・・といった感じに階層を重ねていってよいのでしょうか? 教えてください。

  • delphi 2次元配列がわかりません

    将棋盤の様な9×9マスの配列宣言を a1 : array[1..9, 1..9] of Integer ;とした場合、a1に値を 代入するにはどんな式が考えられますか? a1 : array [1..9] of integer = (394,448,502,556,612,664,721,774,827); みたいに直接括弧内で 代入も可能でしょうか? 超初心者で頭の中で混乱してしまいます。 どなたかお助け下さい。

  • [Access]あるフォームのクラスモジュールで値を入れた変数を他のフォームでそのまま利用したい

    モジュールとクラスモジュール(イベントプロシージャ)に違いがあることや、モジュールを超えて変数を利用したいときは、Publicで宣言する、という辺りを本を読んでおおまかに理解しました。 帳票管理フォームというフォームに受付CDという主キーの番号があります。そのフォーム上に帳票の詳細な事項を入力するフォームを呼び出すボタンがあります。フォームのイベントプロシージャの一番上のOption Compare Database,Option Explicitの直下行にPublic UketukeCD as Integerと宣言し、 ボタンのイベントプロシージャで、 UketukeCD = Me![受付CD].Value などと記述しました。 新規入力データの受付CDが例えば452ならUketukeCDには452が代入されればいいんです。 帳票の詳細な事項を入力するフォーム(報告書フォームとします)の「読みこみ時」のイベントプロシージャに以下のように記述しました。 こちらのモジュールの一番上にもPublic UketukeCD as Integerと宣言し、(←これは必要なんでしょうか?) Me![受付CD].Value = UketukeCDと書きました。 過去のデータを検索するときはレコードソースのテーブルの受付CDのデータを受付CDフィールドに持ってき、新規入力の場合は、受付CDは帳票管理フォームのものを代入するという設計で、UketukeCDの値(例:452)を報告書フォーム内の受付CDフィールド内に出力する、という感じですが、なぜかUketukeCDにはいつも0が代入されています。 変数は他のモジュールで利用できても代入された値までは移行されないのですか? イベントプロシージャだからできないんですか? 字数の制限上、コードをかなり省略しています。 足りない部分は補足で補いますのでおっしゃって下さい。

  • C++でSTLのVectorを使った構造体について

    Vectorで作った構造体配列a内でさらにVectorで宣言された配列bを作った場合、bに数値を代入するにはどうすれば良いのでしょうか? struct A {  std::vector<int> b; }; std::vector<A> a;

  • MS Access2007 フォーム作成で不思議な現象が起きて困っています

    OS: WindowsXPSP3 Access2007:SP2 MSO(12.0 6425.1000) フォームのモジュールで Private 変数を宣言し、 フォームの開く時イベントで、値を代入するようにしました。 レコード移動時イベントでその変数を利用しようとしたら、 最初のレコード移動時にすでに値が空になってしまっているのです。 フォームを開いた時には、ちゃんと代入されています。 モジュール変数に値を代入しているのは、開く時だけです。 当然ながら、Option Explicit宣言をしてあります。 どうしてこんな現象が起きてしまったのでしょう? 解決に向けて、何をどう調べていったら良いのか、皆目見当がつかない状況に陥ってしまいました。 皆様のお知恵を是非お借りしたく、どうかよろしくお願いいたします。 ちなみに、Officeの診断プログラムは実行して問題のないことを確認済みです。

  • 3次元配列

    初歩的な質問で申し訳ございません、非常に困っています 教えて下さい lotno(1~4,1~4,1~5) の3次元配列を宣言し、計算で求められた値を代入したいのですが どのように記述したらいいのでしょうか? また配列 lotno() はモジュール変数です

  • Access-VBAのPublic変数について =基本的な事です=

    フォームAのテキストボックスに入力された値をフォームBで使用したいのですが、調べるとPublic変数に値を代入しておけばフォームAを閉じても値を保持できるとの事でした。 そこで、 (1) 標準モジュール(My_Moduleという名前)を作成しそこに1行Public Hensu as Long と定義しました。 (2) フォームAにボタンを作成し、そのクリックイベントに、 Hensu=Text1.Value というコードを記述しました。 (3) フォームBにボタンを作成し、そのクリックイベントに、 Text1.Value=Hensu というコードを記述しました。 フォームBのボタンをクリックすると、Text1に値が代入されるかと思いましたが、意に反しHensuの中身はNullでした。 どのようにすればフォームBで変数の値を取得することが出来るのでしょうか? ちなみにフォームAからPublic Hensuには値が代入されているようで、イミディトウインドウで?Hensuとするとちゃんと代入された値が表示されます。

  • 配列に値を入れるのを簡略化

    配列に値を入れるのに簡略化する方法はないのでしょうか? ---ソース--- //グローバルで初期化 static int a[5]={0}; void main void{ //メイン関数で値を代入 宣言と共に初期化する場合はa[5]={ 4,6,9,2,7 } と簡略化できるのに値を代入する場合はいちいちひとつづつ値を代入しないといけないの? a[0]=4; a[1]=6; a[2]=9; a[3]=2; a[4]=7; }

  • FPGA > ポート downtoを使う

    FPGAの勉強を始めています。 http://www.kumikomi.net/archives/2009/07/verilog_hdl_1.php 上記のサイトの「(2) エンティティ」のポート宣言の説明のところに port(a, b: in std_logic_vector (3 downto 0); ...略... ) のような部分の"downto"に関して 「downtoは,降順で範囲を指定する予約語です.昇順の場合toを 使います.実際の設計ではもっぱら降順を使います.」 とあります。 downtoをよく使う理由というのはあるのでしょうか?

専門家に質問してみよう