闪烁的 LED Verilog

Flashing LEDs Verilog

我是 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 增加的时候才是我真正按下按钮的时候。

我会提供更多印刷机,但从那里开始变得更加奇怪,显然我做错了什么。 在最初按下按钮后,它偏离了我的预期。时而熄灭,时而稳定,时而减速,时而加速.....

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

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

设计并不能确保clockTick在开始新一轮时命中0,所以speedFactor实际上无法控制currentlyLighting的触发频率。

例如,如果 clockTick 是 26'h3FFFFFF 而 speedFactor 是 4'd3,则 clockTick 的下一个值将是 26'h0000002 而 currentlyLighting 将该回合不切换。

一个简单的解决方案是将 clockTick 的 MSB 用作 currentlyLighting

currentlyLighting <= clockTick[25];

此外; buttonValueoldButtoncurrentlyLighting 应该是单位信号,但它们在您的代码中是 2 位。正确的声明如下。

 reg currentlyLighting = 0;
 reg oldButton = 0;
 reg buttonValue = 0;