2017-05-07 7 views
2

J'essaye de faire un FSM qui allume différents LEDS sur une matrice de LED selon le bouton pressé. Cependant, la LED ne reste pas allumée et après avoir relâché le bouton, la première LED s'allume à nouveau. Voici le code:Comment rester dans le même état FSM après que l'entrée est remise à zéro? (SystemVerilog)

module OneLed(input logic clk, reset, input logic [1:0] button, 
      output logic [7:0] rows, 
      output logic shcp, stcp, mr, oe, ds); //The LED matrix has 3 74hc595 shift registers below it 

     logic [7:0] [23:0] in; 
     logic [1:0] butreg; // thought a register would remember the button input 
     assign butreg = button; 

     //FSM 
     typedef enum logic [1:0] {S0, S1, S2} statetype; 
     statetype state , nextstate; 

    //state register 
    always_ff @(posedge clk, posedge reset) 
      if (reset) state <= S0; 
      else state <= nextstate; 

    //next state logic 
      always_comb 
       case(butreg) 
        S0: if (2'b01) nextstate = S1; 
         else if (2'b10) nextstate = S2; 
         else nextstate = S0; 

        S1: if (2'b01) nextstate = S2; 
         else if (2'b10) nextstate = S0; 
         else nextstate = S1; 

        S2: if (2'b01) nextstate = S0; 
         else if (2'b10) nextstate = S1; 
         else nextstate = S2;  
        default: nextstate = S0; 
      endcase 

    //output logic 
    always_comb 
      begin 
       if (state == S0) 
        in [0] = 24'b10000000_00000000_00000000; 
       else if (state == S1) 
        in [0] = 24'b00000000_10000000_00000000; 
       else if (state == S2)   
        in[0] = 24'b00000000_00000000_10000000; 
    end   

    led LED (clk, in , rows, shcp, stcp, mr, oe, ds); // this module works fine 
endmodule 

Répondre

0
assign butreg = button; 

Cette déclaration traite butreg comme un fil, qui est connecté directement à votre signal d'entrée bouton.

Si vous cherchez à verrouiller la valeur de bouton dans le registre butreg, vous devez utiliser un toujours bloc et déclenchement à l'événement approprié (posedge clk ou * ou une autre condition.

Par exemple, au lieu de l'assign ci-dessus, vous pouvez avoir

always @(posedge clk) begin 
    if (button == 2'b00) begin 
    butreg <= butreg; 
    end 
    else begin 
    butreg <= button; 
    end 
end 
+0

Merci! Cela fonctionne parfaitement – HKS