Bedingte Zuweisung als assign_Anweisung [Verilog]

OP (Firma: google) #4430803
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!
Moderator (Firma: Titel) Persönliche Seite #4430814
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
#4434738
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.
Moderator (Firma: Titel) Persönliche Seite #4434761
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...   ;-)
Gast #4434965
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;
Moderator (Firma: Titel) Persönliche Seite #4435034
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;
#4435122
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.
Moderator (Firma: Titel) Persönliche Seite #4435153
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)... ;-)

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