Forum: FPGA, VHDL & Co. Verilog Zuweisung


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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

von Klaus F. (kfalser)


Lesenswert?

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.

von mki (Gast)


Lesenswert?

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 ;-)

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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/

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

>Marcus Harnisch
 Kannst du das Buch von deiner Company empfehlen?
Ich suche noch nach einem Verilog Nachschlage Werk.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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/

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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/

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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/

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

>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?

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


Lesenswert?

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 '<='

von René D. (Firma: www.dossmatik.de) (dose)


Angehängte Dateien:

Lesenswert?

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.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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/

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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/

von berndl (Gast)


Lesenswert?

Hallo Marcus,

danke fuer deine Beitraege hier! Ich mache zwar im Moment VHDL aber ich 
liebe Verilog (ist einfach kompakter, knackiger...)

Gruss
- berndl

von nixda (Gast)


Lesenswert?

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/

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


Lesenswert?

> 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...  ;-)

von Iulius (Gast)


Lesenswert?

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.

von Verilog-Schüler (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.