Arrays 如何在vhdl v93或v2002中连接端口映射中的2D数组
这是我的部件、类型和信号:Arrays 如何在vhdl v93或v2002中连接端口映射中的2D数组,arrays,vhdl,hdl,Arrays,Vhdl,Hdl,这是我的部件、类型和信号: type t_data_bus_array is array(natural range<>, natural range<>) of std_logic; component credit generic ( CREDIT_WIDTH : natural := 4 ); port (
type t_data_bus_array is array(natural range<>, natural range<>) of std_logic;
component credit
generic (
CREDIT_WIDTH : natural := 4
);
port (
pi : in std_logic_vector(CREDIT_WIDTH-1 downto 0);
po : out std_logic_vector(CREDIT_WIDTH-1 downto 0)
);
end component;
signal pi_credit_array : t_data_bus_array(NUMBER_OF_INPUTS-1 downto 0, CREDIT_WIDTH-1 downto 0);
signal po_credit_array : t_data_bus_array(NUMBER_OF_INPUTS-1 downto 0, CREDIT_WIDTH-1 downto 0);
还可以尝试以下功能:
-- select specifik row in 2d array
function sel_chunk(
data : t_data_bus_array; -- matrix of std_logic
num : natural; -- selected row
width : natural -- width of row
) return std_logic_vector is
variable data_ret_val : std_logic_vector(width-1 downto 0);
begin
for i in data_ret_val'range loop
data_ret_val(i) := data (num, i);
end loop;
return data_ret_val;
end sel_chunk;
并使用如下函数:
Credit_calculator_X : for I in 0 to NUMBER_OF_INPUTS-1 generate
Credit_calculator_I :
credit_calculator
generic map(
CREDIT_WIDTH => CREDIT_WIDTH
)
pi => sel_chunk( pi_credit_array, I, CREDIT_WIDTH ),
po => sel_chunk( po_credit_array, I, CREDIT_WIDTH )
);
end generate;
那么,如何解决此问题并在端口映射中连接2D阵列?这里的问题是
t\U数据总线\U阵列
是2D阵列类型<代码>标准逻辑向量是一种一维数组类型。在VHDL中,多维数组类型根本无法切片,因此需要创建一个函数,将自定义二维数组类型转换为std_逻辑_向量。在VHDL'93中,无法在端口映射中使用函数,因此需要临时信号在端口映射上执行转换函数:
signal tmp : std_logic_vector(CREDIT_WIDTH-1 downto 0);
tmp <= sel_chunk(pi_credit_array, I, CREDIT_WIDTH);
....
port map (
pi => tmp,
信号tmp:std_逻辑_向量(信用宽度-1向下至0);
tmp tmp,
或者,也可以使用VHDL 2008,在端口映射中允许使用函数
或者,创建std_logic_vector的1D数组可能更简单,因为它可以切片。在VHDL 2008中,数组类型可以在元素类型也不受约束的情况下声明,因此在声明对象时可以约束所有维度
例如
类型t_数据_总线_数组是标准逻辑_向量的数组(自然范围);
信号pi_credit_阵列:t_数据_总线_阵列(_输入数量-1下降到0)(credit_宽度-1下降到0);
....
港口地图(
pi=>pi_credit_数组(I),
一般来说,创建2d数组类型的std_逻辑会使您的生活变得困难。如果可能,请避免。我正在使用XCELIUM 18.03-s001如何打开VHDL2008。只有-v200x和-v93,但没有VHDL 2008。非常感谢。我用idea pi=>tmp解决端口映射中输入信号的问题,如何处理输出信号。在哪里定义临时信号nal和方法?您将需要另一个
std\u logic\u vector
的临时信号。然后您将需要另一个函数将std\u logic\u vector应用于您的输出2d数组。提供一个函数,这样您就不会得到波浪形的答案。这意味着您需要一个连接到credit的多维接口对象。
signal tmp : std_logic_vector(CREDIT_WIDTH-1 downto 0);
tmp <= sel_chunk(pi_credit_array, I, CREDIT_WIDTH);
....
port map (
pi => tmp,
type t_data_bus_array is array(natural range <>) of std_logic_vector;
signal pi_credit_array : t_data_bus_array(NUMBER_OF_INPUTS-1 downto 0)(CREDIT_WIDTH-1 downto 0);
....
port map (
pi => pi_credit_array(I),