【发布时间】:2014-11-23 02:14:03
【问题描述】:
我是 Verilog 开发的新手,在相对简单的计数器和触发器输出类型设计上看不到哪里出了问题。
这是verilog代码 请注意,无论 reg 是否在 output_signal 上声明而没有 internal_output_buffer,代码都会返回相同的结果
`timescale 1ns / 1ps
module testcounter(
input wire clk,
input wire resetn,
input wire [31:0] num_to_count,
output reg [7:0] output_signal
);
reg [31:0] counter;
initial begin
output_signal = 0;
end
always@(negedge resetn) begin
counter = 0;
end
always@(posedge clk) begin
if (counter == num_to_count) begin
counter = 0;
if (output_signal == 0) begin
output_signal = 8'hff;
end
else begin
output_signal = 8'h00;
end
end
else begin
counter = counter + 1;
end
end
assign output_signal = internal_output_buffer;
endmodule
并且代码经过测试
`timescale 1ns / 1ps
module testcounter_testbench(
);
reg clk;
reg resetn;
reg [31:0] num_to_count;
wire [7:0] output_signal;
initial begin
clk = 0;
forever #1 clk = ~clk;
end
initial begin
num_to_count = 20;
end
initial begin
#7 resetn = 1;
#35 resetn = 0;
end
testcounter A1(.clk(clk),.resetn(resetn),.num_to_count(num_to_count),.output_signal(output_signal));
endmodule
行为模拟符合我的预期
但是时序仿真爆炸了
为了更好的衡量标准:实际探测到的执行会爆炸并且看起来像
任何提示将不胜感激。谢谢大家。
【问题讨论】:
-
您似乎无法使用半千兆赫时钟和定时模型运行 32 位计数器。
-
检查最大时钟频率,它允许这个模块正常工作 - 你应该在编译报告中得到它。
-
我对 FPGA 和 Verilog 还是很陌生,但看起来您在设计中使用了阻塞分配,这可能不会产生您想要的行为。查看“=”运算符和“