Matrix initialisieren

Gast #1695057
Lesenswert?

hallo,
ich habe in vhdl folgende matrix in verwendung: (möchte einen ram bauen)

type dataout is array (6 downto 0,11 downto 0) of std_logic_vector(3 
downto 0);

gut, wie kann ich das ding jetzt initialisieren? habe mir überlegt das 
es irgendwie über eine Funktion möglich sein sollte, aber funktioniert 
das nicht auch einfacher mit einem others konstrukt?

bitte um hilfe.
Gast #1695093
Lesenswert?

da wird von std_logic gesprochen und nicht von std_logic_vector, du hast 
3 Dimensionen beschrieben (2 durch das Array und 1 durch den vector), 
für RAM brauchst du aber 2 Dimensionen, d.h. eine muss raus und ich 
empfehle dir die 2. Dimension aus dem Array zu nehmen, also:
array(1. dimension) of std_logic_vector(2.dimension)
Moderator (Firma: Titel) Persönliche Seite #1695171
Lesenswert?

D. I. schrieb:
> 3-dimensionaler RAM? Das wird nicht gehen.
Warum nicht?
In der Praxis ist das hier
1
type dataout is array (6 downto 0,11 downto 0) of std_logic_vector(3 downto 0);
ja physikalisch das selbe wie
1
type dataout is array (18 downto 0) of std_logic_vector(3 downto 0);
und daran angeschlossen eine aufgeteilte Adressleitung (z.B. nicht 
ungewöhlich für einen Pixelspeicher X*Y*Pixeldata).
Gast #1695193
Lesenswert?

Kriegen dass die Synthesetools auch mittlerweile hin? Mein letzter 
Kenntnisstand ist das Arrays mit mehr als einer Dimension noch nicht so 
wirklich unterstützt wurden, lasse mich natürlich gerne eines besseren 
belehren
Gast #1696063
Lesenswert?

hallo,
naja nicht so wirklich. warum. das beispiel das ich oben gebracht habe 
sollte nur der illustration dienen. in wirklichkeit ist meine matrix 
128x64 groß, d.h. da will ich nicht händisch so eine matrix aufstellen. 
gibts da keine konstruktion so das man das irgendwie mit others machen 
kann.

ich hab in einem forum für ROMs gefunden, das da jemand die init. mit 
einer funktion gemacht hat. das ganze sieht dann ungefähr so aus:

function init_ram
    return RAM_MATRIX is
    variable tmp : RAM_MATRIX;
  begin
    for col in 0 to 2**ASCII_RAM_COL_ADDR_WIDTH - 1 loop
      for row in 0 to 2**ASCII_RAM_ROW_ADDR_WIDTH - 1 loop
        tmp(row, col) := std_logic_vector(to_unsigned(0, CHAR_WIDTH));
      end loop;
    end loop;
    return tmp;
  end init_ram;

weis aber ehrlich gesagt nicht ob das auch wirklich funktioniert. 
kompilieren lässt es sich zumindest. aber was dann bei der synthese 
draus wird, ... keine ahnung
Moderator (Firma: Titel) Persönliche Seite #1696095
Lesenswert?

> (6 downto 0,11 downto 0)
Sind das Vektoren? Das geht sowieso nicht. Da mußt du schreiben
 (0 to 2**6-1, 0 to 2**11-1)
Denn Arrays können nur über integer indiziert werden.

>> Evtl. hilft dir das weiter
> naja nicht so wirklich. warum.
Muß man denn eigentlich immer alles selber machen?  :-/
Also, nur so als Beweis, dass es doch geht:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4

5
entity ArrayInit is
6
    Port ( a1 : in  STD_LOGIC_VECTOR (3 downto 0);
7
           a2 : in  STD_LOGIC_VECTOR (3 downto 0);
8
           d1 : out  STD_LOGIC_VECTOR (3 downto 0));
9
end ArrayInit;
10

11
architecture Behavioral of ArrayInit is
12
type array_type is array (0 to 15, 0 to 15) of std_logic_vector(3 downto 0);
13
signal ary : array_type := ( (others => (others => (others => '1'))) );  -- Initialisierung
14
begin
15
   d1 <= ary(to_integer(unsigned(a1)),to_integer(unsigned(a2)));
16
end Behavioral;
(Firma: www.dossmatik.de) #1696468
Lesenswert?

Ich habe einmal mit 3Arrays versucht zu arbeiten. Es war simulierbar, 
doch eben nicht synthetisierbar. Scheinbar sind die Tools besser 
geworden. Der RAM ist letztendlich nur ein linearer Speicher. Lieber 
selber einen Adressdecoder bauen, als sich auf eine unbekannte Variante 
der Implementierung verlassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren