3

我有一个 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

4

3 回答 3

4

时钟频率为 50MHz,一个 On-Off 循环为 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
于 2012-08-10T09:32:03.813 回答
4

您关闭 LED 的时间为 0.025%,因此您最好不要让它闪烁。

您可能希望在计数达到 20000000 时将其重置为零,以便每次打开和关闭一半时间。或者当它达到 1000000 时切换状态 -

if (count1 == 33'd1000000) begin
  LEDstatus <= !LEDstatus;
end
于 2012-08-10T11:25:02.307 回答
-1

如果上面的解释还不够,这里有一个完整的代码完整的解释。

于 2014-02-04T19:05:48.237 回答