Warten auf Posedge CLK, bevor Sie einen Job machen? - Wie
-
27-10-2019 - |
Frage
module DoorControl( clk, data, open,addressOftheMemory, outp );
localparam Size_ofTheWord = 32;
input open;
input [16:0] addressOftheMemory;
input [Size_ofTheWord-1:0] data;
input clk ;
output reg outp;
reg [WordSize-1: 0] Memory [65535: 0];
always @ ( open ) // open is 1 or 0
if ( open )
// i
outp = Memory[addressOftheMemory];
else if ( !open )
Memory[addressOftheMemory] = data;
endmodule
Zeile mit (i), ich möchte warten, nur clk, bevor ich Outp zum Ausgabe von Port sende.
if ( posedge clk )
Es gibt Fehler
while ( clk != 1 ) begin
end
Es gibt Absurb -Antwort-/Simulationsausgabe.Was sollte ich in diese Zeile bringen, um CLK zu warten, bevor ich die Ausgabe sende?
Lösung
Sie können die Ausführung bis zur Taktkante wie folgt verzögern:
always @ ( open ) // open is 1 or 0
if ( open )
@(posedge clk) outp = Memory[addressOftheMemory];
else if ( !open )
Memory[addressOftheMemory] = data;
Das kann das erreichen oder nicht, was Sie wollen. Es ist nicht synthetisierbar und die always
Block wird während der Ausführung oder Suspendierung nicht verschoben open
In einem Taktzeitraum wird dieser Code wahrscheinlich nicht das tun, was Sie wollen.
Mehr Hintergrund: Sie können eine Verzögerung/Ereigniskontrolle für jede Erklärung angeben, einschließlich einer NULL -Anweisung. (zB in @(posedge clk);
, Das Semikolon ist eine Null -Aussage.) Tatsächlich die Syntaxdefinition von a always
Konstrukt ist:
immer_construct: stets Aussage
Das heißt, dass es nichts Magisches anhaut always @(open)
oder always @(posedge clk)
, Sie führen einfach eine Erklärung ein und geben die Ereigniskontrolle an. Bei Verzögerungskontrolle (#
) wird einer Erklärung beigefügt, die Ausführung der Aussage wird bis zu einer festen Zeit in Zukunft verschoben. Bei Ereigniskontrolle (@
) wird einer Erklärung beigefügt, die Ausführung der Aussage wird aufgeschoben, bis die Ereignisbedingung erfüllt ist.
Andere Tipps
Sie müssen ein bisschen kritischer darüber nachdenken, was Sie zu modellieren versuchen. Es sieht so aus, als würden Sie nur versuchen, einen Speicher mit "Öffnen" zu modellieren, das den Lese-/Schreibvorgang steuert.
Sie haben asynchrone Schreiben von Daten und synchronem Lesen von Daten. Für den Speicherzugriff ist es besser, nur ein vollständiges synchrones Verhalten zu haben.
always @(posedge clk) begin
if( open )
outp = Memory[addressOftheMemory];
else
Memory[addressOftheMemory] = data;
end