我正在构建一个4位mod 12计数器(0-> 1-> 2-> ...-> 11-> 0在Verilog中。
但是,当我尝试在Vivado FPGA中使用testbench模拟此代码时,它似乎无法正常运行。计数器模块的输出始终显示为0。我试图以几种方式修改测试平台代码,但没有任何改变。实际上,我又增加了2个计数器(3-6-9计数器,2位数字十进制计数器),所有计数器均未达到我的预期。
模块计数器3
`timescale 1ns / 1ps
module counter_3(input RESET_N, input CK, output[3:0] COUNT, output[3:0] COMP);
wire J3, K3, J2, K2, J1, K1, J0, K0;
assign J3 = COUNT[2] & COUNT[1] & COUNT[0];
assign K3 = COUNT[1] & COUNT[0];
assign J2 = COMP[3] & COUNT[1] & COUNT[0];
assign K2 = COUNT[1] & COMP[0];
assign J1 = COUNT[0];
assign K1 = COUNT[0];
assign J0 = 1;
assign K0 = 1;
edgeTriggeredJKFF jk1(.RESET_N(RESET_N), .J(J3), .K(K3), .CK(CK), .Q(COUNT[3]), .Q_(COMP[3]));
edgeTriggeredJKFF jk2(.RESET_N(RESET_N), .J(J2), .K(K2), .CK(CK), .Q(COUNT[2]), .Q_(COMP[2]));
edgeTriggeredJKFF jk3(.RESET_N(RESET_N), .J(J1), .K(K1), .CK(CK), .Q(COUNT[1]), .Q_(COMP[1]));
edgeTriggeredJKFF jk4(.RESET_N(RESET_N), .J(J0), .K(K0), .CK(CK), .Q(COUNT[0]), .Q_(COMP[0]));
endmodule
模块edgeTriggeredJKFF
`timescale 1ns / 1ps
module edgeTriggeredJKFF(input RESET_N, input J, input K, input CK, output reg Q, output reg Q_);
initial begin
Q = 0;
Q_ = ~Q;
end
always @(negedge CK) begin
Q = RESET_N & (J&~Q | ~K&Q);
Q_ = ~RESET_N | ~Q;
end
endmodule
测试台代码
`timescale 1ns / 1ps
module test_tb();
reg counter3_RESET_N;
wire [3:0] counter3_CNT;
reg CK;
integer i;
counter_3 c3 (.RESET_N(counter3_RESET_N), .CK(counter3_ck), .COUNT(counter3_CNT));
always #3 CK = ~CK;
initial begin
Passed = 0;
Failed = 0;
CK <= 0;
counter_3_test;
end
task counter_3_test;
begin
CK <= 0;
counter3_RESET_N <= 1;
#60 counter3_RESET_N <= 0;
#6 counter3_RESET_N <= 1;
#48;
end
endtask
endmodule
您忘记了将时钟传递给DUT。您传递的甚至尚未声明的CK
而不是counter3_ck
。我建议您使用``default_nettype none
指令来捕获这些错误。
在旁注中,您滥用了阻止和非阻止分配。测试平台的intial
块中应该没有任何内容,并且您应该在jk模块的翻牌中使用它们。 Q_
将无法正常工作,在这种情况下将延迟一个周期。它应该是组合的:
always @(negedge CK)
Q <= RESET_N & (J&~Q | ~K&Q);
always @*
Q_ = ~RESET_N | ~Q;
而且您应该始终将任何initial
块视为测试平台的一部分。 jk模块中的初始块也是如此。