Domanda

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

Linea contrassegnata da (i), voglio aspettare solo Posedge CLK prima di inviare OUTP alla porta di uscita. Tuttavia, quando ho provato come;

if ( posedge clk )

Dà errore

while ( clk != 1 ) begin

end 

Dà un'output di risposta/simulazione Absurb.Che cosa dovrei mettere su quella linea per aspettare Posedge CLK prima di inviare l'output?

È stato utile?

Soluzione

È possibile ritardare l'esecuzione fino al bordo dell'orologio in questo modo:

always @ ( open )  // open is 1 or 0 
  if ( open  )
     @(posedge clk) outp = Memory[addressOftheMemory];
  else if ( !open )    
     Memory[addressOftheMemory] = data;

Ciò può o meno realizzare ciò che desideri. Non è sintetizzabile e il always Il blocco non verrà riprogrammato mentre viene eseguito o sospeso, quindi se open Attiva alterni più volte in un periodo di clock, quel codice probabilmente non farà quello che vuoi.

Più background: è possibile specificare un controllo di ritardo/evento su qualsiasi istruzione, inclusa un'istruzione NULL. (ad es. In @(posedge clk);, il punto e virgola è un'istruzione nulla.) In effetti, la definizione di sintassi di un always Il costrutto è:

sempre_construct: sempre dichiarazione

Significa che non c'è niente di magico in always @(open) o always @(posedge clk), stanno semplicemente introducendo una dichiarazione e specificando il controllo degli eventi. Quando il controllo di ritardo (#) è allegato a una dichiarazione, l'esecuzione della dichiarazione viene differita fino a un tempo fisso in futuro. Quando il controllo degli eventi (@) è allegato a una dichiarazione, l'esecuzione della dichiarazione viene differita fino a quando la condizione dell'evento non sarà soddisfatta.

Altri suggerimenti

Devi pensare un po 'più criticamente a ciò che stai cercando di modellare. Sembra che tu stia solo cercando di modellare una memoria con "aperto" controllando l'operazione di lettura/scrittura.

Hai una scrittura asincrona di dati e lettura sincrona dei dati. Per l'accesso alla memoria è meglio solo avere un comportamento sincrono completo.

always @(posedge clk) begin
if( open )
    outp = Memory[addressOftheMemory];
else
    Memory[addressOftheMemory] = data;
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top