我正在使用Modelsim VHDL设计一个项目,我使用两个组件。根据控制输入,我将选择使用哪个组件:
但是,当我在if语句中编写“U1:port map ...”时出现编译错误 (不能将结构语句放在顺序架构中)。
任何想法如何解决我的问题?
答案 0 :(得分:3)
您的问题有两种可能的解释:
每种情况都有不同的解决方案。
针对情况#1的解决方案:在您的实体中使用generic
,在您的架构体中使用if-generate
语句。这是一个例子:
entity component_selection_at_compile_time is
generic (
-- change this value to choose which component gets instantiated:
COMPONENT_SELECT: in integer range 1 to 2 := 1
);
port (
input: in integer;
output: out integer
);
end;
architecture rtl of component_selection_at_compile_time is
component comp1 is port(input: in integer; output: out integer); end component;
component comp2 is port(input: in integer; output: out integer); end component;
signal comp1_output, comp2_output: integer;
begin
c1: if COMPONENT_SELECT = 1 generate
u1: comp1 port map (input, output);
end generate;
c2: if COMPONENT_SELECT = 2 generate
u2: comp2 port map (input, output);
end generate;
end;
情况#2的解决方案:创建第三个组件。该组件将是一个包装器,并将实例化两个原始组件。在某些情况下,您甚至可以为两个组件分配相同的输入。然后使用选择信号选择将哪个输出转发到包装器外部。
entity wrapper is
port (
wrapper_input: in integer;
wrapper_output: out integer;
component_select: in integer range 1 to 2
);
end;
architecture rtl of wrapper is
component comp1 is port(input: in integer; output: out integer); end component;
component comp2 is port(input: in integer; output: out integer); end component;
signal comp1_output, comp2_output: integer;
begin
u1: comp1 port map (wrapper_input, comp1_output);
u2: comp2 port map (wrapper_input, comp2_output);
wrapper_output <= comp1_output when component_select = 1 else comp2_output;
end;
答案 1 :(得分:2)
这个问题的答案取决于控制输入的性质。如果控制输入是在编译时配置设计的一种方式,则可以使用泛型和生成语句来实现所需的功能。 否则...
根据您提出问题的方式,我将假设事实并非如此。我将假设您的设计必须在不同的时间支持,使用相同的编译设计。在这种情况下,您必须实例化两个组件,并将数据路由到两个组件,并以某种方式指示这些组件何时数据有效且必须处理。例如:
en1 <= not control;
en2 <= control;
U1 : entity work.design1
port map (
data => data,
en => en1
);
U2 : entity work.design2
port map (
data => data,
en => en2
);
在此示例中,我们创建了2个新信号en1
和en2
,这些信号是&#39; 1&#39;在适当的时间启用每个组件。在每个实例化的实体中,您需要查看en
输入以确定输入数据何时有效。
注意:您的设计可能已有类似于en1
或en2
的信号。例如,您可能拥有通用的&#34;总线&#34;它有一个有效的信号,表明总线上的数据何时有效。在这种情况下,您可以添加类似的内容,使用bus_valid
选择启用信号:
en1 <= not control and bus_valid;
en2 <= control and bus_valid;