自定义类型为VHDL 2008 Generic

时间:2016-01-12 19:14:41

标签: vhdl

我想使用VHDL-2008在generic的{​​{1}}部分中创建自定义类型。但是我在使用此代码的Modelsim中立即收到错误。错误是:

  

**错误:C:/Projects/source/My_Mux.vhd(35):接近"是":期待&#39 ;;'或')'

请注意,第35行是下面的entity

type t_Array

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

1 个答案:

答案 0 :(得分:4)

如果一个类型的声明实际上是在一般声明中做出的话,你会期望在形式和实际之间有类型兼容性吗?

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_package上下文子句中删除my_mux use子句,而不是依赖于实际关联。

您也可以在精心制作时绑定类型,而无需切换包(或依赖于使用它自己的泛型的-2008中的包实例化)。