2017-01-04 3 views
0

Sir, Ich habe einige Zweifel hinsichtlich der Schleife innerhalb der immer blockieren. Bitte klären Sie mich. Alle Iterationen haben im Einzeltakt stattgefunden ?. Was wird passieren, wenn for-Schleife innerhalb einer anderen for-Schleife, die innen ist immer blockieren? Bitte helfen Sie mir Fehler in den folgenden programm.Thank Siefür Schleife innen immer posegege Uhr

reg [5:0] c; 
reg [2:0] m; 
reg G[5:0][2:0] = {{1'b1,1'b0,1'b0},{1'b0,1'b1,1'b0},{1'b0,1'b0,1'b1}, {1'b1,1'b1,1'b0},{1'b0,1'b1,1'b1},{1'b1,1'b0,1'b1}}; 
integer i; 
integer j; 
always @(posedge clk1) 
begin 
    for(i=0;i<6;i=i+1) 
     begin 
      c[i]=0; 
      for(j=2;j>=0;j=j-1) 
       begin 
        c[i] <= c[i]^(m[j]&G[2-j][i]); 
       end 
     end 
end 
+0

Ihr Code scheint wie ein 'C' Code. Schreiben Sie niemals einen Code in HDL als Software-Code. Zuerst solltest du an die Hardware denken, die du erstellen willst und dann solltest du entsprechend codieren. Was ist dein Design hier? –

Antwort

0

Denken eines always Block als ein wenig Software, die Modelle ein wenig Hardware zu finden. Die Empfindlichkeitsliste ist eine Liste von Triggern, bei deren Änderung die Software ausführt, um zu berechnen, was die neuen Ausgaben sein sollen.

Für einen kombialways Block alle Eingänge in der Empfindlichkeit Liste sind (unter Verwendung des @(*)-Konstrukt), so dass, wenn irgendwelche Eingangsänderungen, die Ausgänge dieser wenig Hardware ändern kann (so ziemlich die Definition der kombinatorischen Logik). Sollte sich also einer der Eingänge ändern, führt die Software aus, um zu berechnen, was die neuen Ausgänge von diesem kleinen Teil der kombinatorischen Logik sein werden.

Bei einem sequentiellenalways Block befinden sich nur die Uhr und (falls vorhanden) asynchrone Rücksetzungen in der Empfindlichkeitsliste, da keine anderen Eingänge direkt die Ausgänge ändern. Wenn sich daher der Takt (oder das asynchrone Rücksetzen) für einen sequentiellen Block ändert, führt die Software aus, um zu berechnen, was die neuen Ausgaben dieses kleinen Bits der sequentiellen Logik sein werden.

Also, in Ihrem Fall haben Sie eine sequentielle always Block ohne ein asynchrones Reset. Es ist ein bisschen Software, die ein wenig sequenzielle Logik modelliert. Die Ausgänge dieser Ablauflogik ändern sich nur, wenn sich die Uhr ändert (bei steigender Flanke an clk1). Wenn also eine steigende Flanke an clk1 anliegt, beginnt der Code innerhalb des -Blocks mit der Ausführung, um zu berechnen, was die neuen Werte des Arrays c sein werden (die Ausgänge Ihrer sequentiellen Logik, denn das ist die Variable) dieser besondere always Block). Die Tatsache, dass es Schleifen in diesem speziellen Code gibt, spielt keine Rolle. Wenn es eine steigende Flanke an clk1 gibt, dann werden die Schleifen vollständig ausgeführt (ohne auf steigende Flanken auf clk1 zu warten), um zu berechnen, was die neuen Werte von c sein werden.

Verwandte Themen