我正在使用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
答案 0 :(得分:1)
那是因为你的重置是水平敏感的,并且模拟总是很高。因此,第一个TFF(下一个TFF的时钟)的输出始终为零。并且因为重置是同步的,所以TFF不会重置并且其输出是X,不会改变。
使重置异步,以便所有FF同时重置。