使用D flipflop.in Verilog实现4位计数器

时间:2017-03-23 18:23:20

标签: verilog counter fpga hdl

我正在使用D触发器实现一个4位计数器。为此,我首先编写了D触发器的代码,然后将其转换为T触发器,然后用它来制作计数器。

我面临的问题是,只有T_flipflop“T0”的第一个实例正在工作,而其他位处于未知状态。

代码的输出!!

#                    0 T = 1 , Clock=0 , q=  x , q= xxxx , Reset= 1 
#                   10 T = 1 , Clock=1 , q=  X , q= xxx0 , Reset= 1 
#                   15 T = 1 , Clock=1 , q=  X , q= xxx0 , Reset= 0 
#                   20 T = 1 , Clock=0 , q=  X , q= xxx0 , Reset= 0 
#                   30 T = 1 , Clock=1 , q=  X , q= xxx1 , Reset= 0 
#                   40 T = 1 , Clock=0 , q=  X , q= xxx1 , Reset= 0 
#                   50 T = 1 , Clock=1 , q=  X , q= xxx0 , Reset= 0 
#                   60 T = 1 , Clock=0 , q=  X , q= xxx0 , Reset= 0 
#                   70 T = 1 , Clock=1 , q=  X , q= xxx1 , Reset= 0 
#                   80 T = 1 , Clock=0 , q=  X , q= xxx1 , Reset= 0 
#                   90 T = 1 , Clock=1 , q=  X , q= xxx0 , Reset= 0 
#                  100 T = 1 , Clock=0 , q=  X , q= xxx0 , Reset= 0 
#                  110 T = 1 , Clock=1 , q=  X , q= xxx1 , Reset= 0 
#                  120 T = 1 , Clock=0 , q=  X , q= xxx1 , Reset= 0 
#                  130 T = 1 , Clock=1 , q=  X , q= xxx0 , Reset= 0 
#                  140 T = 1 , Clock=0 , q=  X , q= xxx0 , Reset= 0 
#                  150 T = 1 , Clock=1 , q=  X , q= xxx1 , Reset= 0 
#                  160 T = 1 , Clock=0 , q=  X , q= xxx1 , Reset= 0 
#                  170 T = 1 , Clock=1 , q=  X , q= xxx0 , Reset= 0 
#                  180 T = 1 , Clock=0 , q=  X , q= xxx0 , Reset= 0 
#                  190 T = 1 , Clock=1 , q=  X , q= xxx1 , Reset= 0 
#                  200 T = 1 , Clock=0 , q=  X , q= xxx1 , Reset= 0 

我已经发现了一个问题,我的T触发器没有按预期工作。如果我从T_flipflop模块中删除输入T并将Q_bar分配给D,则它可以正常工作。如何在不移除输入T_flipflop模块的情况下纠正T触发器。

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

assign Q_bar=~Q;

always @(posedge clk) 
begin
if(reset) //Active high reset
    Q<=1'b0;
else 
    Q<=D;
end
endmodule   



module T_flipflop (output Q, Q_bar , input T, clk,reset);
wire w;

assign w=T^Q; 


D_flipflop D1(.Q(Q), .Q_bar(Q_bar) ,.D(w), .clk(clk),.reset(reset));

endmodule



module ripple_carry_counter(Q,T,Clk,reset);
output [3:0]Q ;
input Clk,reset,T;

T_flipflop  T0(.Q(Q[0]), .Q_bar() ,.T(T), .clk(Clk),.reset(reset));
T_flipflop  T1(.Q(Q[1]), .Q_bar() ,.T(T), .clk(Q[0]),.reset(reset));
T_flipflop  T2(.Q(Q[2]), .Q_bar() ,.T(T), .clk(Q[1]),.reset(reset));
T_flipflop  T3(.Q(Q[3]), .Q_bar() ,.T(T), .clk(Q[2]),.reset(reset));

endmodule

module exp_masood_bench_ripple_carry_counter;
reg clk,reset,T;
wire [3:0]q;
ripple_carry_counter MS(q,T,clk,reset);

initial
$monitor($time , " T = %b , Clock=%b , q= %d , q= %b , Reset= %b ",T,clk,q,q,reset);

initial
begin
clk=1'b0;
T=1'b1;
reset=1'b1;
#15 reset=1'b0;
#400 $finish;
end
always #10 clk=~clk;
endmodule

1 个答案:

答案 0 :(得分:1)

那是因为你的重置是水平敏感的,并且模拟总是很高。因此,第一个TFF(下一个TFF的时钟)的输出始终为零。并且因为重置是同步的,所以TFF不会重置并且其输出是X,不会改变。

使重置异步,以便所有FF同时重置。

相关问题