Implementierungsschaltung mit d-Flipflop in Verilog

Ich bin ziemlich neu bei Verilog und versuche gerade, eine strukturelle Implementierung einer Schaltung zu machen, die aus einem d-Flipflop besteht, es hat Eingänge x und y, x und y sind exklusiv oder'd und das Ergebnis ist exklusiv oder' d mit dem aktuellen Zustand und als Eingang für das d-Flip-Flop verwendet. und es wird den Ergebniszustand vom Flipflop im nächsten Lauf verwenden usw. Aber ich bin mir nicht sicher, wie ich es konstruieren soll.

Die Schaltung sieht so aus:

Geben Sie hier die Bildbeschreibung ein

Und mein Code ist wie folgt:

module circ(clk,x,y);
 input clk,x,y;
 wire state=1'b0;
 wire xoy,d;
 xor(xoy,x,y);
 xor(d,xoy,state);
 dff a(d,clk,state);
endmodule

module dff(D,clk,q);
input D,clk;
output q;
reg q;
initial q<=0;
always @ (posedge clk)
 begin
  q<=D;
 end
endmodule

Ich bin mir ziemlich sicher, dass der d-Flip-Flop-Code korrekt ist, aber wenn ich versuche, dies zu testen, sind meine d- und Zustandswerte aus irgendeinem Grund nur x. Wenn ich verschiedene x- und y-Werte in meine Testbench eingebe, passiert nichts, "state" und "d" sagen immer nur, dass es in der Simulation den Wert "1'hx" hat. Warum passiert das und wie kann ich ihnen tatsächlich einen Wert zuweisen?

Ich verstehe nur nicht wirklich, was Sie mit dem Zustand machen sollen. Ich gehe davon aus, dass Sie ihm beim ersten Lauf einen Zustand geben müssen, aber wenn ich ihm einen Zustand gebe, wird es nicht nur den Zustand festlegen auf diesen Wert jedes Mal, wenn auf dieses Modul zugegriffen wird?

So sieht der Zustand auf dem Simulationsdiagramm aus, es bleibt nur für immer rot:Geben Sie hier die Bildbeschreibung ein

Antworten (1)

In Ihrem Simulator ist der Anfangswert des D-Flipflops undefiniert, daher ist das Verhalten Ihrer Schaltung undefiniert. Sie können einen von zwei Ansätzen wählen:

  1. initialFügen Sie dem Flipflop eine Zuweisung hinzu:

    initial q <= 0;
    
  2. Fügen Sie dem Flipflop ein Reset-Signal hinzu und schalten Sie es von Ihrer Simulation aus um. Ihr alwaysBlock sollte dann sein:

    always @ (posedge clk) begin
        if(reset) q <= 0;
        else q <= D;
    end
    
@dshawn Können Sie weitere Informationen zu Ihrer Testbench anhängen? Unter der Annahme, dass alle Signale ordnungsgemäß angesteuert werden (kein High-Z usw.), Xwäre die einzige Quelle für ein Flipflop, das wir eindeutig eliminiert haben. das Problem könnte dann möglicherweise in Ihrer Testbench liegen.
haha, ich war nur ein Idiot und habe den Leitungsdrahtzustand = 1'b0 übersehen, also wurde er jedes Mal auf 0 zurückgesetzt, es funktioniert jetzt perfekt, danke für die Hilfe!