Ich bin sehr neu bei Verilog und stehe fest auf einem Projekt, an dem ich schreibe, um besser zu werden. Ich habe eine Taste und eine LED auf meiner Platine, und ich möchte, dass die Taste einen Zähler erhöht, wodurch die LED schneller blinkt. Das scheint in der Theorie zu funktionieren, aber ich kann es nicht in die Praxis umsetzen. Der Schalter wird das LED-Blitzlicht nicht schneller machen, es scheint seltsame Dinge zu tun.Blinkende LEDs Verilog
Mein aktueller Code, bitte informieren Sie mich über irgendwelche Probleme mit dem, was ich tue, auch wenn es mein Problem hier nicht verursacht, da ich versuche, die Sprache zu lernen und zu konstruieren.
`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
Hier ist ein gif von ein paar drückt auf den Knopf. Nur wenn der Geschwindigkeitsfaktor erhöht wird, wird der Knopf gedrückt.
würde ich mehr Pressen bieten, aber es wird immer mehr von dort seltsam, ich etwas tue, ist eindeutig falsch. Nach dem ersten Drücken der Taste, es weg von dem, was ich erwarte. Manchmal schaltet es aus, manchmal bleibt solide, verlangsamt, beschleunigt .....
** Auch wenn ich diese Zeile:
clockTick <= clockTick + speedFactor;
mit
clockTick <= clockTick + 10;
zum Beispiel Es wird schnell blinken, wie ich es erwarten würde. Ich schätze, ich mache etwas falsch mit der Bit-Zugabe, obwohl die Sonde mir etwas anderes zu sagen scheint.
**
Festcode:
`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
Danke für die informative Antwort, es ist spät hier, also werde ich am Morgen versuchen müssen. –
Ich fühle mich dumm für die [1: 0] Ich muss aufhören, Sprachen wie c und Verilog so viel für solche Dinge zu verbinden. Wenn ich reg [1] realistisch in c sehe, würde das 1 Punkt bedeuten, und die ganze [h: l] -Notation von Verilog ist etwas, an das ich mich gewöhnen muss. –
Nur bestätigt und es funktioniert super. Danke für die Hilfe, aktualisierte Unterseite des OP mit Arbeitscode. –