mikrocontroller.net

Forum: FPGA, VHDL & Co. Array mit Adresszeigern "dynamisch" füllen


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich habe eine kurze Frage bezüglich der Optimierbarkeit eines 
Code-Blocks, der RAM-Adresszeiger erzeugen soll.  Mit dem Generic SIZE 
wird dabei die Größe von Paketen in Bytes vorgegeben. Die Konstante LEN 
gibt an wieviele Adresszeiger erzeugt werden sollen. Mit SIZE=2 und 
LEN=3 soll zB:

addr1 = 0000
addr2 = 0010
addr3 = 0100

erzeugt werden. Da mir noch ein wenig Erfahrung mit VHDL fehlt, hab ich 
das momentan relativ aufwendig mit einer Funktion gemacht.

Daher meine Frage... geht das effektiver und mit weniger Code?

Danke für alle Verbesserungsvoschläge!

Hier meine bisheriger Ansatz:
entity test is
generic(
SIZE : integer := 5
);
end test;

architecture Behavioral of test is

-- constants
constant LEN : integer := 5;
constant START_ADDR : std_logic_vector(7 downto 0) := x"00";

-- new type
type addrArray is array (LEN-1 downto 0) of std_logic_vector(7 downto 0);

-- function
function map_addr return addrArray is

  variable ret : addrArray;
  variable addr: std_logic_vector(7 downto 0) := START_ADDR;

  begin
    for i in 0 to LEN-1 loop
      ret(i) :=  addr;
      addr := std_logic_vector(unsigned(addr) + SIZE);
    end loop;
    return ret;

end map_addr;

-- signals
signal testArray : addrArray;

begin

  testArray <= map_addr;

end Behavioral;

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

Bewertung
0 lesenswert
nicht lesenswert
Jan schrieb:
> Da mir noch ein wenig Erfahrung mit VHDL fehlt, hab ich
> das momentan relativ aufwendig mit einer Funktion gemacht.
>
> Daher meine Frage... geht das effektiver und mit weniger Code?
Eine Gegenfrage: soll das synthetisiert werden?
Offenbar nicht, denn du hast keinen Port definiert.


> Daher meine Frage... geht das ... mit weniger Code?
Ja, wenn du solche unnötigen Konstanten weglässt, die sowieso nur 1 mal 
verwendet werden:
constant START_ADDR : std_logic_vector(7 downto 0) := x"00";
:
:
  variable addr: std_logic_vector(7 downto 0) := START_ADDR;

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist natürlich nur ein Minimalbeispiel, um zu zeigen, wie ich das 
ganze lösen will. Wollte nicht mein ganzes Modul hier reinsstellen, da 
es ja nur um das erzeugen der Adressen geht.

Autor: Sym (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was möchtest du genau machen? Ein ROM? Ein initialisiertes RAM?
Die oben gezeigte Funktion ist nur ein Addierer, sowas packt man nicht 
in eine Tabelle.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sym schrieb:
> Was möchtest du genau machen? Ein ROM? Ein initialisiertes RAM?
> Die oben gezeigte Funktion ist nur ein Addierer, sowas packt man nicht
> in eine Tabelle.

Ich habe ein BlockRAM, auf welches ich über einen Ringbuffer zugreifen 
will. Anstatt diesen byteweise zu addressieren, will ich das ganze für 
Pakete mit variabler Bytelänge realisieren. Deswegen generiere ich mir 
die statischen Adressen über diesen "Addierer", so dass ich den 
Ringbuffer dann nur auf diesen LEN Adressen laufen lasse. Innerhalb 
eines Lese/Schreibzykluses wird dann natürlich SIZE-mal auf die Bytes 
zugegriffen.

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

Bewertung
0 lesenswert
nicht lesenswert
Jan schrieb:
> Ich habe ein BlockRAM, auf welches ich über einen Ringbuffer zugreifen
> will. Anstatt diesen byteweise zu addressieren, will ich das ganze für
> Pakete mit variabler Bytelänge realisieren.
Das, was due hier beschreibst, wird sowieso bestenfalls für eine 
Initialisierung taugen. Denn auch bei einem BRAM kannst du pro 
Taktzyklus immer nur 1 Wort ändern. Deine Beschreibung mit der loop 
würde aber das RAM komplett in 1 Takt ändern.

Entweder habe ich die Aufgabenstellung noch nicht erkannt, oder ich 
würde das ein wenig anders machen:
Nimm einen BRAM mit größerer Breite und füge einfach z.B. in das 9. Bit 
eine Anfangskennung ein. Du wirst sowieso jedes Byte einzeln aus dem 
BRAM auslesen müssen. Und wenn dann das 9. Bit gesetzt ist, beginnt ein 
neues Paket...

Autor: Clemens M. (panko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollen nicht in einem Vektor Startadressen (also Offsetadressen) in 
dieses BRam initialisiert werden?
Wenn das zur Laufzeit ebenfalls möglich sein muss, würde es über eine 
for-Schleife nicht funktionieren, die Schleifenparameter müssen doch 
bekannt sein? Es wird ja auch die notwendige Hardware erzeugt, also 
nichts parametrisierbares.
Richtig?

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.