在vhdl中生成条件

问题描述 投票:0回答:1

我的顶部模块中有一个名为 Rrg 的移位寄存器,当调用的 EnCore 模块中的 Rrg(1) = '1' 时,我想实例化 Sbox 模块。我有警告:

1)IF GENERATE 中的条件必须是静态的。

2)未初始化的输出端口Do没有驱动程序。 该端口将为信号网络贡献价值(U)。

entity EncCore is
    port (
        di : in std_logic_vector(127 downto 0);
        Rrg : in std_logic_vector(4 downto 0);
        Do : out std_logic_vector(127 downto 0)
    );
end EncCore;

architecture behavioral of EncCore is
begin
gen : if (Rrg(1)='1') generate
            innergen : for i in 0 to 15 generate
            sbox_inst :  sbox
                port map(
                    input_byte  => di((i + 1)*8 - 1 downto i*8),
                    output_byte => Do((i + 1)*8 - 1 downto i*8)
                );      
            end generate innergen;
     end generate gen;
end architecture behavioral;
encryption vhdl generate
1个回答
0
投票

您不能将 IF..GENERATE 用于条件,该条件应在运行时评估。 IF..GENERATE(和FOR..GENERATE)类似于C/C++中的预处理器指令。通过这些说明,您可以指示是否应包含某些逻辑或多次包含它。

所以这些是编译时指令,因此它们必须是静态(例如基于常量)。

但是您的代码存在一个普遍问题。仅当 Rrg(1)='1' 时才需要使用

sbox
内部的逻辑。在软件中,仅当需要函数结果时才调用函数是正确的,但对于像 VHDL 这样的硬件描述语言,您必须以不同的方式思考。在运行时期间不可能更改硬件(或 FPGA 配置),但设计的每个部分的电路都必须从一开始就存在,即使它在运行期间仅使用一次。时间。

原则上,只需删除 IF..GENERATE 条件就足够了,但也许您想在输出无效时屏蔽输出,或者在可以使用输出时向外部进行标记。这取决于您的实体外部发生的事情......

© www.soinside.com 2019 - 2024. All rights reserved.