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.
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?
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)
Ahmed Ali Abbasi
dst
Ahmed Ali Abbasi
dst
Ahmed Ali Abbasi