我在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 );
利用 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
指定的不同位宽度,以满足您的要求。