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
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
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!
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.
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... ;-)
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; |
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.