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>
`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
3 Réponses :
Il y a plusieurs problèmes.
Vous avez affirmé réinitialiser, mais vous ne l'avez jamais publié ( Vous devez conduire votre entrée Vous avez mal modelé la sortie Voici le code qui fonctionne maintenant et Détecte le modèle resetn code> reste à 0). Vous devez la définir sur 1 après quelques cycles d'horloge. P>
w code> différemment dans la testbench. Votre conception les échantillonne toujours quand il est 0. Un moyen rapide est de le conduire au hasard. P>
z code>, que je suppose est votre signal "détecter". J'ai aussi supprimé la logique code> code> à partir de celui-ci
Toujours code> car il ne semblait pas faire quoi que ce soit important. P>
1011 code> sur
w code>: p>
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: 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> 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
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
Je suggère de supprimer cs code>,
ns code> et
i code> 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 code> n'est pas égal au motif. Est-ce à cause de l'horloge? Je veux dire que nous ne considérons pas
w code> lorsque l'horloge est
0 code>
w code> 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.
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.