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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top