使用 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 将同时重置。
我正在使用 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 将同时重置。