闪烁的 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];
此外; buttonValue
、oldButton
和 currentlyLighting
应该是单位信号,但它们在您的代码中是 2 位。正确的声明如下。
reg currentlyLighting = 0;
reg oldButton = 0;
reg buttonValue = 0;
我是 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];
此外; buttonValue
、oldButton
和 currentlyLighting
应该是单位信号,但它们在您的代码中是 2 位。正确的声明如下。
reg currentlyLighting = 0;
reg oldButton = 0;
reg buttonValue = 0;