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

Implementing a 4 bit counter using D flipflop.in Verilog

我正在使用 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

那是因为你的重设是电平敏感的,而且模拟度总是很高。因此第一个 TFF 的输出(下一个 TFF 的时钟)始终为零。并且由于复位是同步的,下一个 TFF 不会复位,其输出 X 也不会改变。

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