2016-10-11 1 views
0

Je suis en train d'écrire un code pour mettre en œuvre une remise à zéro asynchrone D flipfip, mais la ligne [email protected] montre une erreur de syntaxe:syntax reset code D flip-flop Asynchronous erreur

`timescale 1ns/1ps 



module Dflipflop(
input D, 
input reset, 
input clk, 
output Q 

); 
reg Q; 

initial 
begin  
    if(reset==1) //clear the output (Q=0) 
    begin 
     Q <= 0; 
    end 
    else if(reset==0) 
    begin 
     [email protected](posedge clk) //syntax error here... 
     begin 
      Q <= D; 
     end 
    end 
end 

endmodule 

ce qui pourrait être l'erreur possible, et Y at-il une meilleure logique pour la mise en œuvre de la même chose?

Répondre

0

Vous ne pouvez pas toujours bloquer l'initiale. Il devrait être écrit comme ceci:

`timescale 1ns/1ps 


module Dflipflop(
input D, 
input reset, 
input clk, 
output Q 
); 
reg Q; 

always @(posedge clk, posedge reset) 
begin  
    if(reset==1) //clear the output (Q=0) 
    begin 
     Q <= 0; 
    end 
    else 
    begin 
     Q <= D; 
    end 
end 

endmodule 
2

d'abord tout ce que je ne vous encourage à utiliser l'instruction initial sauf dans testbench. Ce n'est pas synthétisable, il ne devrait donc pas apparaître dans RTL. Ensuite, je pense que vous confondez Verilog avec un langage de programmation standard, ce qui n'est pas le cas.

En Verilog, il y a deux catégories de déclarations:

  • processus, comme always ou initial
  • cession
  • , avec assign qui vous permet d'attribuer directement une 'valeur' ​​à un fil

Dans les processus, on peut distinguer deux classes:

  • processus synchrones, //do something états begin end seront évalués seulement lorsqu'un bord, spécifié dans le @, se produit

    always @ (posedge clock) begin 
        //do something 
    end 
    
  • procédés combinatoires, les états //do something seront évalués à chaque fois que la valeur d'un wire ou reg utilisé dans la //do something bloc change

    always @* begin 
        //do something 
    end 
    

ici yo Vous avez instancié un processus à l'intérieur d'un processus qui n'a aucune réalité physique.

Un autre point, comme décrit, vous voulez activer le processus uniquement lorsque reset==0 de sorte que vous mettez une condition pour entrer dans le processus. Une fois de plus, cela n'a aucun sens en termes de synthèse. Le processus devrait être activé et c'est dans le processus que les conditions devraient être évaluées.

Une solution classique pour la mise en œuvre d'une bascule D avec remise à zéro asynchrone est la suivante:

module Dflipflop(
    input D, 
    input reset, 
    input clk, 
    output reg Q 
); 
always @ (posedge clk or negedge reset) begin 
    if (!reset) 
    Q <= 1'b0; // Clear Q when reset negative edge occurs 
    else 
    Q <= D; // Capture D in Q when clk positive edge occurs and reset is high 
end 
endmodule 
0

Vous devez utiliser soit initiale (non recommandé pour la synthèse) ou toujours. Un bloc de procédure ne peut pas entrer dans un autre. Si vous êtes vraiment intéressé par la conception d'une logique non-synthétisable et voulez essayer avec initial, vous pouvez faire quelque chose comme cela mentionné ci-dessous. Les initiales et toujours sont des blocs procéduraux.

.... 

    else if(reset==0) 
     begin 
      repeat(100000) @(posedge clk) 
      begin 
       Q <= D; 
      end 
     end 
    end