Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在vhdl v93或v2002中连接端口映射中的2D数组_Arrays_Vhdl_Hdl - Fatal编程技术网

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),