Aspettando Posedge CLK prima di fare un lavoro? - Come
-
27-10-2019 - |
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?
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