Generische Methode zur Implementierung der if-else-Anweisung in Hardware (unter Verwendung von Gates, Mux-Demux, Flip-Flops) usw.

7

Ich arbeite derzeit daran, eine Hochsprache in ein Ersatzschaltbild umzuwandeln. Ich kann einfache Ausdrücke wie a + b, ab oder eine Kombination davon mithilfe von Gates konvertieren. Aber ich wollte wissen, ob es eine generische Methode gibt, um eine if-else-Anweisung mit elektronischen Komponenten wie Gates, Mux, ff zu implementieren. Eine einfache Antwort wäre die Verwendung von Mux-Demux. Aber das würde das folgende Problem nicht lösen (zum Beispiel)

if(posedge(clock)):

q<=d

Das Konstrukt dafür wäre ein durch eine positive Flanke ausgelöstes Flip-Flop. Gibt es also eine allgemeine Möglichkeit, die if-else-Anweisung zu implementieren?

Jede Hilfe wäre dankbar. Vielen Dank!

Adwaitvedant
quelle

Antworten:

8

Für die kombinatorische Logik ist if/ elseals 2: 1-Multiplexer implementiert. In der Booleschen Algebra wäre dies:

Q = (A * S) + (B * S')

wo:

  • Sist der Eingang, der von der ifBedingung gespeist wird ,
  • Aist die Eingabe, die vom thenUnterausdruck gespeist wird .
  • Bist die Eingabe, die vom elseUnterausdruck 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 elseKlausel haben (da implizit "Ausgabe nicht ändern"), und alle Teile der ifBedingung, 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_ffAussage, 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 ifAnweisung. 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.)

Mike DeSimone
quelle
Hey, vielen Dank für Ihre Antwort! ... aber wenn ich verallgemeinere, was verwende ich als S? (Ich habe ein Posedge (clk) ... dh ein Attribut eines Signals und nicht eines Signals selbst). ...Vielen Dank!
Adwaitvedant
Was meinst du mit "^ ........"?
Mike DeSimone
Mir wurde klar, dass ich dich in meiner Antwort auf deinen Kommentar nicht markiert hatte ... also schrieb ich einen weiteren Kommentar, um dich zum ersten zu leiten! ... daher die ^ .... ich habe die verbleibenden Punkte verwendet, da ein Kommentar muss länger als 15 Zeichen sein: D ... könnten Sie bitte meine Anfrage lösen?
Adwaitvedant
Ein Antwortender wird über alle Kommentare zu seiner Antwort informiert , sodass ich Sie nicht vermisst habe. Sie müssen das Tag nur verwenden, wenn Sie auf einen Kommentator geantwortet haben. Informationen zu Ihren Abfragen finden Sie zunächst im kombinatorischen Beispiel für S. Da Sie einen Vorteil in Ihrem Zustand haben, können Sie keine kombinatorische Logik verwenden und müssen stattdessen ein Flip-Flop verwenden. Informationen zu Ihrer zweiten Abfrage finden Sie im obigen Flip-Flop-Beispiel. Es könnte gedacht werden als if(CLK_ENA & posedge(CLK)); Beachten Sie, dass ein Teil dieser Bedingung ist posedge()und ein Teil nicht.
Mike DeSimone
Danke für die Antwort! .. aber wie würden Sie im Allgemeinen einen Code mit mehr als einem Element in der Empfindlichkeit synthetisieren? .. ich meine, ein Element in der Empfindlichkeitsliste zu haben, kann ich der Uhr zuführen .. aber was ist mit zwei Elementen dort? .. Ich glaube, "Idee zurücksetzen" wird nicht immer funktionieren .. und was ist, wenn es mehr als 2 ist? Vielen Dank!!
Adwaitvedant
0

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

Joe
quelle
Streng genommen, da sonst ein Allheilmittel ist, wäre es nicht nandangemessener als xor?
James M. Lay