尝试在Verilog中闪烁LED

时间:2012-08-10 05:55:20

标签: verilog timing intel-fpga

我有一个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上工作,具有完全相同的引脚分配和时序约束

http://www.fpga4fun.com/Opto2.html

3 个答案:

答案 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完整代码。