VHDL, come ottenere dimensione per array da una funzione
Inviato: 12 apr 2016, 12:25
Ciao a tutti, sto facendo un progettino al solo scopo didattico in VHDL, sulla suite Vivado. Mi sono trovato ad affrontare un problema che non riesco a risolvere, e non ho trovato ulteriori info su internet. Non so nemmeno si possa fare, quindi magari chiedo qui.
Ho il seguente codice per un package :
Poi in un alto package, che include il primo, scrivo questo:
Quello che vorrei fare è la seguente cosa:
Ho provato a mettere quelle 2 righe in molti posti; nel body del secondo package, nella main architecture...ma tutte mi danno errori, come se io non potessi mettere quelle istruzioni li. Per esempio ho provato a mettere la sola prima istruzione nel secondo pacakge e poi la seconda istruzione nell'architecture (prima del begin) ma anche in quel modo non va.
Secondo voi si può fare?
Ho il seguente codice per un package :
Codice: Seleziona tutto
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 package;
Poi in un alto package, che include il primo, scrivo questo:
Codice: Seleziona tutto
package adder_length is
variable dimension : integer;
-- function declaration
function calc_adder_length (N,M : integer) return integer;
end adder_length;
package body adder_length is
-- calcluate the number of internal signal for the adders. Function body.
function calc_adder_length (N,M : integer) return integer is
variable number : integer;
variable accumulator : integer;
begin
number := M;
accumulator :=M;
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 adder_length;Quello che vorrei fare è la seguente cosa:
Codice: Seleziona tutto
dimension := calc_adder_length(N;M);
type array_out is array (dimension-1 downto 0) of std_logic_vector(M+N-1 downto 0);
Ho provato a mettere quelle 2 righe in molti posti; nel body del secondo package, nella main architecture...ma tutte mi danno errori, come se io non potessi mettere quelle istruzioni li. Per esempio ho provato a mettere la sola prima istruzione nel secondo pacakge e poi la seconda istruzione nell'architecture (prima del begin) ma anche in quel modo non va.
Secondo voi si può fare?