www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Matrix initialisieren


Autor: inGoogleITrust (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3-dimensionaler RAM? Das wird nicht gehen.

Autor: inGoogleITrust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doch geht. kompilieren lässt es sich im modelsim

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber synthetisieren lassen wird es sich nicht

Autor: inGoogleITrust (Gast)
Datum:

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

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. I. schrieb:
> 3-dimensionaler RAM? Das wird nicht gehen.
Warum nicht?
In der Praxis ist das hier
type dataout is array (6 downto 0,11 downto 0) of std_logic_vector(3 downto 0);
ja physikalisch das selbe wie
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).

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: inGoogleITrust (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: inGoogleITrust (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity ArrayInit is
    Port ( a1 : in  STD_LOGIC_VECTOR (3 downto 0);
           a2 : in  STD_LOGIC_VECTOR (3 downto 0);
           d1 : out  STD_LOGIC_VECTOR (3 downto 0));
end ArrayInit;

architecture Behavioral of ArrayInit is
type array_type is array (0 to 15, 0 to 15) of std_logic_vector(3 downto 0);
signal ary : array_type := ( (others => (others => (others => '1'))) );  -- Initialisierung
begin
   d1 <= ary(to_integer(unsigned(a1)),to_integer(unsigned(a2)));
end Behavioral;

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

Bewertung
0 lesenswert
nicht 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.

Autor: inGoogleITrust (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.