vhdl顺序架构内的结构语句

时间:2013-11-11 19:40:24

标签: vhdl

我正在使用Modelsim VHDL设计一个项目,我使用两个组件。根据控制输入,我将选择使用哪个组件:

  • 如果 control = 0 ,则输入将移植到第一个组件。
  • 如果 control = 1 ,输入将被移植到第二个组件。

但是,当我在if语句中编写“U1:port map ...”时出现编译错误 (不能将结构语句放在顺序架构中)。

任何想法如何解决我的问题?

2 个答案:

答案 0 :(得分:3)

您的问题有两种可能的解释:

  • 情境#1:您的设计一次只使用两个可能的组件中的一个。决定使用哪个组件是在编译时完成的,即它是用你的代码编写的,在合成电路后是不可能改变的。
  • 情况#2:您的设计会同时使用这两个组件,并使用信号动态选择其中一个可能的输出。

每种情况都有不同的解决方案。

针对情况#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个新信号en1en2,这些信号是&#39; 1&#39;在适当的时间启用每个组件。在每个实例化的实体中,您需要查看en输入以确定输入数据何时有效。

注意:您的设计可能已有类似于en1en2的信号。例如,您可能拥有通用的&#34;总线&#34;它有一个有效的信号,表明总线上的数据何时有效。在这种情况下,您可以添加类似的内容,使用bus_valid选择启用信号:

en1 <= not control and bus_valid;
en2 <= control and bus_valid;