【问题标题】:Custom Type as VHDL 2008 Generic自定义类型为 VHDL 2008 Generic
【发布时间】:2016-01-12 19:14:41
【问题描述】:

我想使用 VHDL-2008 在我的entitygeneric 部分创建一个自定义类型。但是,我使用此代码在 Modelsim 中立即收到错误消息。错误是:

** 错误:C:/Projects/source/My_Mux.vhd(35): "is" 附近: 期待 ';'或')'

请注意,第 35 行是下面的type t_Array

entity My_Mux is
  generic (
    g_MUX_INPUTS : integer := 2;
    type t_Array is array (0 to g_MUX_INPUTS-1) of std_logic_vector(7 downto 0)
    );
  port (
    i_Select   : in std_logic_vector(1 downto 0);
    i_Mux_Data : in t_Array;
    o_Data     : out std_logic_vector(7 downto 0)
    );
end entity My_Mux;

architecture RTL of My_Mux is

begin

  o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);

end architecture RTL;

我研究了创建一个我在我的代码的通用部分中定义的特殊函数。但这需要我在实例化模块中重载函数,我真的不想这样做,它似乎不必要地复杂。如果我可以在泛型中创建自定义类型,它将解决我的问题。可以使用 VHDL-2008 吗?

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    如果类型的声明实际上是在泛型声明中进行的,那么您如何期望在正式和实际之间具有类型兼容性?

    VHDL 中的每个声明都是唯一的,不是通过名称而是通过声明出现。名称引用的声明取决于范围和可见性。使用名称的两个(所有)地方都必须能够达到相同的声明。

    如何声明泛型类型可在 IEEE Std 1076-2008 6.5.3 接口类型声明中找到:

    接口类型声明声明的接口类型显示为设计实体、组件、块、包或子程序的泛型。

    interface_type_declaration ::=
    interface_incomplete_type_declaration

    interface_incomplete_type_declaration ::= 类型标识符

    接口类型为环境提供了一种方法来确定要用于描述的特定部分中的对象的类型。接口类型的值集和适用操作可以由环境中的关联子类型确定。进行此类关联的方式在 6.5.7 中进行了描述。

    需要注意的重要一点是,这是一个不完整的类型声明,其中实际指定了具有子类型约束 (6.5.6.2) 的预先存在的类型:

    由泛型类型表示的子类型由泛型关联列表中对应的实际指定。如果没有为给定的正式泛型类型指定此类实际值(因为正式泛型未关联或因为实际值是开放的),则会出现错误。

    因为该关联与先前声明的类型相关,所以以 -1993 的方式做同样的事情几乎没有区别:

    library ieee;
    use ieee.std_logic_1164.all;
    
    package my_package is
        type my_array is array (natural range <>) of std_logic_vector(7 downto 0);
    end package;
    
    library ieee;
    use ieee.std_logic_1164.all;
    use work.my_package.all;
    
    entity My_Mux is
        generic (
            g_MUX_INPUTS:  integer := 2
            --type t_Array is array (0 to g_MUX_INPUTS-1) of 
                    -- std_logic_vector(7 downto 0)
        );
        port (
            i_Select:    in  std_logic_vector(1 downto 0);
            -- i_Mux_Data:  in t_Array;
            i_Mux_Data:  in  my_array (0 to g_MUX_INPUTS - 1);
            o_Data :     out std_logic_vector(7 downto 0)
        );
    end entity My_Mux;
    
    architecture RTL of My_Mux is
    
    begin
    
        o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);
    
    end architecture RTL;
    

    添加了一个包含类型声明 my_array 的包,它是一个未绑定(部分受限)的多维数组类型。

    这允许使用包my_package来指定实际的类型:

    library ieee;
    use ieee.std_logic_1164.all;
    use work.my_package.all;
    
    entity my_mux_tb is
    end entity;
    
    architecture foo of my_mux_tb is
        constant MUX_INPUTS:    natural := 2;
        signal i_Select:    std_logic_vector (1 downto 0);
        signal i_Mux_Data:  my_array (0 to MUX_INPUTS -1);
        signal o_Data:      std_logic_vector(7 downto 0);
    begin
    DUT:
        entity work.My_mux 
            generic map (
                g_MUX_INPUTS => MUX_INPUTS
            )
            port map (
                i_Select => i_Select,
                i_Mux_Data => i_Mux_Data,
                o_Data => o_Data
            );
    end architecture;
    

    上面的两个示例按顺序分析,详细说明和测试台模拟(除了告诉我们在实际端口上传递子类型约束之外,没有做任何特别有趣的事情)。

    组件或实体实例化以及声明实际端口的位置都需要可以访问自定义类型。

    使用泛型类型将允许您从 my_mux 上下文子句中删除 my_package use 子句,而改为依赖实际关联。

    您还可以在细化时绑定类型,而无需切换包(或依赖 -2008 中的包实例化及其自己的泛型)。

    【讨论】:

    • 我最终使用了数据包的方法来解决这个问题。感谢您的详细回答,内容非常丰富。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多