首页 文章

尝试在Verilog中闪烁LED

提问于
浏览
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

3 回答

  • 0

    时钟频率为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
    
  • 4

    您可以在0.025%的时间内关闭LED,这样您也可能不会闪烁 .

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

    if (count1 == 33'd1000000) begin
      LEDstatus <= !LEDstatus;
    end
    
  • 3

    如果上面的解释不够充分,那么这里有一个完整代码的full explanation .

相关问题