2016-05-26 22 views
1

Ich versuche tatsächlich 3 Tage, um meinen Code funktioniert. Ich habe ein Dev-Board mit gemultiplexten 7-Segment-Display - es funktioniert. Das Problem ist, wenn ich versuche, eine Variable zu erhöhen. Ich habe folgenden Code geschrieben:Verilog - Inkrementieren Variable mit den Tasten

assign buttons = debouncedL | debouncedR; 

always @(posedge buttons or negedge RES) begin 
    if(~RES) number <= 0; 
    else if(debouncedL) number <= (number + 10); 
    else if(debouncedR) number <= (number + 1); 
end 

Und es funktioniert nicht. Wenn ich die Taste R drücke, wird die Variable um 1 erhöht, aber wenn ich L drücke passiert nichts. Nach dem Ändern der Positionen beider else if funktioniert die L-Taste immer noch nicht und die angezeigte Nummer wechselt zwischen 0000 und 0001, nachdem die R-Taste gedrückt wurde. Es könnte eine neue Frage sein, aber ich kann keine Lösung im Buch und im Internet finden. Kannst du mir helfen? Vielen Dank im Voraus.

+0

Wie wird 'number' definiert? – wilcroft

+0

Das ist: 'reg [13: 0] Nummer;' – Kma

+0

Wie implementiert Ihr FPGA Toolkit dies? Ich denke, dass Ihre seltsame Trigger-Logik es schwieriger macht, dies zu synthetisieren als ein synchrones Design. – hexafraction

Antwort

0

Ihr Entwurf ist asynchron, Sie haben metastability on buttons Signal.

Im synchronen Design (und alle FPGA-Design sollte synchron sein) nur Uhr kann für immer @posedge() Prozess verwendet werden. In Ihrem Design verwenden Sie das Tastensignal als Uhr.

Zur Erkennung auf die Schaltfläche müssen Sie den alten Zustand der Tastensignal speichern und vergleichen sie den aktuellen Zustand wie diese ansteigende Flanke:

always @(posedge clock or posedge rst) begin 
    // detect rising edge 
    if (button_old != button && button == 1'b1) 
      button_raise <= 1'b1 
    button_old <= button; 
    // increment number 
    if(button_raise == 1b'1) 
    begin 
     if(~RES) number <= 0; 
     else if(debouncedL) number <= (number + 10); 
     else if(debouncedR) number <= (number + 1); 
    end 
end 
+0

Danke! Jetzt weiß ich, warum neuer Code funktioniert, und alt nicht. – Kma

+0

Willkommen. Vergessen Sie nicht, die Antwort als gelöst zu prüfen, wenn Ihr Problem gelöst ist;) – FabienM

+0

Ich hoffe, ich habe es überprüft. Ich lerne, wie stackoverflow funktioniert. Was kannst du über den Rest des Codes sagen? Ich habe es oben im Kommentar gepostet. Irgendwelche Tipps von erfahrenen Codern werden mir sehr nützlich sein (ich kenne den "Shift and add 3" -Algorithmus für binäre BCD-Coversion bereits). – Kma