Как соединить 2D массив в карте портов в vhdl v93 или v2002 - PullRequest
0 голосов
/ 11 февраля 2020

Это мой компонент, тип и сигнал:

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

В моей архитектуре я бы попытался соединить их, но это не работает.

Credit_X : for I in 0 to NUMBER_OF_INPUTS-1 generate
   Credit_I :
      credit
      generic map(
         CREDIT_WIDTH      => CREDIT_WIDTH   
      )
         pi  => pi_credit_array(I),        
         po  => po_credit_array(I)    
      );
   end generate;   

Также попробуйте с функция:

   -- 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-массив в карте портов?

1 Ответ

1 голос
/ 11 февраля 2020

Проблема в том, что t_data_bus_array является типом двумерного массива. std_logic_vector является типом массива 1d. В VHDL типы многомерных массивов вообще не могут быть нарезаны, поэтому вам нужно создать функцию для преобразования вашего пользовательского типа 2D-массива в std_logic_vector. В 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,

или, альтернативно, просто используйте VHDL 2008, где функции разрешены на картах портов.

В качестве альтернативы может быть проще создать одномерный массив std_logic_vector, потому что его можно разрезать. В VHDL 2008 типы массивов могут быть объявлены с типом элемента также без ограничений, так что все измерения могут быть ограничены при объявлении объекта.

например.

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

Как правило, создание двухмерного массива типа std_logi c усложняет вашу жизнь. Избегайте, если возможно.

...