闪烁的LED Verilog

时间:2017-08-14 04:59:11

标签: verilog led

我对verilog非常陌生,而且我正在写一个我正在写的项目,以便更好地完成它。我的主板上有一个按钮和一个LED,我希望按钮增加一个计数器,使得LED闪光灯更快。这似乎在理论上有效,但我不能让它在实践中发挥作用。开关不会让LED闪光灯更快,它似乎做了一些奇怪的事情。

我目前的代码,请告知我我所做的任何问题,即使这不会导致我的问题,因为我正在尝试学习语言和构造。

  `timescale 1ns / 1ps

module LedFlash(CLK100MHZ, led0, sw0, btn0);
input CLK100MHZ;
output reg led0;
input sw0;
input btn0;

 reg [25:0] clockTick = 0;
 reg [1:0]currentlyLighting = 0;
 reg [3:0] speedFactor = 0;
 reg [1:0]oldButton = 0;
 reg [1:0]buttonValue = 0;



  always @(posedge CLK100MHZ)
  begin
    led0 <= 0;
    buttonValue <= 0;

    if(oldButton != btn0 && btn0 == 1)
        buttonValue <= 1;

    oldButton <= btn0;

    if(clockTick == 0)
    currentlyLighting <= !currentlyLighting;

    if(currentlyLighting)
    led0 <= 1;

    if(buttonValue) begin
            speedFactor <= speedFactor + 1;
    end

    clockTick <= clockTick + speedFactor;
  end  


endmodule

这是一对按下按钮的几个按钮。只有当speedfactor递增的时候才是我实际按下按钮的时间。

waveform

我会提供更多的印刷机,但它从那里变得更加奇怪,显然我做错了。 在初次按下按钮后,它会偏离我的预期。有时会关闭,有时保持稳定,减速,加速......

**此外,如果我更换此行:

clockTick <= clockTick + speedFactor;

clockTick <= clockTick + 10;
例如,它会像我期望的那样快速闪烁。我猜测我在添加位时做错了,尽管探测器似乎告诉我了。

**

固定代码:

    `timescale 1ns / 1ps

module LedFlash(CLK100MHZ, led0, sw0, btn0);
input CLK100MHZ;
output reg led0;
input sw0;
input btn0;

 reg [25:0] clockTick = 0;
 reg currentlyLighting = 0;
 reg [3:0] speedFactor = 0;
 reg oldButton = 0;
 reg buttonValue = 0;



  always @(posedge CLK100MHZ)
  begin
    led0 <= 0;
    buttonValue <= 0;

    if(oldButton != btn0 && btn0 == 1)
        buttonValue <= 1;

    oldButton <= btn0;

    currentlyLighting <= clockTick[25];

    if(currentlyLighting && sw0)
    led0 <= 1;

    if(buttonValue) begin
            speedFactor <= speedFactor + 1;
    end

    clockTick <= clockTick + speedFactor;
  end  


endmodule

1 个答案:

答案 0 :(得分:0)

在开始新一轮时,设计无法确保clockTick点击0,因此speedFactor实际上无法控制currentlyLighting的切换频率。

例如,如果clockTick为26&#39; h3FFFFFF且speedFactor为4&#39; d3,则clockTick的下一个值为26&00; h0000002和{{ 1}}不会为那一轮切换。

一个简单的解决方案可能是使用currentlyLighting的MSB作为clockTick

currentlyLighting

另外; currentlyLighting <= clockTick[25]; buttonValueoldButton应为单比特信号,但在代码中它们是2比特。正确的声明如下。

currentlyLighting