Forum: FPGA, VHDL & Co. Bedingte Zuweisung als assign_Anweisung [Verilog]


von Thomas_melek T. (Firma: google) (thomas_melek) Flattr this


Lesenswert?

Hallo ich brauche einen multiplexer der mir mein Ausgangsignal abhängig 
von zwei Steuersiganalen multiplext.

als if else würde was ich meine wie folgt aussehen (VEREINFACHT!):

always @(posedge clk)begin
   if(signal1 == 3'b000)begin
      data_o <= data_signal1;
   end
   else if(signal2 == 3'b100) begin
      data_o <= data_signal2;
   end
   else begin
     data_o <= data;
   end
end

Beachtet dabei bitte dass data_signal1, data_signal2 & data aus 
verschiedenen Quellen kommen.

so weit so gut.
dieses muss ich in ein bereits bestehendes Modul integireren dort ist 
bereits ein Multiplexer eingebaut allerdings noch nicht unter Beachtung 
des Signal2.

Da ich nicht alles umbauen möchte, würde ich gerne von euch wissen wie 
ich den folgenden Code zu dem machen kann was ich im Endeffekt haben 
möchte.
(Ich schreibe Verilog erst seit kurzer Zeit deswegen kenne ich mich mit 
bedingten Operatoren noch nicht gut genug aus)

Also der bestehende Code:

assign data_o = (signal1 == 3'b000) ?
                data : data_signal1;

Vielen Dank für eure Hilfe schonmal im Voraus!

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


Lesenswert?

Thomas M. schrieb:
> Also der bestehende Code:
Der ist aber irgenwie "andersrum" wie dein Code. Im Originalcode wird 
dem Ausgang "data" zugewiesen wenn die Bedingung (signal1 == 3'b000) 
zutrifft. Hier mal die Code-Zeile und drunter die natürlichsprachliche 
Übersetzung:
1
assign data_o =       (signal1 == 3'b000) ?    data  :    data_signal1;
2
weise data_o zu: wenn (signal1 == 3'b000) dann data sonst data_signal1


Ich liebe den Komma-Operator. Echt toll, damit kann man 
selbstverschlüsselnden Code verfassen. Das wäre für mich der einzige 
Grund, Verilog anzufangen... ;-)

Thomas M. schrieb:
> Beachtet dabaei das data_signal1, data_signal2 & data aus verschiedenen
> Quellen kommen.
Das ist egal. Mein Vorschlag:
1
assign data_o =       (signal1 == 3'b000)   ?  data_signal1 :          (signal2 == 3'b100) ?     data_signal2   :   data;
2
weise data_o zu: wenn (signal1 == 3'b000) dann data_signal1 sonst wenn (signal2 == 3'b100) dann  data_signal2 sonst data

: Bearbeitet durch Moderator
von Thomas_melek T. (Firma: google) (thomas_melek) Flattr this


Lesenswert?

Hey rießen Dank für die schnelle Antwort.

>Der ist aber irgenwie "andersrum" wie dein Code. Im Originalcode wird
>dem Ausgang "data" zugewiesen wenn die Bedingung (signal1 == 3'b000)
>zutrifft:
Ja du hast recht sollte != Operator sein ;)

Aber Vielen Dank ich probiere es gleich mal aus!

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


Lesenswert?

Thomas M. schrieb:
> Ja du hast recht sollte != Operator sein ;)
Wo?

von Markus F. (mfro)


Lesenswert?

Lothar M. schrieb:
> Ich liebe den Komma-Operator. Echt toll, damit kann man
> selbstverschlüsselnden Code verfassen. Das wäre für mich der einzige
> Grund, Verilog anzufangen... ;-)


Dafür brauchst Du doch nicht extra Verilog anfangen, das ist doch genau 
dasselbe wie ein WHEN in VHDL?
1
assign data_o = (signal1 == 3'b000) ?
2
                data : data_signal1;

<=>
1
data_o <= data WHEN signal1 = "000" ELSE data_signal1;

Ich kann da in der VHDL-Version keine ausgeprägt besseren syntaktischen 
Qualitäten entdecken. Für mich ist das jedenfalls genauso "rückwärts 
gestrickt" wie der Fragezeichen-Operator.

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


Lesenswert?

Markus F. schrieb:
> Für mich ist das jedenfalls genauso "rückwärts gestrickt" wie der
> Fragezeichen-Operator.
Aber ich kann diese eine VHDL-Zeile jedem auf der Straße geben und der 
kann mir sagen, was die macht. Garantiert...

Was ist einfacher zu kapieren?
1
1) richtung <= links when ziel=theater else rechts;
2
2) richtung = ziel==theater?links:rechts;

Und dann das hier:
1
1) richtung <= links  when ziel=theater else 
2
               rechts when ziel=bahnhof else
3
               geradeaus;
4
2) richtung = ziel==theater?links:ziel==bahnhof?rechts:geradeaus;
Mein Tipp: zuerst jeweils die Zeile 2 zum Knobeln geben. Dann kann die 
entsprechende Zeile 1 als Auflösung genommen werden...   ;-)

von Lattice User (Gast)


Lesenswert?

Lothar M. schrieb:> Und dann das hier:
1
1) richtung <= links  when ziel=theater else
2
               rechts when ziel=bahnhof else
3
               geradeaus;
4
2) richtung = ziel==theater?links:ziel==bahnhof?rechts:geradeaus;
> Mein Tipp: zuerst jeweils die Zeile 2 zum Knobeln geben. Dann kann die
> entsprechende Zeile 1 als Auflösung genommen werden...   ;-)

Auch Verilog kann man lesbar formulieren, und auch VHDL unlesbar
1
1) richtung <= links  when ziel=theater else rechts when ziel=bahnhof else geradeaus;
2
3
2) richtung = ziel == theater ? links  :
4
              ziel == bahnhof ? rechts :
5
              geradeaus;

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


Lesenswert?

Lattice User schrieb:
> Auch Verilog kann man lesbar formulieren, und auch VHDL unlesbar
Der Fragezeichenoperator ist eh' ein kryptischer, dessen Anwendung wird 
gegen eine "natürlichsprachlichere" Syntax immmer verlieren. Das ist 
jetzt aber nicht unbedingt Verilog anzukreiden, sondern diesem einen 
Operator...

Thomas M. schrieb:
> Also der bestehende Code:
> assign data_o = (signal1 == 3'b000) ? data : data_signal1;
Ich vermute stark, dass Thomas stattdessen mit diesem Ausdruck kein 
Problem gehabt und keine Frage gestellt hätte:
1
    data_o  <=  data when (signal1="000") else data_signal1;

: Bearbeitet durch Moderator
von Markus F. (mfro)


Lesenswert?

Lothar M. schrieb:
> Der Fragezeichenoperator ist eh' ein kryptischer,

Da kann man sich sicher drüber streiten. Für mich z.B. ist es bloß 
natürlich, daß ein Fragezeichen eine Frage beendet.
1
richtung = ziel==theater?links:ziel

Merken muß man sich bloß, daß der Doppelpunkt hier für ein "ansonsten" 
steht.

Vielleicht hab' ich auch zu lange C programmiert.

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


Lesenswert?

Markus F. schrieb:
> Merken muß man sich bloß...
Man muss sich auch "merken", dass das erste Gleichheitszeichen ein "ist, 
wenn" ist... ;-)

> richtung <= links when ziel=theater else rechts;
> richtung = ziel==theater?links:ziel
> Merken muß man sich bloß, daß der Doppelpunkt hier für ein "ansonsten"
> steht.
Ich geh mal kurz rüber und frag einn paar Kollegen, die den ?-Oerator 
nicht kennen, wohin es zum Theater geht.

EDIT:
Das Ergebnis war 3:0, ratet mal wofür. Das meinte ich mit "kryptisch". 
Es ist ja nicht so, dass ich bei C den Operator nicht verwende. Er ist 
einfach nur ungewohnt (übrigens auch für viele C-Programmierer)... ;-)

: Bearbeitet durch Moderator
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.