Forum: FPGA, VHDL & Co. Matrix initialisieren


von inGoogleITrust (Gast)


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.

von D. I. (Gast)


Lesenswert?

3-dimensionaler RAM? Das wird nicht gehen.

von inGoogleITrust (Gast)


Lesenswert?

doch geht. kompilieren lässt es sich im modelsim

von D. I. (Gast)


Lesenswert?

Ja aber synthetisieren lassen wird es sich nicht

von inGoogleITrust (Gast)


Lesenswert?

sicher? habs von dem thread da http://www.edaboard.com/ftopic202851.html

von D. I. (Gast)


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)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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).

von D. I. (Gast)


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

von inGoogleITrust (Gast)


Lesenswert?

gut also kann ich das schon synthetisieren. so dann komm ich zu meiner 
ursprünglichen frage zurück, wie kann ich das ding mit 0er 
initialisieren?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?


von inGoogleITrust (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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;

von René D. (Firma: www.dossmatik.de) (dose)


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.

von inGoogleITrust (Gast)


Lesenswert?

passt sehr gute danke Lothar. habe die änderungen nach deinem beispiel 
vorgenommmen, und jetzt kompiliert das ding. bin schon gespannt wie es 
sich beim synthetisieren verhält.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.