Ist es möglich, ein D-Flip-Flop mit asynchronem Level-Triggered-Reset zu machen?

Ich fange an, Verilog-Codierung im College zu lernen, und hatte bis jetzt keine großen Probleme. Ich denke, ich habe die Grundlagen perfekt hinbekommen. Aber ich bin mit diesem gerade gegen eine Mauer gefahren. Ich experimentierte mit Verhaltensmodellierung und hatte am Ende dieses Problem.

Es ist einfach, ein D-Flip-Flop mit synchronem Pegel-Trigger-Reset wie diesem herzustellen

always @(posedge clk)
begin
    if(clr) begin
        q <= 1'b0;
    end
    else begin
        q <= d;
    end
end

Oder machen Sie ein D-Flip-Flop mit synchronem flankengetriggertem Reset wie diesem

always @(posedge clk or posedge clr)
begin
    if(clr) begin
        q <= 1'b0;
    end
    else begin
        q <= d;
    end
end

Aber wie kann ich einen Level getriggerten aber asynchronen Reset machen? Kann ich nicht machen

always @(posedge clk or clr)

da dies zwei inkompatible Typen oren würde, wird während der RTL-Synthese ein Fehler ausgegeben. Kann ich nicht machen

always @(posedge clk)
begin
    q <= d;
end

always @(clr)
begin
    q <= 1'b0;
end

da dies mehrere Quellen zum Ansteuern von q erfordern würde, erneutes Problem bei der RTL-Synthese.

Meine Frage ist also, ob ein D-Flip-Flop mit asynchronem Level-Trigger-Reset möglich ist oder nicht? Sowohl in Verilog als auch in digitaler Logik.

Antworten (4)

Hier ist das Beispiel von Xilinx für ein "Flip-Flop mit negativem Flankentakt und asynchronem Zurücksetzen":

always @(negedge C or posedge CLR)
    begin
        if (CLR)
            Q <= 1’b0;
        else
            Q <= D;
    end

(Quelle: Synthesis and Simulation Design Guide, UG626, 19. Okt. 2011)

Beachten Sie, dass dies im Grunde dasselbe ist wie in Ihrem zweiten Beispiel (außer dass die entgegengesetzte Taktflanke verwendet wird). Und tatsächlich ist dies ein pegelempfindlicher Clear, kein flankenempfindlicher Clear, denn wenn Clear hoch gehalten wird, wird der Ausgang weiterhin niedrig gehalten, selbst wenn neue Taktflanken eintreffen und/oder sich der D-Eingang ändert.

Gibt eine solche Spezifikation, die wie oben geschrieben ist, einen Hinweis darauf, ob die Schaltung Ausgangsstörungen oder seltsames Verhalten vermeiden muss, wenn fehlerhafte Takt- oder Rücksetzimpulse eintreffen, während D und Q beide Null sind? Ein Hardware-Flip-Flop-Grundelement, das ein asynchrones Zurücksetzen enthält, hätte natürlich keine Probleme mit solchen Dingen, aber das Vermeiden solcher Probleme beim Synthetisieren eines Asynchron-Rücksetz-Flops aus anderen Grundelementen würde zusätzliche Schaltungen erfordern.
@supercat, Nein, nichts in Verilog sagt Ihnen jemals, was passiert, wenn die Eingangssignale zum Beispiel keine gültigen Logikpegel haben. Aber wenn Ihr Synthesetool gut ist und so etwas in Ihrer Architektur verfügbar ist (wie in einem Xilinx FPGA), wird der hier geschriebene Code zu einem Hardware-Flip-Flop mit asynchronem Reset synthetisiert, nicht zu einem konstruierten Flip-Flop aus Toren. Tatsächlich ist dies genau der Code, den Xilinx empfiehlt, wenn Sie ein Hardware-Flip-Flop synthetisieren möchten.
Wenn die Hardware, die mit einem Gerät verbunden ist, in Fällen, die keine Rolle spielen sollten, möglicherweise Signale mit ungültigen Logikpegeln oder Timings ausgibt, gibt es dann eine Möglichkeit festzulegen, dass ein Gerät solche Eingaben ignorieren muss? Zum Beispiel, wenn eine Platine einen 74HC74 und einen FPGA mit einigen Ersatzstiften hatte und man die Funktion des 74HC74 in den FPGA aufnehmen wollte und wenn die Schaltung, die den 74HC74 ansteuerte, manchmal Runt-Impulse auf der Set- oder Reset-Leitung ausgeben würde Könnte man in Fällen, in denen die Ausgabe bereits den richtigen Zustand hatte, angeben, dass der Synthesizer etwas produzieren muss, das korrekt funktioniert?
Auch wenn einige Teile sowohl primitive Flops mit sowohl async-set als auch async-clear haben, haben einige nur einen async-Eingang. Wenn es kein Async-Set-Clear-Flop-Primitive gäbe, könnte man eines synthetisieren, indem man ein Async-Clear-Flop verwendet, um zu verfolgen, ob das letzte sinnvolle Ereignis ein Takt oder ein Async-Signal war, und das zusammen mit dem letzten in einen Mux einzuspeisen getaktetes Bit und Indikator, ob „set“ oder „clear“ zuletzt aktiv war, aber eine solche Implementierung könnte fehlschlagen, wenn ein sauberes asynchrones Zurücksetzen/Freigeben gefolgt von einer sauberen „1“ eingetaktet wurde, gefolgt von einem Runt-Async-Set, obwohl ein 74HC74 kein Problem hätte.
@supercat, Verilog ist ein rein digitales Tool. Die Verilog-Sprache hat kein Konzept für ungültige Logikebenen (es gibt "egal"- und "hochohmige" Symbole, aber sie lösen Ihr Problem nicht). Es ist die Aufgabe des Designers von Logikzellen, das Verhalten für ungültige Eingaben zu bestimmen, falls dies erforderlich ist. Diese Art von Arbeit würde wahrscheinlich mit einem SPICE-ähnlichen Simulator erledigt werden, nicht mit Verilog.
@supercat, Es ist die Aufgabe des Logikdesigners, nur die Teilmenge von Verilog zu verwenden, die synthetisiert werden kann. Welche Teilmenge das ist, hängt davon ab, welche Hardware und welches Synthesetool Sie verwenden. Wenn Sie ein Flip-Flop mit Set und Clear in einer Architektur entwerfen möchten, die nur einen Steuereingang hat, müssen Sie untersuchen, ob Ihr Synthesetool damit umgehen kann oder nicht. Meine Erfahrung ist, dass es am besten ist, davon auszugehen, dass das Synthesetool sehr dumm ist und nur sehr gut dokumentierte Codierungsstile verwendet - ansonsten könnte es, selbst wenn Sie etwas zum Laufen bringen, bei der nächsten SW-Revision kaputt gehen
Der Simulator kann vorhersagen, ob ein synthetisiertes Design funktionieren wird, aber wenn man entweder aus der Simulation herausfindet, dass zusätzliche Logik erforderlich ist, um einen unerwünschten Ausgangsfehler zu unterdrücken, wenn eine Flanke an einem Eingang ankommt, der keine Bedeutung haben sollte, oder man einen hat Design, das fast passt und passen könnte, wenn man sich in bestimmten Fällen nicht um Ausgabestörungen kümmert, scheint es, als würde man in der Lage sein wollen, das Verhalten des Synthesizers in solchen Fällen zu ändern.
Ich verstehe das Konzept, das eigene Design auf die Dinge zu beschränken, die sich gut synthetisieren lassen, aber das scheint den Zweck der Verwendung einer höheren Sprache überhaupt zu negieren. Es scheint hilfreicher zu sein, sagen zu können: "Ich brauche diese Ausgabe, um sich gemäß dieser Formel sauber zu verhalten, wobei Gefahren eliminiert werden" und "diese Ausgabe kann tun, was sie will, bis alle diese Eingaben stabil sind", und den Synthesizer generieren zu lassen zusätzliche Logik im ersten Fall nach Bedarf. Werkzeuge sind einfach noch nicht da?

Ich bin mit Verilog nicht sehr vertraut, aber nach meinem Verständnis werden einige Synthesewerkzeuge bei Versuchen kreischen, synchrone und asynchrone Logik auf Hardwareplattformen zu generieren, deren Primitive solche Dinge nicht unterstützen. Es ist möglich, eine Schaltung herzustellen, die sich wie ein Async-Reset-Flipflop verhält, vorausgesetzt, dass Reset-Flanken nicht in der Nähe von Taktflanken auftreten. Hier ist ein Beispiel. Eine wichtige Sache, die bei dieser Schaltung zu beachten ist, ist jedoch, dass während ein asynchrones Hardware-Reset garantiert jede Metastabilität löscht, eine Schaltung, die eine solche simuliert, keine solche Garantie bietet.

Ich bin mir bei Verilog nicht sicher, aber in VHDL dachte ich, es wäre so etwas:

ARCHITECTURE behavioral OF dff_asynch IS 
BEGIN  
 PROCESS(D, Clk, Clr, Pre) 
 BEGIN 
  IF Clr = '0' THEN  -- Don’t wait for clock 
   Q <= '0'; 
   Qbar <= '1'; 
  ELSIF Pre = '0' THEN 
   Q <= '1'; 
   Qbar <= '0'; 
  ELSIF (Clk'event) AND (Clk='1') THEN   -- Positive Edge 
   Q <= D; 
   Qbar <= not D; 
  END IF; 
 END PROCES

1) None-reset: immer @(negge C) begin Q <= D; Ende

2) Synchroner Reset immer @(negedge C) begin if (CLR) // Wenn C nicht läuft, wirkt sich eine Änderung in CLR nicht auf QQ <= 1'b0 aus; sonst Q <= D; Ende

3) Asynchrones Zurücksetzen immer @(negedge C oder gestellte CLR) beginnen, wenn (CLR) Q <= 1'b0; sonst Q <= D; Ende