【求助】把主时钟分频出来的信号用作时钟时出现的奇怪...
在鼓捣一个串口发送程序,我没像例程中那么用时钟(例程的运行结果没问题)。 而是用从主时钟分频出来的等于波特率的时钟频率,驱动状态机,发送数据到TX引脚。虽然用ModelSim仿真时TX波形和例程的仿真波形完全一致,但结果还是不对。但怎么弄也不对,发的数据很混乱。最后把问题缩小到了时钟问题。写了这个测试程序。这个程序让LED亮一秒,再灭一秒,不断循环。时钟源是从主时钟分频得到。只有三个module,一个分频,一个翻转LED和一个顶层模块。
//顶层模块
module clockDivDriveTest(
input sys_clk,
input RSTn,
output o_invertWave
);
wire odivClock;
invertMod u2(
.divClk(odivClock),
.RSTn(RSTn),
.invertWave(o_invertWave)
);
dividedClock u1(
.CLK(sys_clk),
.RSTn(RSTn),
.divClock(odivClock)
);
endmodule
//在输入的时钟上升沿,让invertWave翻转,以驱动LED亮灭循环。
module invertMod(
input divClk,
input RSTn,
output invertWave
);
reg r_invertWave;
always@(posedge divClkornegedge RSTn)
begin
if( !RSTn )
r_invertWave <= 0;
else
r_invertWave <= ~r_invertWave;
end
assign invertWave = r_invertWave;
endmodule
//将频率为50MHz的时钟分频。为了用肉眼就能看见问题,输出的divClock周期为2s。
module dividedClock
(
input CLK, input RSTn,
output divClock
);
reg count_clk;
//循环计数器
always@( posedge CLK or negedge RSTn )
begin
if( !RSTn )
count_clk <= 27'd0;
else if( count_clk == 27'd100_000_000 )
count_clk <= 27'd0;
else
count_clk <= count_clk + 1'b1;
end
//分频部分
assign divClock = ( count_clk <= 27'd50_000_000 ) ? 1'b1 : 1'b0;
endmodule
把o_invertWave分配给驱动LED的引脚,在开发板上测试时,能明显看见LED灭的时候有一个突然的闪亮,和SignalTap抓取的波形上的那个突变完全对应。分析问题的原因时弄不明白了。如果是分频后的时钟有毛刺,为何SignalTap上看不出来?或者是这个分频时钟没问题,而是FPGA中其他部分有问题?这个问题折磨我好几天了{:dizzy:}
assign divClock = ( count_clk <= 27'd50_000_000 ) ? 1'b1 : 1'b0;
这种分频是不可可靠的 吴厚航那本书上分析过这个时钟分频的问题
一般大家都不是用这种方法去分频! assign divClock = ( count_clk <= 27'd50_000_000 ) ? 1'b1 : 1'b0;
这句写错了。应该是
assign divClock = ( count_clk == 27'd50_000_000 ) ? 1'b1 : 1'b0; 看了书,是不能这样用,但没说根本原因,也没哪个资料上说明了原因。应该用使能时钟。我用时序仿真也没仿真出碰到的现象。{:2_29:} 两个原因:1直接使用时钟分频出来的信号,误差比较大;他是两个组合电路之和,不好控制;2:时钟先好的扇出不够;
页:
[1]