单独指定二维数组中每个元素的位宽

问题描述 投票:0回答:1

我在vhdl-2008中创建了一个二维数组:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

package PWMGenerate_pkg is
    type array_row           is 
array(natural range <>) of 
unsigned;
    type array_BW            is 
array(natural range <> ) of 
integer ; --range 8 to 32
end package;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.all;
use work.PWMGenerate_pkg.all;

entity PWMGenMultiChBW_Top is

Generic
(
    NumberOfrows       : integer        
:= 3;
    Bit_Width_array    : array_BW       
:= (others => 32)

); 
Port 
( 
    INPUT     : in   array_row  ( 
NumberOfrows-1 downto 0 )( XXXX-1 
downto 0 ):= (others => 
(others=>'0'))
);

end PWMGenMultiChBW_Top;

我的问题是我把 XXXX 放在哪里了。实际上我想要一个二维数组,一个范围可以 可以使用 NumberOfChannels generic 进行更改,这很好。但我也希望能够改变位宽 每个数组成员根据 Bit_Width_array。我不知道如何处理端口中二维数组的单独可变位宽度。 作为我想要创建的结果的示例: 如果 NumberOfrows = 3,则 Bit_Width_array 也有 3 个成员:Bit_Width0、Bit_Width1 和 Bit_Width2 并且:

INPUT(0) <= array_row(0) ( 
Bit_Width0-1 downto 0 );
INPUT(1) <= array_row(1) ( 
Bit_Width1-1 downto 0 );
INPUT(2) <= array_row(2) ( 
Bit_Width2-1 downto 0 );
multidimensional-array vhdl vivado vhdl-2008
1个回答
0
投票

利用 VHDL-2008 对无约束数组的无约束数组的支持,您可以为 2D 数组中的每个元素实现可变位宽度。

首先,将

array_row
类型定义为不受约束的
unsigned
向量数组:

package PWMGenerate_pkg is
    type array_row is array(natural range <>) of unsigned;
    type array_BW  is array(natural range <>) of integer; -- range 8 to 32
end package;

在实体声明中,将

INPUT
端口声明为不受约束的
unsigned
向量数组:

entity PWMGenMultiChBW_Top is
    Generic (
        NumberOfRows     : integer        := 3;
        Bit_Width_Array  : array_BW       := (others => 32)
    );
    Port (
        INPUT : in array (NumberOfRows - 1 downto 0) of unsigned
    );
end entity PWMGenMultiChBW_Top;

在您的架构中,您可以访问每个

INPUT(i)
并使用其
'length
属性来处理其特定位宽:

architecture Behavioral of PWMGenMultiChBW_Top is
begin
    process(INPUT)
    begin
        for i in 0 to NumberOfRows - 1 loop
            -- You can access each INPUT(i) here
            variable bit_width_i : integer := Bit_Width_Array(i);
            assert INPUT(i)'length = bit_width_i
                report "Mismatch in bit widths"
                severity error;
            -- Perform operations on INPUT(i)
        end loop;
    end process;
end Behavioral;

实例化此实体时,您可以使用不同位宽的信号映射

INPUT
端口:

-- Signal declarations
signal Input0 : unsigned(31 downto 0);
signal Input1 : unsigned(15 downto 0);
signal Input2 : unsigned(7 downto 0);

-- Component instantiation
u0: PWMGenMultiChBW_Top
    generic map (
        NumberOfRows    => 3,
        Bit_Width_Array => (32, 16, 8)
    )
    port map (
        INPUT => (Input0, Input1, Input2)
    );

此方法允许

INPUT
数组中的每个元素具有由
Bit_Width_Array
指定的不同位宽度,以满足您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.