En attendant posedge clk avant de faire un travail? - Comment
-
27-10-2019 - |
Question
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
Ligne marquée par (i), je veux attendre que posedge clk avant d'envoyer SORT à la sortie port.However, Quand je l'ai essayé comme;
if ( posedge clk )
il donne l'erreur
while ( clk != 1 ) begin
end
il donne une sortie réponse / simulation absurb. Quelle chose (s) dois-je mettre à cette ligne d'attendre posedge clk avant d'envoyer la sortie?
La solution
Vous pouvez retarder l'exécution jusqu'à ce que le front d'horloge comme ceci:
always @ ( open ) // open is 1 or 0
if ( open )
@(posedge clk) outp = Memory[addressOftheMemory];
else if ( !open )
Memory[addressOftheMemory] = data;
Cela peut ou ne peut pas accomplir ce que vous voulez. Il n'est pas synthétisable, et le bloc always
ne sera pas reprogrammée alors qu'il est en cours d'exécution ou suspendu, donc si open
plusieurs fois dans permet de basculer d'une période d'horloge, ce code ne va probablement pas faire ce que vous voulez.
Plus d'arrière-plan: vous pouvez spécifier un délai / contrôle des événements sur toute déclaration, y compris une déclaration nulle. (Par exemple dans @(posedge clk);
, le point-virgule est une instruction null). En fait, la définition de la syntaxe d'une construction d'always
est:
always_construct: toujours Déclaration
Ce qui signifie qu'il n'y a rien de magique always @(open)
ou always @(posedge clk)
, ils introduisent simplement une déclaration et en spécifiant le contrôle des événements. Lorsque le contrôle de retard (#
) est attaché à une déclaration, l'exécution de l'instruction est reporté à une date fixée à l'avenir. Lorsque le contrôle d'événements (@
) est attaché à une déclaration, l'exécution de la déclaration est reportée jusqu'à ce que la condition d'événement est satisfaite.
Autres conseils
Vous devez penser un peu plus critique sur ce que vous essayez de modèle. On dirait que vous essayez juste de modéliser une mémoire avec « ouverte » contrôlant l'opération de lecture / écriture.
Vous avez écrit asynchrone des données et la lecture synchrone des données. Pour un accès mémoire, il est préférable que d'avoir un comportement synchrone complet.
always @(posedge clk) begin
if( open )
outp = Memory[addressOftheMemory];
else
Memory[addressOftheMemory] = data;
end