Forum: FPGA, VHDL & Co. Arrays in conditional assignment [VHDL-AMS]


von gjep (Gast)


Lesenswert?

Hallo zusammen!

(Ich schreibe VHDL-AMS code. Da dies aber eine grundsätzliche VHDL Frage 
ist, stelle ich mein Beitrag in das FPGA/VHDL Forum.)

Ich möchte gern möglichst wenig Code schreiben um meine Werte im Array 
zuzuweisen. Bis jetzt implementiere ich meinen Code wie folgt:

<vhdl>
  type switchesArr is array (2 downto 0) of real;
  signal switches :switchesArr;
-- also possible with std_logic_vector:
  type latchArr is array (2 downto 0) of std_logic;
  signal latch :latchArr;
...
  switches(2) <= 3.0 when (latch(2) = '0') else 0.0;
  switches(1) <= 3.0 when (latch(1) = '0') else 0.0;
  switches(0) <= 3.0 when (latch(0) = '0') else 0.0;
</vhdl>

Könnte man die untersten drei Zeilen irgenwie effizienter verfassen, so 
etwas wie:

<vhdl>
...
  switches(2 downto 0) <= 3.0 when (latch(2 downto 0) = '0') else 0.0;
</vhdl>

oder gibt es Lösungen/Algorithmen für Array-Berechnungen, so dass man 
nicht 100 fast identische Zeilen schreiben muss?

cheers gjep

von Duke Scarring (Gast)


Lesenswert?

gjep schrieb:
> oder gibt es Lösungen/Algorithmen für Array-Berechnungen, so dass man
> nicht 100 fast identische Zeilen schreiben muss?
Wenn ich jetzt nichts übersehen habe, sollte sich dafür eine for-loop 
nutzen lassen.

Duke

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


Lesenswert?

gjep schrieb:
> </vhdl>
Nimm besser die eckigen Klammern [], nicht die Spitzen <>...

gjep schrieb:
> Ich möchte gern möglichst wenig Code schreiben um meine Werte im Array
> zuzuweisen.
Warum?

gjep schrieb:
> oder gibt es Lösungen/Algorithmen für Array-Berechnungen, so dass man
> nicht 100 fast identische Zeilen schreiben muss?
1
for i in 0 to 99 loop
2
  switches(i) = 0.0;
3
  if latch(i)='0' then   switches(i) <= 3.0;  end if;
4
end loop;

von gjep (Gast)


Lesenswert?

Danke für eure Antworten.

Lothar Miller schrieb:
> gjep schrieb:
>> Ich möchte gern möglichst wenig Code schreiben um meine Werte im Array
>> zuzuweisen.
> Warum?

1. bessere Übersicht im Code
2. kann ich mir das Copy&Paste und dann das manuelle Ersetzen der Zahlen 
sparen (meine IDE, System Vision, bietet hier schlechte Unterstützung, 
nicht einmal eine "Ersetzen durch"-Funktion)

Der For-loop müsste ja in einem Process oder Procedure stehen.. Ich 
glaube dadurch wird der Code nicht übersichtlicher. Aber ich habe 
gsehen, es gäbe noch for-generate
1
GEN_SWITCHES: for i in 2 downto 0 generate
2
  switches(i) <= 3.0 when (latch(i) = '0') else 0.0;
3
end generate;

Leider wurde dies bei System Vision noch nicht implementiert.. Konnte 
also nicht probieren, ob der Code so funktionieren würde. Ich bleibe 
also noch dabei, den Code Zeile für Zeile zu implementieren.

Danke nochmals für die Hilfe.

von gjep (Gast)


Lesenswert?

gjep schrieb:
> (meine IDE, System Vision, bietet hier schlechte Unterstützung,
> nicht einmal eine "Ersetzen durch"-Funktion)

Sorry.. der Texteditor der IDE hat eine "Ersetzen durch"-Funktion

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


Lesenswert?

gjep schrieb:
> Der For-loop müsste ja in einem Process oder Procedure stehen..
Ja, ist doch nicht schlimm.

> Ich glaube dadurch wird der Code nicht übersichtlicher.
Ich glaube schon:
a) 5 Zeilen vs. 100 Zeilen: dein eigenes Beispiel!
b) sofortige Übersicht über die Grenzen: Beginn und Ende
c) leicht erkennbar: keine Lücken
b) einfache Wartbarkeit: Anpassen der Grenzen

> Aber ich habe gsehen, es gäbe noch for-generate
Das wird auch funktionieren und ist sogar noch eleganter.

von gjep (Gast)


Lesenswert?

Lothar Miller schrieb:
> a) 5 Zeilen vs. 100 Zeilen: dein eigenes Beispiel!

Oke es sind nur 16 und nicht 100 :) aber es sah so aus wie hunder auf 
den ersten Blick.

Danke nochmals für den Input!

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.