2017-11-15 3 views
1

私は知っている、変数はプロセスでのみ許可されていますが、なぜあなたはそれらをループで使用することはできません。 このような構造を合成する際には、前に評価されているため問題はありません。VHDL - なぜあなたはループを生成する変数を使用することができません

この制限がなくてもコードを読みやすくすることができます。

lbl1: for i in data_out'range generate 
    lbl2a: component comp_a 
     port map(
      clk => clk, 
      out => out(0)(i) 
      in_a => data_in(i*w + offset to i*w + w + offset)); 
    lbl2b: component comp_b 
     port map(
      clk => clk, 
      out => out(1)(i) 
      in_b => data_in(i*w + offset to i*w + w + offset)); 
    . 
    . 
    . 
    lbl2n: component comp_n 
     port map(
      clk => clk, 
      out => out(n)(i) 
      in_n => data_in(i*w + offset to i*w + w + offset)); 
end generate lbl1; 

それとも

lbl1: for i in data_out'range generate 
    variable lower : integer := i*w + offset; 
    variable upper : integer := i*w + w + offset; 
    lbl2a: component comp_a 
     port map(
      clk => clk, 
      out => out(0)(i) 
      in_a => data_in(lower to upper)); 
    lbl2b: component comp_b 
     port map(
      clk => clk, 
      out => out(1)(i) 
      in_b => data_in(lower to upper)); 
    . 
    . 
    . 
    lbl2n: component comp_n 
     port map(
      clk => clk, 
      out => out(n)(i) 
      in_n => data_in(lower to upper)); 
end generate lbl1; 

コードを書く任意の例からではない、それがどの時点で失敗する可能性がありますが、私はあなたが私のポイントを得ると思います。読んだり維持したりする方が簡単です。生成された変数は、生成プロセス外のスコープから外れる可能性があります。

これはなぜ許可されていないのですか、それとも以前のvhdl標準の歴史的な成果ですか?

+1

あなたの例では変数を使用する理由はありません。定数を使うと仕事ができ、構文的にはOKです。 (編集:宣言の後に 'begin'を使用する必要があります) – Juergen

+0

変数は、順次VHDL構造の宣言領域でのみ宣言できます。 – Paebbels

答えて

5

宣言したい場合は、宣言的な領域にある必要があります。 generateステートメントは、beginを必要としない点で少し特殊です。あなたは(あなたが持っているように)使用することができます。

GenerateLoop : for i in data_out'range generate 
    -- Code here 
end generate; 

あなたがループの一部として、物事を宣言したい場合は、あなたが生成する文で、次のようになり、宣言型の地域、持っている必要があります。

GenerateLoop : for i in data_out'range generate 
    -- Declarative region 
begin 
    -- Code here 
end generate; 

この宣言的な領域で宣言する必要があります。変数ではなく、信号または定数(より適切な定数のように見える)を使用する必要があることに注意してください。

+0

IEEE1076-2008セクション11.8 – JHBonarius

+3

この場合、定数がより適切です。imho – JHBonarius

+0

ありがとう、私は、私がジェネレータで宣言的な領域を使用できることはわかりませんでした。私は定数でうまくいくよ。 –

関連する問題