-1
votes

Comment compter une séquence spécifique dans Verilog?

J'ai besoin de concevoir un circuit pouvant compter 1011 code> dans une séquence de bits. Par exemple, si la séquence est indiquée dans l'image, le nombre doit être 1 code>, mais ce n'est pas le cas. Je sais que je lis une entrée w code> pas de manière de séquence, mais je ne sais pas comment le faire non plus.

w code> est notre séquence d'entrée et CS code> et ns code> sont l'état actuel et État suivant. et les paramètres sont nos états. La deuxième machine d'état de la deuxième image est ce que j'utilisais, il y a une légère différence entre ces deux SMS. P> blockQuote>

 image du circuit p>

 Photo des machines d'état. Le second est ce que j'ai utilisé p>

Logique principale: strong> p> xxx pré>

testbench: strong> p>

`timescale 1ns/1ns
module counterTB();
reg w,clk,resetn;
reg [2:0] CS,NS;
wire z;
wire [7:0] count;
integer i;
serialCounter sk(.w(w),.clk(clk),.resetn(resetn),.z(z));
initial
  begin
    resetn = 1'b0;
    clk = 1'b0;
    CS=3'b000;
  end
initial
begin
  for(i=0;i<255;i=i+1)
    @(posedge clk, negedge resetn)  w=i;
end
always #5 clk = ~clk;


always @(posedge clk, negedge resetn) $monitor("w=%b, z=%b, count=%d", w,z,count);

endmodule


2 commentaires

Vous devriez utiliser des noms de variables qui signifient quelque chose. Il est très difficile pour quelqu'un d'autre de lire et de comprendre votre code.


Désolé @Moberg maintenant j'ai édité ma question afin que vous puissiez comprendre mon code.


3 Réponses :


1
votes

Il y a plusieurs problèmes.

Vous avez affirmé réinitialiser, mais vous ne l'avez jamais publié ( resetn reste à 0). Vous devez la définir sur 1 après quelques cycles d'horloge.

Vous devez conduire votre entrée w différemment dans la testbench. Votre conception les échantillonne toujours quand il est 0. Un moyen rapide est de le conduire au hasard.

Vous avez mal modelé la sortie z , que je suppose est votre signal "détecter". J'ai aussi supprimé la logique à partir de celui-ci Toujours car il ne semblait pas faire quoi que ce soit important.

Voici le code qui fonctionne maintenant et Détecte le modèle 1011 sur w : xxx


0 commentaires

0
votes

Il y a eu quelques corrections au code, premièrement, nous devrions nous débarrasser des loquets détérieurs dans la logique principale (z et comptage), terminé comme ceci: xxx pré>

Deuxièmement, dans le test Module de banc, Resetn ne changeait jamais de 0 à 1, car nous avons une réinitialisation asynchrone active-basse, elle était toujours en état de réinitialisation, également, si vous conduisez "W" avec le bit le moins significatif du compteur, il sera basculé chaque cycle. Je l'ai changé à un registre décalé avec un guichet de bits. Le banc d'essai a fonctionné comme ceci: p> xxx pré>

La dernière partie de la sortie de la simulation (elle compte jusqu'à 255): P>

w=0, z=1, count=104, w_reg=fa, w_nxt=fb, bit_count=0, reset=1
w=1, z=1, count=104, w_reg=7d, w_nxt=fb, bit_count=1, reset=1
w=0, z=1, count=104, w_reg=3e, w_nxt=fb, bit_count=2, reset=1
w=1, z=1, count=105, w_reg=1f, w_nxt=fb, bit_count=3, reset=1
w=1, z=1, count=105, w_reg=0f, w_nxt=fb, bit_count=4, reset=1
w=1, z=1, count=105, w_reg=07, w_nxt=fb, bit_count=5, reset=1
w=1, z=1, count=105, w_reg=03, w_nxt=fb, bit_count=6, reset=1
w=1, z=1, count=105, w_reg=01, w_nxt=fb, bit_count=7, reset=1
w=1, z=1, count=105, w_reg=fb, w_nxt=fc, bit_count=0, reset=1
w=1, z=1, count=105, w_reg=7d, w_nxt=fc, bit_count=1, reset=1
w=0, z=1, count=105, w_reg=3e, w_nxt=fc, bit_count=2, reset=1
w=1, z=1, count=105, w_reg=1f, w_nxt=fc, bit_count=3, reset=1
w=1, z=1, count=105, w_reg=0f, w_nxt=fc, bit_count=4, reset=1
w=1, z=1, count=106, w_reg=07, w_nxt=fc, bit_count=5, reset=1
w=1, z=1, count=106, w_reg=03, w_nxt=fc, bit_count=6, reset=1
w=1, z=1, count=106, w_reg=01, w_nxt=fc, bit_count=7, reset=1
w=0, z=1, count=106, w_reg=fc, w_nxt=fd, bit_count=0, reset=1
w=0, z=1, count=106, w_reg=7e, w_nxt=fd, bit_count=1, reset=1
w=1, z=1, count=106, w_reg=3f, w_nxt=fd, bit_count=2, reset=1
w=1, z=1, count=106, w_reg=1f, w_nxt=fd, bit_count=3, reset=1
w=1, z=1, count=106, w_reg=0f, w_nxt=fd, bit_count=4, reset=1
w=1, z=1, count=106, w_reg=07, w_nxt=fd, bit_count=5, reset=1
w=1, z=1, count=106, w_reg=03, w_nxt=fd, bit_count=6, reset=1
w=1, z=1, count=106, w_reg=01, w_nxt=fd, bit_count=7, reset=1
w=1, z=1, count=106, w_reg=fd, w_nxt=fe, bit_count=0, reset=1
w=0, z=1, count=106, w_reg=7e, w_nxt=fe, bit_count=1, reset=1
w=1, z=1, count=106, w_reg=3f, w_nxt=fe, bit_count=2, reset=1
w=1, z=1, count=106, w_reg=1f, w_nxt=fe, bit_count=3, reset=1
w=1, z=1, count=107, w_reg=0f, w_nxt=fe, bit_count=4, reset=1
w=1, z=1, count=107, w_reg=07, w_nxt=fe, bit_count=5, reset=1
w=1, z=1, count=107, w_reg=03, w_nxt=fe, bit_count=6, reset=1
w=1, z=1, count=107, w_reg=01, w_nxt=fe, bit_count=7, reset=1
w=0, z=1, count=107, w_reg=fe, w_nxt=ff, bit_count=0, reset=1
w=1, z=1, count=107, w_reg=7f, w_nxt=ff, bit_count=1, reset=1
w=1, z=1, count=107, w_reg=3f, w_nxt=ff, bit_count=2, reset=1
w=1, z=1, count=108, w_reg=1f, w_nxt=ff, bit_count=3, reset=1
w=1, z=1, count=108, w_reg=0f, w_nxt=ff, bit_count=4, reset=1
w=1, z=1, count=108, w_reg=07, w_nxt=ff, bit_count=5, reset=1
w=1, z=1, count=108, w_reg=03, w_nxt=ff, bit_count=6, reset=1
w=1, z=1, count=108, w_reg=01, w_nxt=ff, bit_count=7, reset=1
w=1, z=1, count=108, w_reg=01, w_nxt=ff, bit_count=7, reset=1


0 commentaires

0
votes

Je pense qu'il est un moyen plus facile de créer cette machine à états. L'exemple suivant Reg [3: 0] code> registre de motif qui conserve 4 bits du motif. Ensuite, cela compare simplement le motif avec le souhaité (SEQ dans ce cas).

module serialCounter(w, clk, resetn, z, counter);
    input w, clk, resetn;
    output reg z;
    output reg[7:0] counter;
  
  reg[3:0] pattern, tmp;
  parameter seq = 4'b1011;
  
  always@(posedge clk) begin
    if (!resetn) begin
      pattern <= 0;
      counter <= 0;
    end
    else begin
      tmp = (pattern << 1) | w;
      
      if (tmp == seq) begin
        counter <= counter + 1;
        z <= 1;
      end
      else
        z <= 0;
      
      pattern <= tmp;
    end
  end   
endmodule
  
module counterTB();
   reg w,clk,resetn;
   reg [2:0] CS,NS;
   wire z;
   reg [7:0] count;

  integer i;
  serialCounter sk(.w(w), .clk(clk), .resetn(resetn), .z(z), .counter(count));

initial
  begin
    resetn = 1'b0;
    clk = 1'b0;
    CS=3'b000;
    #30 resetn=1;
    #5000 $finish;
  end

always #5 clk = ~clk;

  initial $monitor("clk=%b, w=%b, z=%b, count=%d pattern=%b", clk, w,z, count, sk.pattern);

initial begin
  w = 0;
  forever #10 w = $random;
end
  
endmodule


2 commentaires

Je suggère de supprimer cs , ns et i car ils ne font rien quand je vois la forme d'onde. Et j'ai une question, le modèle est correct, mais quand je vois le testbench, w n'est pas égal au motif. Est-ce à cause de l'horloge? Je veux dire que nous ne considérons pas w lorsque l'horloge est 0


w est une séquence aléatoire d'un bit de 1 et 0. Cela change chaque cycle d'horloge. N'est-ce pas ce que vous attendiez? J'ai utilisé la testbench de la réponse du toolique. Et oui, vous devez supprimer tous les VAR non utilisés.