verilog中使用T触发器的4位计数器
我正在尝试设计一个带有T触发器的4位计数器,我做了如下工作: 1-从D触发器到T触发器:verilog中使用T触发器的4位计数器,verilog,hdl,Verilog,Hdl,我正在尝试设计一个带有T触发器的4位计数器,我做了如下工作: 1-从D触发器到T触发器: module T_FlipFlop( clk,T, Q); input wire clk; input wire T; output reg Q; wire D; initial begin Q<=1'b0; end assign D= T ^ Q; always @(negedge clk) begin
module T_FlipFlop( clk,T, Q);
input wire clk;
input wire T;
output reg Q;
wire D;
initial
begin
Q<=1'b0;
end
assign D= T ^ Q;
always @(negedge clk)
begin
Q<=D;
end
endmodule
使用RTL示意图:
要遵循此图,请执行以下操作:
我们知道,T-触发器只是一个JK触发器,J和K互相连接,这就是我们这里所说的,所以把它们看作是T-触发器。 3-模拟:
4最后,我的问题: 1) 为什么Q1
是唯一运行正常的输出
2) 为什么Q2
,Q3
,Q4
以1
开头,尽管我已将它们初始化为0
我想不出少了什么,我试着到处玩,但没用,我被困在这里了
编辑:我的测试台:
module test;
// Inputs
reg sysclk;
// Outputs
wire Q1;
wire Q2;
wire Q3;
wire Q4;
// Instantiate the Unit Under Test (UUT)
Counters_FreqDividers uut (
.sysclk(sysclk),
.Q1(Q1),
.Q2(Q2),
.Q3(Q3),
.Q4(Q4)
);
initial begin
// Initialize Inputs
sysclk <= 1'b1;
#200 $finish();
end
always #5 sysclk=~sysclk;
endmodule
模块测试;
//投入
注册系统时钟;
//输出
导线Q1;
导线Q2;
导线Q3;
导线Q4;
//实例化被测单元(UUT)
计数器\分频器uut(
.sysclk(sysclk),
.Q1(Q1),
.Q2(Q2),
.Q3(Q3),
.Q4(Q4)
);
初始开始
//初始化输入
sysclk yes它可以正确切换,但方式相反<代码>Q2
应该从0
开始,然后在Q1的第一个下降沿处切换到1
。但是,在模拟中,它在Q1
的第一个下降沿切换到0
。因此,“Q3”会切换,因为它见证了“Q2”的下降沿,“Q4”也会切换到“Q3”的下降沿。是的!就像你说的,我该如何解决这个问题呢?它在添加了reset
信号后工作了!谢谢!您可以使用sysclk
作为所有T触发器的时钟,并将T
输入分配给前一个触发器的Q
输出,从而改进计时。是的,它可以正确切换,但方式相反<代码>Q2
应该从0
开始,然后在Q1的第一个下降沿处切换到1
。但是,在模拟中,它在Q1
的第一个下降沿切换到0
。因此,“Q3”会切换,因为它见证了“Q2”的下降沿,“Q4”也会切换到“Q3”的下降沿。是的!就像你说的,我该如何解决这个问题呢?它在添加了reset
信号后工作了!谢谢!您可以使用sysclk
作为所有T触发器的时钟,并将T
输入分配给前一个触发器的Q
输出,从而改进计时。
module test;
// Inputs
reg sysclk;
// Outputs
wire Q1;
wire Q2;
wire Q3;
wire Q4;
// Instantiate the Unit Under Test (UUT)
Counters_FreqDividers uut (
.sysclk(sysclk),
.Q1(Q1),
.Q2(Q2),
.Q3(Q3),
.Q4(Q4)
);
initial begin
// Initialize Inputs
sysclk <= 1'b1;
#200 $finish();
end
always #5 sysclk=~sysclk;
endmodule