VHDL: una función para determinar la longitud del arreglo

0

SOLUCIONADO Voy a dejar las preguntas, ver más abajo para la solución.

En un proyecto VHDL, quiero inicializar una matriz que tenga una cierta dimensión, y quiero que esta dimensión se derive de una función. Aquí hay una implementación mínima que muestra lo que quiero hacer:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

use work.arrayout_type.all;

entity minimal is
  Port (
        a : in std_logic;
        b : out std_logic
         );
end minimal;

architecture Behavioral of minimal is
variable dimension : integer;
dimension := calc_adder_length(M);
type array_intern is array (dimension-1 downto 0) of std_logic_vector(M+N-1 downto 0);

begin


end Behavioral;

Aquí está el paquete (edité el mensaje e incluí los dos paquetes separados en un paquete único):

library IEEE;                                                                                                                                   
use IEEE.STD_LOGIC_1164.ALL;

package arrayout_type is
    constant N : integer := 8; -- first member is N bit long
    constant M : integer :=4; -- second member is M bit long
-- declaration of a TYPE of an array of M element, each element is a signal that is the output of the M shifters and the M-1 adders
    type array_out is array (M-1 downto 0) of std_logic_vector(M+N-1 downto 0);

end arrayout_type;

package body arrayout_type is
    -- calcluate the number of internal signal for the adders. Function body.
        function calc_adder_length (x : integer) return integer is
        variable number : integer;
        variable accumulator : integer;
        begin
        number := x;
        accumulator :=x;
        while(number > 1) loop
            if(number mod 2 /= 0) then
                number := number/2+1;
            else 
                number := number/2;
            end if;
            accumulator := accumulator + number;
        end loop;
        accumulator := accumulator +1; -- finalization.
        return accumulator;
        end calc_adder_length;

end arrayout_type;

El problema es, por supuesto, que no puedo llamar al programa en el cuerpo de la arquitectura antes del "comienzo". Pero al mismo tiempo no puedo declarar el array_intern en la arquitectura después del "comienzo". Así que no sé cómo hacerlo.

    
pregunta Daniele

1 respuesta

1

SOLUCIÓN: Encontré la solución a mi problema en esta otra pregunta: enlace

Entonces, aplicando la solución a mi código, el "minimal.vhd" se convierte en:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

use work.arrayout_type.all;

entity minimal is
  Port (
        a : in std_logic;
        b : out std_logic
         );
end minimal;

architecture Behavioral of minimal is
type array_intern is array (calc_adder_length(M)-1 downto 0) of std_logic_vector(M+N-1 downto 0);

begin


end Behavioral;

Eso es sintetizable.

Espero que pueda ser útil para alguien, y gracias al autor de la solución en la pregunta vinculada

    
respondido por el Daniele

Lea otras preguntas en las etiquetas