Ich wollte in Verilog ein D-Flip-Flop bauen, leider lässt sich der erste untenstehende Code nicht fitten. Wie heiß die Zuweisung q_bar<=!q; richtig? module d-flip( input d, input clk, output reg q, output wire q_bar ); always @ (posedge clk) begin q<=d; end q_bar<=!q; endmodule Das geht dagegen, verbraucht aber zwei Register. Das finde ich wiederum Verschwendung von Registern. module d-flip( input d, input clk, output reg q, output reg q_bar ); always @ (posedge clk) begin q <= d; q_bar <= ! d; end endmodule
Ohne jetzt von Verilog etwas zu verstehen, aber mit Deinem Beispiel kannst Du nicht auf Verschwendung schließen. Du musst die Elemente betrachten, die Dein FPGA zur Verfügung stellt und im Gegensatz zu einem "normalen" '74 Baustein haben die internen FPGA FF-s keine invertierten Ausgänge, weils diese nicht braucht. Wenn Du also von deinem FPGA "nur" ein FF, aber mit invertieren Ausgängen verlangst, dann muss der Baustein 2 interne FFs verwenden. Wenn Du aber beide Ausgänge im FPGA weiterverarbeitest, dann wird der invertierte Ausgang wegoptimiert, weil der Inverter am Ausgang in die Kombinatorik vor der nächsten Stufe hineingezogen wird.
Outputs müssen in Verilog alle reg sein. Woher soll der Compiler denn auch wissen dass davor schon einer ist, das ist wahrscheinlich zu viel logig ;-)
1 | module d_flip( input d, input clk, output reg q, output wire q_bar ); |
2 | always @ (posedge clk) |
3 | begin |
4 | q<=d; |
5 | end |
6 | assign q_bar=!q; |
7 | endmodule |
mki (Gast) schrieb: > Outputs müssen in Verilog alle reg sein. Nein. Gruß Marcus http://www.doulos.com/
Ja die primitiven Elemente FD** von Xilinx haben auch nur einen Ausgang. Da kann es nicht zwei Ausgänge gleichzeitigt geben. Zumindest bei der Herstellung eines Flip Flopes aus digitalen Gatter entsteht Q und Q negiert. Q negiert wird nicht herausgeführt. > Marcus Harnisch >> Outputs müssen in Verilog alle reg sein. ><Nein. Kannst du noch einen Satz mehr dazu sagen. Ich kann VHDL und muss mich über Reg oder Wire gar keine Gedanken machen.
>Marcus Harnisch Kannst du das Buch von deiner Company empfehlen? Ich suche noch nach einem Verilog Nachschlage Werk.
René D. schrieb: >> Marcus Harnisch >>> Outputs müssen in Verilog alle reg sein. > >><Nein. > > Kannst du noch einen Satz mehr dazu sagen. Ich kann VHDL und muss mich > über Reg oder Wire gar keine Gedanken machen. Es gibt in VHDL keine Entsprechung dafür, auch wenn oft versucht wird, das mit VHDL Konzepten zu erklären. In Kürze: Ein "reg" (allgemein: var) ist eine ganz normale Variable (was in VHDL durch eine Variable oder ein Signal dargestellt werden kann. Insbesondere hat ein reg absolut nichts mit Registern zu tun wie der Name ja schon andeutet :-) Ein reg behält den Wert, der ihm als letztes zugewiesen wurde. Es gibt nur einen Treiber und daher auch keine Auflösungsfunktion. Ein reg kann in Verilog nur prozedural zugewiesen werden. Ein "wire" (allgemein: net) ist genau das -- ein Knoten in einem elektrischen Netzwerk. Man kann wires nur durch continuous assignments Werte zuweisen. Wires können mehrere Treiber haben und benötigen daher eine Auflösungsfunktion ähnlich wie bei VHDL und std_logic. Eingänge (auch bidirektionale) eines Moduls sind immer vom Typ wire. Ausgänge können auch durch Variablen getrieben werden. In SystemVerilog wurden die Regeln für Variablenzuweisung etwas aufgeweicht, so dass man sich bei den meisten Designs auch mit (System)Verilog keine Platte mehr machen muss. Gruß Marcus http://www.doulos.com/
René D. schrieb: > Kannst du das Buch von deiner Company empfehlen? Was soll ich dazu sagen... 1. Bisher hat sich keiner beklagt. Im Ernst: die Bücher genießen zu recht einen sehr guten Ruf. 2. Die GRGs sind die meistgeklauten Doulos merchandise Artikel auf diversen Veranstaltungen. 3. Wenn man einen Kurs besucht, bekommt man es sogar umsonst (lechz!) Es handelt sich aber ausdrücklich um ein Nachschlagewerk, kein Lehrbuch! Gruß Marcus http://www.doulos.com/
Die Lösung ist das Schlüsselwort assign. Ich habe noch nicht verstanden warum es für kombinatorischen Logik gebraucht wird und für sequentielle Logik nicht. Die Zuweisung unterscheidet sich auch noch in dem Operator = und <=. Die Lösung beweist auch, dass Marcus recht hat. Es müssen nicht immer die Ausgänge vom Typ reg sein. module flip( input d, input clk, output reg q, output q_bar ); //reg q,q_bar; always @ (posedge clk) begin q<=d; end assign q_bar=!q; endmodule
René D. schrieb: > Die Lösung ist das Schlüsselwort assign. Ich habe noch nicht verstanden > warum es für kombinatorischen Logik gebraucht wird und für sequentielle > Logik nicht. Man kann es auch für sequentielle Logik verwenden. Ist dort allerdings nicht sehr gebräuchlich. > Die Zuweisung unterscheidet sich auch noch in dem Operator > = und <=. Man unterscheidet in Verilog zwischen blocking und non-blocking assignments. Das ist entfernt verwandt mit der Zuweisung einer VHDL Variable (sofort wirksam), oder einem Signal (am Ende des delta cycle). Bei continuous assignments gibt es nur diese eine Sorte. Gruß Marcus http://www.doulos.com/
>Man kann es auch für sequentielle Logik verwenden. Ist dort allerdings >nicht sehr gebräuchlich. Marcus das geht nicht, da bekomme ich eine Fehlermeldung. ERROR:HDLCompilers:26 - "flip.v" line 25 expecting '=', found '<=' module flip( input d, input clk, output reg q, output q_bar ); //reg q,q_bar; always @ (posedge clk) begin assign q<=d; end assign q_bar=!q; endmodule PS: Gibt es das Buch auch in D oder kann man es nur aus US beziehen?
always @ (posedge clk)
begin
assign q<=d; <<<<< das hier ist die Zeile 25. Stimmts?
end
assign q_bar=!q; <<<< warum kommt hier kein Fehler?
Und was ist der Unterschied in den beiden Zeilen?
>>>> expecting '=', found '<='
Hallo Lothar, > assign q<=d; <<<<< das hier ist die Zeile 25. Stimmts? stimmt module flip( input d, input clk, output reg q, output q_bar ); always @ (posedge clk) begin q<=d; end assign q_bar=!q; endmodule _____________________________-- <= ist eine getaktete Zuweisung und wird mit der positiven Flanke auf clk übernommen. assgin = ist "statisch" verdrahtet. Und jetzt noch die Verwirrung zum Schluß. Die zweite Zuweisung ist durch die Semantik als ungetaktet Zuweisung definiert. Diese Zeile darf aber nicht zwischen begin und end stehen. Das ergibt auch eine Fehlermeldung, weil es keine getaktete Zuweisung ist. Ich finde die Semantik in VHDL logischer oder ich konnte mein Verilog Verständnis noch nicht finden. Zumindest muss ich es finden, weil ich durch Verilog hindurch muss.
René D. schrieb: > Marcus das geht nicht, da bekomme ich eine Fehlermeldung. > ERROR:HDLCompilers:26 - "flip.v" line 25 expecting '=', found '<=' Marcus Harnisch schrieb: >> Bei continuous assignments gibt es nur diese eine Sorte. Deswegen. > PS: Gibt es das Buch auch in D oder kann man es nur aus US beziehen? Unser Webshop ist de anscheinend etwas unglücklich geraten. Danke für den Hinweis. Das Buch kann man selbstverständlich auch in Deutschland bekommen. Bei den "Contacts" findest Du die deutsche Telefonnummer, dort kannst Du auch direkt per Rechnung bestellen. Gruß Marcus http://www.doulos.com/
René D. schrieb: > <= ist eine getaktete Zuweisung und wird mit der positiven Flanke auf > clk übernommen. Großes Missverständnis! Das non-blocking assignment hat mit einem Takt absolut nichts zu tun. Du hättest hier genauso gut ein blocking assignment verwenden können. Blocking und non-blocking assignments unterscheiden sich nur in ihrem Verhalten innerhalb eines Zeitschritts. Sie sind der Hauptgrund für das Auftreten von race-conditions in Verilog. > assgin = ist "statisch" verdrahtet. Alles in Verilog ist letzlich statisch verdrahtet. Ich versuch's mal in ASCII art:
1 | Variable |
2 | +--+ |
3 | | |---->o---->o----> <effektiver Wert> |
4 | +--+ | | |
5 | / | |
6 | assign -' | |
7 | / |
8 | force -------' |
assign und force überschreiben den Wert einer Variablen und force den Wert des assign. Für wires gilt das ähnlich, nur dass es keinen (Variablen)Wert zu überschreiben gibt, sondern nur ein assign. Daher kann innerhalb prozeduraler Blöcke nur noch force auf wires angewendet werden. Beide Konstrukte (procedural continuous assignments auf Variablen bzw. wires) sind aber eher selten anzutreffen. Wenn überhaupt dann nur in Testbenches. Nur weil etwas in einer Sprache möglich ist, muss man es ja nicht gleich verwenden. > Zumindest muss ich es finden, weil ich durch Verilog hindurch muss. Vielleicht mal den Chef nach geeigneten Weiterbildungsmaßnahmen fragen. Dann hat sich auch die Frage nach der Buchbestellung erledigt :-) Gruß Marcus http://www.doulos.com/
Hallo Marcus, danke fuer deine Beitraege hier! Ich mache zwar im Moment VHDL aber ich liebe Verilog (ist einfach kompakter, knackiger...) Gruss - berndl
wer mal verilog races und andere nicklichkeiten suchen musste wird sich an vhdl erfreuen. zudem sind verilog races gift fuer eine unabhaengigkeit vom simulator hersteller. mfg/
> Ich mache zwar im Moment VHDL aber ich > liebe Verilog (ist einfach kompakter, knackiger...) "Ich bin zwar mit Veronika liiert, aber ich liebe Victoria (ist einfach knackiger)." Pass auf, wenn du mal mit Victoria verheiratet bist, wirst du manchmal wehmütig an Veronika zurückdenken... ;-)
Letztendlich ist das doch völlig egal. Dadurch das man ohnehin nur (atomar gesehen) simple Operationen beschreiben kann die auf ein Minimum an verschiedener Hardware abgebildet werden ist die Sprache an sich doch gar nicht entscheident. Ist ja nicht so das man (egal auf welcher Seite) irgentwelche komplizierten Dinge lernen MUSS. Klar kann man, aber selbst dann hört es schnell auf sobald man etwas tiefer gräbt, weil der Synthesizer das häufig eh nicht mehr beherrscht. Ich habe mich mit beiden Sprachen etwas beschäftigt und ehrlich gesagt ist es mir völlig schnuppe welche ich verwende. Solange ich im Kopf einen Plan davon habe was ich realisieren will klappt das auch meistens. Die Sprache ist dann nur Mittel zum Zweck das aufzuschreiben. Natürlich kann trotzdem jeder seine Präferenz haben.
Ein "assign" in Verilog ist für die Leute die nur imperative Programmiersprachen kennen relativ schwer verständlich. Für Leute die auch mal echte funktionale Sprachen verwendet haben, ist "assign" ganz einfach. Ansonsten gibt es eine einfache "Merkhilfe". In der Praxis ist assign eine Abkürzung:
1 | assign x = bla; |
ist etwa das gleiche wie:
1 | always @(bla) |
2 | begin |
3 | x = bla; |
4 | end |
Die Realität ist etwas anders, da man assigns auch ändern kann, aber das ist ein anderes Kapitel.
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.