我有一个50Mhz时钟的CPLD。
这是我的代码:
module FirstProject(clk, LED);
output LED;
input clk;
reg [32:0] count1;
reg LEDstatus;
assign LED = LEDstatus;
always @ (posedge clk) begin
if (count1 < 10000000) begin
LEDstatus <= 0;
end
else begin
LEDstatus <= 1;
end
count1 <= count1 +1;
end
endmodule
我不知道为什么这不起作用。它部署在CPLD上,但总是点亮
此代码在我的cpld上工作,具有完全相同的引脚分配和时序约束
答案 0 :(得分:4)
时钟频率为50MHz,开 - 关循环为2 ** 33-1(8589934591)个周期。
1/Hz = seconds
slowdown factor * 1/Hz = seconds to complete loop
这意味着LED正试图闪烁:
(8589934591 / 50000000) = 171s, slower than 1Hz
任何超过25Hz的东西都不会被察觉,但这不是问题。
当计数在0到10000000之间时,灯应关闭:
10000000 / 50000000 = 0.2 Seconds
关闭时间为0.2秒,开启时间约为170秒。这个比例很可能很难被观察到。切换到50/50的开/关比和更快的速度观察会更容易。
我建议将count1 24位宽并将输出基于count1的MSB;
reg [23:0] count1;
always @(posedge clk) begin
LEDstatus <= count1[23];
count1 <= count1 + 1;
end
答案 1 :(得分:3)
您可以将LED关闭0.025%的时间,这样您也可能不会闪烁。
您可能希望在计数达到20000000时将计数重置为零,以便每次打开和关闭一半的时间。或者在状态达到1000000时切换状态 -
if (count1 == 33'd1000000) begin
LEDstatus <= !LEDstatus;
end
答案 2 :(得分:0)
如果上面的解释不够,那么这里有full explanation完整代码。