|
在鼓捣一个串口发送程序,我没像例程中那么用时钟(例程的运行结果没问题)。 而是用从主时钟分频出来的等于波特率的时钟频率,驱动状态机,发送数据到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 divClk or negedge 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 [26:0]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中其他部分有问题?这个问题折磨我好几天了
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|