顺序体系结构中的vhdl结构语句

顺序体系结构中的vhdl结构语句,vhdl,Vhdl,我正在设计一个基于Modelsim VHDL的项目,其中我使用了两个组件。根据控件输入,我将选择要使用的组件: 如果control=0,则输入将被移植到第一个组件 如果control=1输入将被移植到第二个组件 但是,当我在if语句中编写“U1:端口映射…”时出现编译错误 (无法将结构语句放入顺序体系结构中) 有什么办法解决我的问题吗?这个问题的答案取决于控件输入的性质。如果控制输入是在编译时配置设计的一种方式,那么可以使用泛型和generate语句实现所需的功能。否则 根据你提出问题的措辞

我正在设计一个基于Modelsim VHDL的项目,其中我使用了两个组件。根据控件输入,我将选择要使用的组件:

  • 如果control=0,则输入将被移植到第一个组件
  • 如果control=1输入将被移植到第二个组件
但是,当我在if语句中编写“U1:端口映射…”时出现编译错误 (无法将结构语句放入顺序体系结构中)


有什么办法解决我的问题吗?

这个问题的答案取决于控件输入的性质。如果控制输入是在编译时配置设计的一种方式,那么可以使用泛型和generate语句实现所需的功能。否则

根据你提出问题的措辞,我假设情况并非如此。我将假设您的设计必须在不同的时间使用相同的编译设计同时支持这两种功能。在这种情况下,您必须实例化这两个组件,并将数据路由到这两个组件,并以某种方式向这些组件指示数据何时有效且必须进行处理。例如:

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
);

这个问题的答案取决于控制输入的性质。如果控制输入是在编译时配置设计的一种方式,那么可以使用泛型和generate语句实现所需的功能。否则

根据你提出问题的措辞,我假设情况并非如此。我将假设您的设计必须在不同的时间使用相同的编译设计同时支持这两种功能。在这种情况下,您必须实例化这两个组件,并将数据路由到这两个组件,并以某种方式向这些组件指示数据何时有效且必须进行处理。例如:

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
);

对你的问题有两种可能的解释:

  • 情况#1:您的设计一次只使用两种可能组件中的一种。使用哪个组件的决定是在编译时完成的,也就是说,它是在代码中编写的,并且在电路合成后不可能更改
  • 情况#2:您的设计同时使用这两个组件,并使用信号动态选择一个可能的输出
每种情况都有不同的解决方案

情况解决方案#1:在实体中使用
通用
,在体系结构主体中使用
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:创建第三个组件。这个组件将是一个包装器,并将实例化两个原始组件。在某些情况下,您甚至可以将相同的输入分配给两个组件。然后使用select信号选择哪个输出将转发到包装器外部

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的整数范围内
);
结束;
包装器的rtl体系结构是
组件comp1是端口(输入:输入整数;输出:输出整数);端部元件;
组件comp2是端口(输入:输入整数;输出:输出整数);端部元件;
信号comp1_输出,comp2_输出:整数;
开始
u1:comp1端口映射(包装器输入,comp1输出);
u2:comp2端口映射(包装器输入,comp2输出);

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

  • 情况#1:您的设计一次只使用两种可能组件中的一种。使用哪个组件的决定是在编译时完成的,也就是说,它是在代码中编写的,并且在电路合成后不可能更改
  • 情况#2:您的设计同时使用这两个组件,并使用信号动态选择一个可能的输出
每种情况都有不同的解决方案

情况解决方案#1:在实体中使用
通用
,在体系结构主体中使用
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:创建第三个组件。这个组件将是一个包装器,并将实例化两个原始组件。在某些情况下,您甚至可以将相同的输入分配给两个组件。然后使用select信号选择哪个输出将转发到包装器外部

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的整数范围内
);
结束;
包装器的rtl体系结构是
组件comp1是端口(输入:输入整数;输出:输出整数);端部元件;
组件comp2是端口(输入:输入整数;输出:输出整数);端部元件;
信号comp1_输出,comp2_输出:整数;
开始
u1:comp1端口映射(包装器输入,comp1输出);
u2:comp2端口映射(包装器输入,comp2输出);
包装器输出