Für die kombinatorische Logik ist if
/ else
als 2: 1-Multiplexer implementiert. In der Booleschen Algebra wäre dies:
Q = (A * S) + (B * S')
wo:
S
ist der Eingang, der von der if
Bedingung gespeist wird ,
A
ist die Eingabe, die vom then
Unterausdruck gespeist wird .
B
ist die Eingabe, die vom else
Unterausdruck gespeist wird , und
Q
ist die Ausgabe des Ausdrucks.
Sie könnten dies theoretisch verallgemeinern, um eine einzelne Taktflanke einzuschließen, aber es wird viel komplexer und würde einer FPGA-Zelle ähneln, wenn Sie fertig sind. Wenn eine Taktflanke enthalten wäre, könnten Sie im Grunde keine else
Klausel haben (da implizit "Ausgabe nicht ändern"), und alle Teile der if
Bedingung, die keine Flanke sind, würden einfach zum Ausdruck für die Taktfreigabe. Sobald sich der Staub gelegt hat, bleibt Ihnen eine weniger klare Version der always_ff
Aussage, die Sie stattdessen sowieso verwenden sollten.
Bedingungen mit zwei oder mehr Taktflanken sind nicht synthetisierbar.
EDIT: Erstens bin ich nicht sicher, ob if(posedge(...))
es synthetisierbar ist. Im Allgemeinen verwenden Sie die posedge(...)
Klausel in der always_ff @(...)
Zeile und benötigen die posedge()
innerhalb des Blocks nicht.
In SystemVerilog ist die generische Form eines 2: 1-Multiplexers eine if
Anweisung. Zum Beispiel:
always_comb begin
if(S)
Q = A;
else
Q = B;
end
Wenn es jedoch eine Taktflanke gibt, müssen Sie ein Flip-Flop verwenden:
always_ff @(posedge CLK) begin
if(CLK_ENA)
Q <= D;
end
Das Hinzufügen eines asynchronen Zurücksetzens sieht folgendermaßen aus:
always_ff @(posedge RESET, posedge CLK) begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
In diesem Fall ist RESET aktiv hoch. Beachten Sie, dass Sie nur sagen müssen, dass RESET im @()
Teil kantenempfindlich ist . Im Rest des Blocks hat RESET den Pegel nach der Kante. Beachten Sie auch, dass die Kantenempfindlichkeiten eine Liste sind; man kann nicht "und" sagen. (Im ursprünglichen Verilog haben Sie Kantenempfindlichkeiten mit "oder" getrennt, was die Leute zum Denken irreführt "und" könnte auch funktionieren.)
if(CLK_ENA & posedge(CLK))
; Beachten Sie, dass ein Teil dieser Bedingung istposedge()
und ein Teil nicht.Wäre dies nicht eine einfache Kombination aus AND und XOR? UND hat die Logik getestet und die zweite ist an hoch gebunden. Bei XOR wird die Logik getestet und die zweite ist hoch gebunden.
UND WENN)
0 (1) = 0
1 (1) = 1
XOR (SONST)
0 (1) = 1
1 (1) = 0
quelle
nand
angemessener alsxor
?