我对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
答案 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];
,buttonValue
和oldButton
应为单比特信号,但在代码中它们是2比特。正确的声明如下。
currentlyLighting