首页 文章

在VHDL中注册 Map 实现

提问于
浏览
0

在我的设计中,我试图创建一个寄存器映射,可以灵活地由单独的组件使用 . 例如,假设我创建了以下寄存器映射类型:

package regmap_package is

    type regmap_t is array(natural range <>) of std_logic_vector(7 downto 0);

end package regmap_package;

所以这将是我的寄存器映射,带有x个8位寄存器 . 在我的顶层实体中,我然后声明寄存器映射的总大小:

signal regs : regmap_t(0 to 15);

所以在这个例子中我将有16 x 8位寄存器映射 . 这就是我的问题:让我说我想创建一些子组件 . 每个组件只需要这些寄存器的某些部分来操作 . 例如,component1需要从地址0到地址7的寄存器,组件2从地址8到地址15进行寄存器 . 这样的组件的实体声明如何看起来如何以及如何将整个寄存器数组的部分传递给它?组件是否会在自己的本地寻址方案(每个从0到7)上运行?我将不胜感激 .

1 回答

  • 3

    您可以使用枚举来声明寄存器名称:

    type RegisterNames is (Command, Status, VendorID, DeviceID, Error);
    

    现在您可以创建注册图:

    type RegisterType is array(RegisterNames range <>) of std_logic_vector(7 downto 0);
    

    通过使用 range <> ,您可以创建该类型的任何范围 .

    从这里您可以生成您的注册 Map :

    signal RegisterMap : RegisterType(RegisterNames);
    

    您可以按如下方式切割此寄存器映射:

    signal SubRegisters : RegisterType(VendorID to DeviceID);
    SubRegister <= RegisterMap(SubRegister'range);
    

    评论的答案

    是否可以使用可用作索引的全局标签创建包?

    是的,您可以在包中定义所描述的枚举类型 . 因此,寄存器名称和寄存器类型本身可用作端口和更高级别的实体 .

    遗憾的是,VHDL-2008对不完整的泛型类型的支持已经破碎 . 您可以将枚举类型传递到包中,然后将该实例化包传递给实现通用寄存器接口的实体,例如对于AXI4 Lite,但这种通用类型没有任何操作 . 因此,您没有运算符,也没有可用的泛型类型的属性 .

    它会是什么样子的?

    package GenericRegisterPackage is
      generic (
        constant ShortName        : string;   -- e.g. PWM
        type     RegisterNames;
        constant AXI4_AddressBits : positive;
        constant AXI4_DataBits    : positive
      );
    
      subtype RegisterType is std_logic_vector(AXI4_DataBits - 1 downto 0);
    
      -- THE FOLLOWING LINE IS NOT SUPPORTED in VHDL-2008
      type    RegisterFile is array(RegisterNames range <>) of RegisterType;
    
    end package;
    
    entity GenericAXI4LiteRegister is
      generic (
        package GenericRegisterPackage
      );
      port (
        Clock : in std_logic;
        -- ...
      );
    end entity;
    

    Usage:

    architecture rtl of Controller is
      type RegisterNames is (Command, Status, Error, Frequency);
    
      package RegisterPackage is new work.GenericAXI4LiteRegister
        generic map (
          ShortName        => "PWM Controller",
          RegisterNames    => RegisterNames,
          AXI4_AddressBits => 8,
          AXI4_DataBits    => 32
        );
    begin
      reg: entity work.GenericAXI4LiteRegister
        generic map (
          GenericRegisterPackage => RegisterPackage
        )
        port map (
          Clock => Clock,
          -- ...
        );
    end architecture;
    

    这种对VHDL-2008的误解将在VHDL-2018中修复 . 包的不完整泛型类型中的以下行:

    type RegisterNames;
    

    将成为这样:

    type RegisterNames is ();
    

    ...表示,它是枚举类型 . 因此,它是一个离散类型,可以用作数组中的索引 .

    此外,这里可以使用特定的索引设置(自然数)吗?

    是的,您可以将枚举文字转换为索引 . 每个离散类型(包括枚举)都包含其所有值的位置编号 .

    constant position : natural := RegisterNames'pos(VendorID);
    

    将返回 2 . 对于声明中最左侧的枚举文字,位置从0开始 . 右边的每个后面的文字都会获得一个增加1的位置 .

    从位置编号(自然)到枚举文字的反向操作,属性 'val(5) ,返回 Error .

相关问题