2016-04-15 18 views
2

ABSICHT:VHDL - Array von std_logic_vectors konvertieren in std_logic_vector

ich Daten auf ZedBoard aus dem RAM lese, das RAM besteht aus 32 Bit langen Wörtern so verwende ich den folgenden Puffer

type mem_word is array (0 to 127) of std_logic_vector(31 downto 0); 
signal buffer_word : mem_word; 

aber dann würde ich mag Daten in einer linearen Weise adressieren, in einem Zwischenpuffer linearen

signal buffer_linear : std_logic_vector(4095 downto 0); 
buffer_linear <= buffer_word; -- !!! PROBLEM 

so kann ich leicht jede gewünschte Adresse Bit im Puffer, ohne die Position in einem bestimmten Wort (des Pufferwortes) neu zu berechnen.

FRAGE:

Wie komme ich aus dem Array von std_logic_vectors in 1 lange std_logic_vector? Gibt es eine Möglichkeit, die Verkettung von 128 Wörtern in einer Schleife zu vermeiden? (So ​​etwas wie oben buffer_linear < = buffer_word;)

Antwort

4

Sie benötigen eine Funktion von Vektor-Vektor zu einem 1-dimensionalen Vektor zu konvertieren.

In meinem folgenden Beispiel wird der Typname T_SLVV_32 verwendet, um anzuzeigen, dass es sich um einen Vektorenvektor handelt, bei dem der innere Vektor 32 Bit lang ist. (Siehe meine verknüpfte Quelldatei für einen echten zweidimensionalen STD_LOGIC-Matrixtyp mit der Bezeichnung T_SLM). T_SLVV_32 entspricht also Ihrem Typ mem_word.

subtype T_SLV_32 is STD_LOGIC_VECTOR(31 downto 0); 
type T_SLVV_32 is array(NATURAL range <>) of T_SLV_32; 

function to_slv(slvv : T_SLVV_32) return STD_LOGIC_VECTOR is 
    variable slv : STD_LOGIC_VECTOR((slvv'length * 32) - 1 downto 0); 
begin 
    for i in slvv'range loop 
    slv((i * 32) + 31 downto (i * 32))  := slvv(i); 
    end loop; 
    return slv; 
end function; 

Verbrauch:

buffer_linear <= to_slv(buffer_word); 

Diese Funktion erzeugt keine Logik, nur Verkabelung.
Hinweis: Zugriff auf alle Bits eines Speichers auf einmal, verhindert Synthese-Tools von RAM-oder ROM-Speicherblöcke abzuleiten!

Quelle: PoC.vectors

Siehe mein Vektor-Paket auf GitHub für weitere Beispiele für Vektoren und Matrizen her und rückwärts zu verwandeln.

+0

In welchem ​​Zustand kann der RAM-Block verwendet werden? Gibt es eine Grenze für die Zugriffe auf einmal? –

+2

@MartinG Die beste Möglichkeit ist es, sich die Interferenzmuster Ihrer Synthesewerkzeuge anzusehen. Zum Beispiel http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_1/ug901-vivado-synthesis.pdf Seite 95 und weiter –

+0

Die Bedingung wird wahrscheinlich beinhalten, dass die Lese- und Schreibprozesse beide synchron sind, dh getaktete Prozesse, da der BlockRam ein synchroner RAM ist - und dass einige Bits der oberen Grenze (32 oder 64) gleichzeitig gelesen werden. –