1

このケースをどのように処理できますか:

entity foo is
    generic (
        num_instances : natural := 8
    );
    port (
        data_in_per_instance : in std_logic_vector(num_instances-1 downto 0);
        data_out_per_instance : out std_logic_vector(num_instances-1 downto 0)
    );
end foo;

architecture bar of foo is

    component do_stuff is
        port(
            din : in std_logic;
            dout : out std_logic
        );
    end component do_stuff;

    signal sig_per_instance : std_logic_vector(num_instances-1 downto 0);

begin

L1: for i in 0 to num_instances-1 generate
    L2: do_stuff
        port map(
            din => data_in_per_instance(i),
            dout => data_out_per_instance(i)
        );
end generate;

end bar;

ここでの問題は、num_instancesが 0 に減少すると、信号範囲(num_instances-1 downto 0) が評価されるときにエラーが発生することです....
これを回避するエレガントな方法はありますか? 私が思い付くことができるのはmax(num_instances-1,0)、この問題を防ぐために関数のようなものを使用することだけです (しかし、合成は私が望むものを正確に与えないかもしれません。つまり、何も与えないかもしれません)。
このケースをもう少しシームレスに処理する方法はありますか?

4

2 に答える 2

2

簡単な答えは、for-generate ステートメントを if-generate でラップすることです。if num_instances /= 0 generate ...残念ながら、if-generate には else 部分はありませんが、if num_instances = 0 generate ...その特別なケースを処理するために 2 つ目のステートメントを追加することを止めるものは何もありません。

または、if-generate を使用して for-generate の問題部分をラップすることもできます。

編集: によって保護された正しいシグナル宣言が必要ですif ... generate

あはは!VHDL の (私の経験では) めったに使用されない "block" ステートメントの正当な使用法を発見したかもしれません。

ブロック ステートメントにはシグナル宣言を含めることができ、生成でラップできます。

したがって、これは有効な VHDL です。

Normality : block is
   -- signal declarations here
begin
   -- concurrent code here
end block Normality;

そして、生成ステートメントで合法的にラップすることができます...

于 2013-10-21T11:27:56.027 に答える
1

std_logic_vector空の範囲 (たとえば ) を持つA3 downto 4は完全に正当です。LRM では「null 範囲」と呼ばれます。これを作成すると、(少なくとも Modelsim では) 警告が表示されますが、これは通常、不適切な形式と見なされます。それらを排除するために、ブライアンのblock提案はあなたがしなければならないことです.

同様に、これfor..generateは空のループになり、インスタンスはありません。これに対する警告はありません。

なぜインスタンスのないブロックが必要なのか興味がありますか? 私はそれらの少なくとも 1 つを強制するために を作成しますが、それは実際にはあなたが望むものではないかもしれませんnum_instances!positive

于 2013-10-23T11:55:51.090 に答える