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.
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)
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).
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
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?
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
> (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; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.