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


von Jan (Gast)


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:
1
entity test is
2
generic(
3
SIZE : integer := 5
4
);
5
end test;
6
7
architecture Behavioral of test is
8
9
-- constants
10
constant LEN : integer := 5;
11
constant START_ADDR : std_logic_vector(7 downto 0) := x"00";
12
13
-- new type
14
type addrArray is array (LEN-1 downto 0) of std_logic_vector(7 downto 0);
15
16
-- function
17
function map_addr return addrArray is
18
19
  variable ret : addrArray;
20
  variable addr: std_logic_vector(7 downto 0) := START_ADDR;
21
22
  begin
23
    for i in 0 to LEN-1 loop
24
      ret(i) :=  addr;
25
      addr := std_logic_vector(unsigned(addr) + SIZE);
26
    end loop;
27
    return ret;
28
29
end map_addr;
30
31
-- signals
32
signal testArray : addrArray;
33
34
begin
35
36
  testArray <= map_addr;
37
38
end Behavioral;

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


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:
1
constant START_ADDR : std_logic_vector(7 downto 0) := x"00";
2
:
3
:
4
  variable addr: std_logic_vector(7 downto 0) := START_ADDR;

von Jan (Gast)


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.

von Sym (Gast)


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.

von Jan (Gast)


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.

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


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

von Clemens M. (panko)


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?

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.