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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top