本人用的是黑金的AX309开发板,最近初学FPGA。今天仿真他们教程里面的串口例程,首先一个简单的时钟分频模块的仿真就出了问题。
首先这是他们的代码:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: clkdiv
// 产生一个波特率9600的16倍频的时钟,9600*16= 153600
// 相当于50MHz的326分频,50000000/153600=326
//////////////////////////////////////////////////////////////////////////////////
module clkdiv(clk50, clkout);
input clk50; //系统时钟
output clkout; //采样时钟输出
reg clkout;
reg [15:0] cnt;
//分频进程,对50Mhz的时钟326分频
always @(posedge clk50)
begin
if(cnt == 16'd162)
begin
clkout <= 1'b1;
cnt <= cnt + 16'd1;
end
else if(cnt == 16'd325)
begin
clkout <= 1'b0;
cnt <= 16'd0;
end
else
begin
cnt <= cnt + 16'd1;
end
end
endmodule
我写的测试代码:
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////
module DIV_tb;
// Inputs
reg CLK_50M;
// Outputs
wire CLK_DIV;
// Instantiate the Unit Under Test (UUT)
clkdiv uut (
.clk50(CLK_50M),
.clkout(CLK_DIV)
);
initial begin
// Initialize Inputs
CLK_50M = 0;
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
end
always
begin
#10 CLK_50M = ~CLK_50M;
end
endmodule
代码上看是没有什么问题,可是一导进modelsim里面仿真就傻眼了,模块的输出始终是X,一条红线直至仿真结束。
然后各种看书,对比代码也不知道哪里出了错,后来看到一个网页上有说到相关的东西,怀疑是不是计数器没有复位导致状态不确定所以才这样的。然后我去改了代码,模块和testbench上都加入了Reset复位信号,然后仿真的结果就对了,时钟的分频信号终于有了输出:
从这个事情可以看出,写代码的严谨、仿真测试有多重要。这家的产品真是误人子弟啊。不过从客观上还是要感谢一下他们,如果不是这样,我也体会不到复位和初值的重要性
|