Hallo zusammen,
ich hätte da mal eine VHDL-Frage:
Gibt es eine elegante Möglichkeit, einen loop über Bedingungen zu
machen?
Also z.B. möchte ich folgenden Code (eleganter übersetzen), u.a. möchte
ich eine generische Variable für die Anzahl der Bedingungen einführen
und nicht jedes mal die (Anzahl) Bedingungen abändern:
trg <= '1' when a(0) = '1' and a(1) = '1' and a(2) = '1' and...
...and a(15) = '1';
Ich möchte also auf etwa Folgendes hinaus (wobei N ein vorher
festgelegtes integer ist):
trg <= '1' when
for i in 0 to N - 1 loop
when a(i) = '1'
end loop;
(Das gibt mir natürlich so eine Fehlermeldung)
Vielen Dank schon mal für eure Antworten!!
Christoph
Ich verstehe das Problem eher so:
In einem String "a" mit der Anzahl an Elementen "N" soll das erste
Element mit dem Wert "1" gefunden werden, welches dann dem Index "i"
entspricht.
Hi,
sorry, dann hab ich mich glaube ich zu undeutlich ausgedrückt. Ich
wollte eigentlich nur ein einfaches Beispiel wählen um meine Frage
auszudrücken. Klar, da gibts bestimmt einfachere Lösungen.
Ich wollte aber im Allgemeinen wissen, wie man einen Loop über
Konditionen macht.
Mal ein (hoffentlich besseres) Beispiel:
Ich habe einen Multiplexer mit N (integer) Eingängen, der in
Abhängigkeit von N den N-ten Eingang auf den Ausgang legt.
Bisher habe ich das immer (unelegant) folgendermaßen gemacht:
ausgang <= eingang0 when N = 0 else
eingang1 when N = 1 else
eingang2 when N = 2 else
...
eingangNmax when N = Nmax;
Also ich brauche 1. ziemlich viele Zeilen und
2. muss ich den Multiplexer immer wieder neu anpassen,
wenn ich den Bereich für N (sprich Nmax) ändere.
Erzeugt einen Vektor der Eingänge und maskiert die unerwünschten raus,
so dass nur genau das Bit im Vektor 1 sein kann, dass durch N
beschireben wird.
In diesem Vektor werden alle Bits verodert um sie einem Ausgang
zuzuweisen.
Ist eingangN 1, so wird ausgang 1 zugewiesen, sonst 0.
> ausgang <= eingang0 when N = 0 else> eingang1 when N = 1 else> eingang2 when N = 2 else> ...> eingangNmax when N = Nmax;
Der Trick und das Problem ist aber vermutlich, dass der eingang0 und der
eingang1 hier auch ganz anders heißen könnten, z.B. taster0 und
schalter1 und geber2 und sensor3...
Ich würde das Problem mit dem Trick über den zusammengesetzten Vektor
angehen:
1
-- erst einen Vektor basteln
2
h<=sensor3&geber2&schalter1&taster0;
3
-- und dann einen Mux dahinter
4
ausgang<=h(N);
In der Praxis sieht das dann so aus:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entityInMuxis
6
Port(Ea:inSTD_LOGIC;
7
Eb:inSTD_LOGIC;
8
Ec:inSTD_LOGIC;
9
Ed:inSTD_LOGIC;
10
Ee:inSTD_LOGIC;
11
Ef:inSTD_LOGIC;
12
sel:inSTD_LOGIC_VECTOR(3downto0);
13
Aa:outSTD_LOGIC);
14
endInMux;
15
16
architectureBehavioralofInMuxis
17
signalh:std_logic_vector(5downto0);
18
begin
19
h<=Ef&Ee&Ed&Ec&Eb&Ea;
20
Aa<=h(to_integer(unsigned(sel)));
21
endBehavioral;
Maxx schrieb:> ausgang <= or ( (2**N) & {eingang0, eingang1, eingang2, .... }) ;>> Erzeugt einen Vektor der Eingänge und maskiert die unerwünschten raus,> so dass nur genau das Bit im Vektor 1 sein kann, dass durch N> beschireben wird.>> In diesem Vektor werden alle Bits verodert um sie einem Ausgang> zuzuweisen.
Bis dahin stimmt es...
> Ist eingangN 1, so wird ausgang 1 zugewiesen, sonst 0.
Das leider nicht, denn es wird dem Ausgang ein Vektor zugewiesen, in dem
das entsprechende Bit gesetzt ist. Das ist nicht ganz das, was gewünscht
war...
Man könnte bestenfalls mit der or_reduce() Funktion da ein wenig
rumtricksen. Mehr dazu im
http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd
Lothar Miller schrieb:> Das leider nicht, denn es wird dem Ausgang ein Vektor zugewiesen, in dem> das entsprechende Bit gesetzt ist. Das ist nicht ganz das, was gewünscht> war...
Da muss ich dir widersprechen.
Mit VHDL-2008 ist "or" als unärer Operator vor einem Vektor die
or_reduce Funktion. Ergebnis ist ein std_logic und kein Vektor mehr.
Ich kannte den Operator aus Verilog und er existiert so seit 2008 zu
VHDL wenn man Google glauben darf.
Maxx schrieb:> Mit VHDL-2008 ist "or" als unärer Operator vor einem Vektor die> or_reduce Funktion. Ergebnis ist ein std_logic und kein Vektor mehr.
Ich finde so eine implizite Wandlung nicht unbedingt schön. Dadurch wird
VHDL genau wie C. Dort liebe und hasse ich ich aber exakt diese
"Hintenrumkonvertiererei" von und zu irgendwelchen Datentypen, die einem
so manche Tipparbeit erspart, aber gleichzeitig einige Nachmittage
kosten kann...
Maxx schrieb:> Lothar Miller schrieb:>> Das leider nicht, denn es wird dem Ausgang ein Vektor zugewiesen, in dem>> das entsprechende Bit gesetzt ist. Das ist nicht ganz das, was gewünscht>> war...>> Da muss ich dir widersprechen.>> Mit VHDL-2008 ist "or" als unärer Operator vor einem Vektor die> or_reduce Funktion. Ergebnis ist ein std_logic und kein Vektor mehr.>> Ich kannte den Operator aus Verilog und er existiert so seit 2008 zu> VHDL wenn man Google glauben darf.
Interessant, benötigt mn dazu das reduce package?
http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd
?
MfG,
Fpga Kuechle schrieb:> Interessant, benötigt mn dazu das reduce package?> http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd
Das kann ich dir leider nicht beantworten.
Selbst entwickel ich mit dem Xilinx WebPack unter Verilog und kenn VHDL
nur ganz grob. Daher musste ich auch Onkel Google dazu befragen ob es
den Operator überhaupt gibt.
Lothar Miller schrieb:> Maxx schrieb:>> Mit VHDL-2008 ist "or" als unärer Operator vor einem Vektor die>> or_reduce Funktion. Ergebnis ist ein std_logic und kein Vektor mehr.> Ich finde so eine implizite Wandlung nicht unbedingt schön.
Dann schreib das explizit aus, die Funktion or_reduce steht dir ja zur
Verfügung:
1
functionor_reduce(L:BOOLEAN_VECTOR)returnBOOLEAN;
Da es ein VHDL-2008 Feature ist, soltest du das ohne Package nutzen
können mit einer VHDL-2008 Tool-Chain.
Mit den VHDL-2008 Support Library Packages kannst du das auch allen
anderen Tools nachrüsten (Nicht alle VHDL-2008 Features lassen sich
nachrüsten).
Die gibts hier: http://www.eda.org/fphdl/
Christoph Z. schrieb:> kannst du das auch allen anderen Tools nachrüsten
Ich möchte ja gar nicht, mir hat das explizite or_reduce() ja schon ganz
gut gefallen. Da wird dann nicht mit dem simplen OR Operator auch
gleichzeitig der Typ geändert. Ich werde es weiterhin umständlich
schreiben.
> Mit den VHDL-2008 Support Library Packages du das ... nachrüsten
Gut zu wissen. Ein paar schöne Sachen sind ja dabei... ;-)
Christoph schrieb:> Hallo zusammen,>> ich hätte da mal eine VHDL-Frage:>> Gibt es eine elegante Möglichkeit, einen loop über Bedingungen zu> machen?> Also z.B. möchte ich folgenden Code (eleganter übersetzen), u.a. möchte> ich eine generische Variable für die Anzahl der Bedingungen einführen> und nicht jedes mal die (Anzahl) Bedingungen abändern:>> trg <= '1' when a(0) = '1' and a(1) = '1' and a(2) = '1' and...> ...and a(15) = '1';>
Im Package
IEEE.std_logic_misc.all
http://www.csee.umbc.edu/~squire/download/std_logic_misc.vhdl
gibt es Funktionen wie and_reduce, or_reduce die kannst du dafür
benutzen
trg <= '1' when and_reduce (a);
Tom