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;

这里的问题是,如果减少到 0,则 在评估num_instances信号范围时会出现错误...... 有没有一种优雅的方法来解决这个问题?我能想出的只是使用一个函数来防止这个问题(但是综合可能不会给我我想要的东西,即什么都没有)。 有什么方法可以更无缝地处理这种情况吗?(num_instances-1 downto 0)
max(num_instances-1,0)

4

2 回答 2

2

一个简单的答案是将 for-generate 语句包装在 if-generate 中,if num_instances /= 0 generate ...不幸的是 if-generates 没有 else 部分,但是没有什么可以阻止您添加第二条if num_instances = 0 generate ...语句来处理这种特殊情况。

或者,您可以使用 if-generate 包装 for-generate 的问题部分。

编辑:重新需要一个正确的信号声明,由if ... generate.

啊哈!您可能已经发现了 VHDL(根据我的经验)很少使用的“块”语句的合法用途!

块语句可能包含信号声明,并且可以包装在生成中。

所以这是有效的 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 将其称为“空范围”。如果你创建了一个,那么(至少使用 Modelsim)你会收到警告,这通常被认为是糟糕的形式。为了消除这些,Brian 的block建议就是你要做的。

同样,这for..generate将导致一个空循环并且没有实例。没有警告。

我很好奇为什么你想要一个没有实例的块?我会强制其中至少一个,但这实际上可能不是你想要的num_instancespositive

于 2013-10-23T11:55:51.090 回答