2013-02-27 6 views
-1

J'ai écrit ce code pour simuler un compteur asynchrone en utilisant D flip flop. Le programme donne la sortie correcte pour la première fois aux itérations, mais la sortie ne change pas du tout. Qu'est-ce que je fais mal?Compteur d'ondulations utilisant Dflip flop

Voici le code:

1er module:

module DFF(d,q,reset,clk); 
    input  d,reset,clk; 
    output reg q; 

    always @(posedge reset, posedge clk) begin 
    if(reset) begin 
     q=0; 
    end 
    if(d) 
     q=d; 
    else 
     q=q; 
    end 
endmodule 

second module:

module RippleCounter(d,clk,reset,out); 
    input [3:0] d; 
    input  clk, reset; 
    output [3:0] out; // 4bit 

    DFF a(d[0],out[0],reset,clk); 
    DFF b(d[1],out[1],reset,out[0]); 
    DFF c(d[2],out[2],reset,out[1]); 
    DFF dx(d[3],out[3],reset,out[2]); 
endmodule 

3ème Module:

module RippleCounterTOP; 
    reg [3:0] d; 
    reg  clk, reset; 
    wire [3:0] out; 

    RippleCounter r(d,clk,reset,out); 

    initial begin 
    d=0;clk=0;reset=1; 
    end 

    always begin 
    #5 d=d+1; clk=~clk; 
    end 
endmodule 
+0

Que signifie "premier à itérations" signifie? – toolic

Répondre

0

Je ne suis pas sûr de ce que vous attendez de votre sortie à faire, mais un problème est que vous réinitialisez toujours votre DFFs.

+0

Je suis réinitialisé les bits de sortie pour chaque nouvelle itération qui est après toutes les 5 unités de temps. –

1

En regardant this picture d'un compteur d'ondulation, la seule entrée de votre testharness devrait être l'horloge.

Le type de flop, utilisé ressemblerait généralement quelque chose comme:

always @(posedge reset, posedge clk) begin 
    if(reset) begin 
    q <= 'b0; 
    end 
    else begin 
    q <= ~q; 
    end 
end 

Dans le module 1 [email protected](posedge clk .. vous devez utiliser non-bloquant <= affectations au lieu de =.

Dans le module 3 vous avez toujours un bloc sans liste de sensibilité, j'ajouterais le @*, Cela ressemble à ce que vous voulez vraiment une initiale avec une répétition ou une boucle pour exécuter votre test, puis appelez $finish() une fois terminé. J'ai utilisé #5ns SystemVerilog ci-dessous mais vous pouvez passer à #5 si nécessaire.

integer i; 
initial begin 
    d=0;clk=0;reset=1; 
    #5ns 
    reset=0; 

    for (i=0; i<5'b1000; i=i+1) begin 
    #5ns d=d+1; clk=~clk; 
    $display("%4b, %4b", d, out); 
    end 
    $finish; 
end 

Essayer votre exemple, voici ce que j'ai fini avec je pense qu'il est ce que vous essayez de faire: NOTE la bonne réponse est ~out.

Le module 1 peut être étendu avec les sorties q et q_bar.

module DFF(q,reset,clk); 
    input  reset,clk; 
    output reg q; 

    always @(posedge reset, posedge clk) begin 
    if(reset) begin 
     q<=0; 
    end 
    else begin 
     q<=~q; 
    end 
end 
endmodule 

Module 2

module RippleCounter(clk,reset,out); 
    input  clk, reset; 
    output [3:0] out; // 4bit 

    DFF ax(out[0],reset,clk); 
    DFF bx(out[1],reset,out[0]); 
    DFF cx(out[2],reset,out[1]); 
    DFF dx(out[3],reset,out[2]); 
endmodule 

Module 3 (TestHarness)

module RippleCounterTOP; 
    reg  clk, reset; 
    wire [3:0] out; 

    RippleCounter r(clk,reset,out); 

    integer i; 

    initial begin 
    clk=0;reset=1; 
    #5ns 
    reset=0; 

    for (i=0; i<6'b10000; i=i+1) begin 
     #5ns clk=~clk; 
     $display("%4b", ~out); 
    end 
    $finish; 
    end 
endmodule 
Questions connexes