2017-08-14 7 views
2

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.

waveform

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 

Antwort

1

Das Design stellt nicht sicher, dass clockTick Treffer 0 während eine neue Runde starten, so speedFactor eigentlich nicht die Hin- und Herschalten Frequenz von currentlyLighting steuern kann.

Zum Beispiel, wenn clockTick 26'h3FFFFFF und speedFactor ist 4'd3, der nächste Wert von clockTick wird 26'h0000002 und currentlyLighting wird für diese Runde nicht wechseln. Eine einfache Lösung könnte das MSB von clockTick als currentlyLighting verwenden.

currentlyLighting <= clockTick[25]; 

Zusätzlich; buttonValue, oldButton und currentlyLighting sollten Single-Bit-Signale sein, aber sie sind 2-Bit in Ihrem Code. Die korrekten Deklarationen sind wie folgt.

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

Danke für die informative Antwort, es ist spät hier, also werde ich am Morgen versuchen müssen. –

+0

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. –

+0

Nur bestätigt und es funktioniert super. Danke für die Hilfe, aktualisierte Unterseite des OP mit Arbeitscode. –