Arrays in conditional assignment [VHDL-AMS]

Gast #3850033
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
Moderator (Firma: Titel) Persönliche Seite #3850132
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;
Gast #3850306
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.
Moderator (Firma: Titel) Persönliche Seite #3850319
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren