我的顶部模块中有一个名为 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;
您不能将 IF..GENERATE 用于条件,该条件应在运行时评估。 IF..GENERATE(和FOR..GENERATE)类似于C/C++中的预处理器指令。通过这些说明,您可以指示是否应包含某些逻辑或多次包含它。
所以这些是编译时指令,因此它们必须是静态(例如基于常量)。
但是您的代码存在一个普遍问题。仅当 Rrg(1)='1' 时才需要使用
sbox
内部的逻辑。在软件中,仅当需要函数结果时才调用函数是正确的,但对于像 VHDL 这样的硬件描述语言,您必须以不同的方式思考。在运行时期间不可能更改硬件(或 FPGA 配置),但设计的每个部分的电路都必须从一开始就存在,即使它在运行期间仅使用一次。时间。
原则上,只需删除 IF..GENERATE 条件就足够了,但也许您想在输出无效时屏蔽输出,或者在可以使用输出时向外部进行标记。这取决于您的实体外部发生的事情......