Wie setze ich meine Register am Digital Clock Manager-Ausgang zurück?

Ich verwende einen SPARTAN 3E und habe den DCM-Kern verwendet, um einen 50-MHz- bis 25-MHz-Takt zu erzeugen, um den VGA-PORT anzusteuern. Die Reset-Logik, die ich verwende, wird hier gezeigt.

DigitalClockManager instance_name (
.CLKIN_IN(CLK_50MHZ), 
.RST_IN(rst_in), 
.CLKFX_OUT(clk),         //25 Mhz
.CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), 
.CLK0_OUT(), 
.LOCKED_OUT(LOCKED), 
.STATUS_OUT(STATUS)
);      
BUFG buffer (.I(CLKIN_IBUFG_OUT), .O(CLKIN)); 

LOGIK ZURÜCKSETZEN:

    reg LOCKED_R;
reg [3 : 0] SR; 
always @ (posedge CLKIN)
begin
    if(RESET)
    begin
    SR [3 : 0]  <= 4'b111;
    LOCKED_R <=0;
    end

else 
begin
LOCKED_R <= LOCKED;
if(LOCKED < LOCKED_R | STATUS [1] ) // H to L on LOCKED | CLKIN UNSTABLE
SR <= {1'b1 , SR[3 : 1]};
else 
SR <= {1'b0 , SR[3 : 1]};
end
end

assign rst_in    = ( (SR[2] | SR[1] | SR[0]) || RESET);

Jetzt bin ich mir nicht sicher, wie ich das Zurücksetzen für alle anderen Register im Design implementieren soll.

    always @ (posedge clk) 
begin  
   if (LOCKED && !STATUS[1])
    begin 
           //GOOD TO GO
    end
    else

    begin
     //RESET
    end
end

Wenn der RESET-Signalimpuls kürzer dauert als zum Aktivieren des verriegelten Signals erforderlich ist (was aufgrund des ODER-Gatters am rst_in wahrscheinlich der Fall sein wird), werden die Register niemals zurückgesetzt.

Geben Sie hier die Bildbeschreibung ein

Wird das Always @ (posedge clk) ausgelöst, auch wenn (LOCKED && !STATUS 1 ) nicht hoch ist? Wenn ja, warum löst der Else-Teil nicht aus und setzt die Register auf die Standardwerte?

Antworten (1)

Ich denke, Ihre Logik ist richtig, außer Sie wollen einen asynchronen Reset implementieren, dh der Reset ist unabhängig von der Uhr. Dies spiegelt sich nicht im obigen Code wider und kann behoben werden, indem die Signale LOCKED und STATUS in der Vertraulichkeitsliste des Prozesses hinzugefügt werden.

immer @ (locked oder status oder posed clk)

Ich möchte wirklich einen asynchronen Reset vermeiden. Gibt es keinen Ausweg?
Das einzige mögliche Problem, das ich sehe, wenn kein asynchrones Zurücksetzen erfolgt, besteht darin, dass die Qualität der Uhr, wenn sie nicht gesperrt ist, unbekannt ist.
FDS-flop00 (.D(1'b0), .C(clk), .Q(out1), .S(1'b0)); FDflop01 (.D(out1), .C(clk), .Q(out2)); FD-flop10 (.D(out2), .C(clk), .Q(out3)); FD-flop11 (.D(out3), .C(clk), .Q(out4)); Was ist mit diesem Schema zum Zurücksetzen der Register? Der Standardwert beim Start ist 1 für FDS. Wenn die Taktsperre von hoch nach niedrig geht, könnte ich den D-Eingang wieder auf 1 setzen, der sich dann nach rechts verschiebt, wenn die Uhr wieder gültig wird, und ich könnte einfach die FLIP FLOP-Ausgänge ODER. Eine weitere Sache, ich spreche vom Zurücksetzen von Registern, die im DCM-Takt arbeiten. Erscheint Ihnen das Zurücksetzen des DCM logisch? Danke schön!
Was passiert, wenn die Sperre nach dem Start verloren geht? Da Sie keine Kontrolle über das eingehende Taktsignal haben.
Jawohl! Deshalb würde man das erste FF mit dem eingerasteten Signal des DCM verknüpfen.