Arrays in conditional assignment [VHDL-AMS]

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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.