2017-08-13 14 views
1

Ich versuche ein Array von std_logic_vectors mit reduzierenden Längen zu erstellen. Ich habe versucht, ein Array mit einem generischen std_logic_vector zu machen und dann eine generate-Anweisung zu verwenden, um die Vektoren zu erstellen.VHDL Generiere Array von STD_LOGIC_VECTORS mit reduzierender Länge

architecture behavioral of dadda_mul_32bit is 

type and_planes is array (0 to 31) of std_logic_vector;  

begin 

generate_and_plane: 
    for i in 0 to 31 generate 
     and_planes(i) <= and_vector(a, b(i), i); 
    end generate generate_and_plane; 

end behavioral; 

zusammen mit einer Funktion, die eine generische std_logic_vector zurückgibt:

function and_vector(vec: std_logic_vector; x: std_logic; length: natural) return std_logic_vector is 
    variable result: std_logic_vector(length - 1 downto 0); 
begin 
    for i in 0 to length - 1 loop 
     result(i) := vec(i) and x; 
    end loop; 

    return result; 
end function; 

Bin ich die Aussage falsch generieren verwenden?

+0

Warum sind Ihre UND-Ergebnisse nicht die Länge eines? – user1155120

Antwort

3

and_planes ist ein Typ kein Signal, also können Sie ihm nicht zuweisen! Darüber hinaus erstellen Sie einen teilweise eingeschränkten Typ, der in einer Objektdeklaration (z. B. Signal) eingeschränkt werden muss.

VHDL unterstützt keine unregelmäßigen Arrays. (Arrays, bei denen jedes Element eine unterschiedliche Größe hat) Wenn Sie dies für die Simulation benötigen, können Sie Zugriffstypen verwenden und zerlumpte Arrays wie in C emulieren. Wenn Sie es für die Synthese benötigen, können Sie ein zerfetztes Array mit einem eindimensionalen Array und einige Funktionen zur Berechnung der Grenzen eines verschachtelten Arrays emulieren Vektor.

Sehen Sie diese Antwort von mir:


Btw. VHDL-2008 fügt eine Überladung hinzu: "and"(std_logic, std_logic_vector), so dass keine Funktion benötigt wird, um das Anding eines einzelnen Bits mit jedem Bit in einem Vektor zu berechnen.

-- slice 'a' and gate it by 'b(i)' 
and_planes(i) <= a(i downto 0) and b(i);