【发布时间】:2020-09-11 14:59:43
【问题描述】:
我想使用 Mod10COunter 和 Mod6Counter 设计一个从 0 到 59 的秒计数器。我正在尝试使用测试台测试输出。生成的时钟是完美的。但是,输出始终为“X”。这是秒计数器的代码。
module generateSec(clk, reset, s1, s2, min_en);
input wire clk, reset;
output reg [3:0] s1, s2;
output reg min_en;
wire enable;
Mod10Counter sec1 (.clk(clk), .out(s1), .en_out(enable), .rst(reset));
Mod6Counter sec2 (.clk(enable), .out(s2), .en_out(min_en), .rst(reset));
endmodule
我已经编写了如下使用的模块。
module Mod10Counter(clk, out, en_out, rst);
input clk, rst;
output reg [3:0] out;
output reg en_out;
always @(posedge clk or rst) begin
if (rst) begin
out<=4'b0000;
en_out<=1'b0;
end
else if (out == 4'b1001) begin
out <= 4'b0000;
en_out <= 1'b1;
end
else begin
out <= out+1;
en_out <= 1'b0;
end
end
endmodule
module Mod6Counter(clk, out, en_out, rst);
input clk, rst;
output reg [3:0] out;
output reg en_out;
always @(posedge clk or rst) begin
if (rst) out<=4'b0000;
else if (out == 4'b0101) begin
out <= 4'b0000;
en_out <= 1'b1;
end
else begin
out <= out+1;
en_out <= 1'b0;
end
end
endmodule
generateSec 的测试台如下:
`timescale 1ms / 1ps
module generateSec_test;
// Inputs
reg clk;
reg reset;
// Outputs
wire [3:0] s1;
wire [3:0] s2;
wire min_en;
// Instantiate the Unit Under Test (UUT)
generateSec uut (
.clk(clk),
.reset(reset),
.s1(s1),
.s2(s2),
.min_en(min_en)
);
initial begin
clk = 0;
forever #500 clk=~clk;
end
initial begin
reset = 1;
#550;
reset =0;
end
endmodule
我将针对上述问题的输出屏幕截图粘贴到此处。 Output of Verilog simulation of generateSec-testbench
【问题讨论】:
-
不确定这是否是原因,但 generateSec 中的 s1、s2 和 min_en 应该是线而不是 reg,因为它们是由单元输出驱动的。
-
我无法复制它。我没有得到'x',它在模拟中工作正常。这可能是波浪倾倒或竞争条件的问题。一种建议是将
@(posedge clk or rst)替换为@(posedge clk or posedge rst)
标签: verilog simulation clock xilinx-ise