módulo de cola Verilog con 4 lugares

0

Estoy intentando crear un módulo que funcione como una cola con 4 ranuras. Es para un elevador y el currSt es el estado actual y el destino es el primer elemento en la cola. 4'b1111 es como NULL. El problema aquí es que la cola no obtiene la entrada del teclado para ser almacenada en los 4 lugares libres. '

module Queue(
  input clk, slowclk,
  input[3:0] cs,
  output[3:0] currstat, des,
  input[3:0]keycode,
  output reg go
);

reg currSt;
initial currSt = 4'b1;
//1111 = empty place in queue
reg queueItem1 = 4'b1111;
reg queueItem2 = 4'b1111;
reg queueItem3 = 4'b1111;
reg queueItem4 = 4'b1111;

//continuous assignment
assign currstat = currSt;
assign des = (queueItem1 == 4'b1111)?currSt:queueItem1;

always@(posedge clk) begin
    if ((keycode == 4'b0001)
      ||(keycode == 4'b0010)
      ||(keycode == 4'b0100)
      ||(keycode == 4'b1000))
    begin
        if(queueItem1 == 4'b1111)
            queueItem1 = keycode;
        else if(queueItem2 == 4'b1111)
            queueItem2 = keycode;
        else if(queueItem3 == 4'b1111)
            queueItem3 = keycode;
        else if(queueItem4 == 4'b1111)
            queueItem4 = keycode;
        //else do nothing
    end

    //adds new key pressed to queue
    if (keycode == 4'b0001
     || keycode == 4'b0010
     || keycode == 4'b0100
     || keycode == 4'b1000)
    begin
        if (queueItem1 != keycode
         && queueItem2 != keycode
         && queueItem3 != keycode
         && queueItem4 != keycode)
        begin
            if (queueItem1 == 4'b1111
             && queueItem2 == 4'b1111
             && queueItem3 == 4'b1111
             && queueItem4 == 4'b1111)
              queueItem1 = keycode;
            else if (queueItem1 != 4'b1111
                  && queueItem2 == 4'b1111
                  && queueItem3 == 4'b1111
                  && queueItem4 == 4'b1111)
              queueItem2 = keycode;
            else if (queueItem1 != 4'b1111
                  && queueItem2 != 4'b1111
                  && queueItem3 == 4'b1111
                  && queueItem4 == 4'b1111)
              queueItem3 = keycode;
            else if (queueItem1 != 4'b1111
                  && queueItem2 != 4'b1111
                  && queueItem3 != 4'b1111
                  && queueItem4 == 4'b1111)
                queueItem4 = keycode;
            //else don't add the new one in the queue
        end
        //else if any of the slots is equal the keycode then dont add it
    end

    //check if current state matches with the request queue
    if (currSt == 4'b1000
     || currSt == 4'b0100
     || currSt == 4'b0010
     || currSt == 4'b0001)
    begin
        if (queueItem1 == currSt) begin
            queueItem1 = queueItem2;
            queueItem2 = queueItem3;
            queueItem3 = queueItem4;
            queueItem4 = 4'b1111;
            go = 0;
        end else if (queueItem2 == currSt) begin
            queueItem2 = queueItem3;
            queueItem3 = queueItem4;
            queueItem4 = 4'b1111;
            go = 0;
        end else if (queueItem3 == currSt) begin
            queueItem3 = queueItem4;
            queueItem4 = 4'b1111;
            go = 0;
        end else if (queueItem4 == currSt) begin
            queueItem4 = 4'b1111;
            go = 0;
        end

        //if current state is not in the request queue
        else 
            go = 1;
    end
end

always@(posedge slowclk)//change current state to new state
    currSt <= cs;

endmodule
    
pregunta anon

1 respuesta

1

Lo que pasa es que el registro se suponía que era de 4 bits uno y lo declaré como 1 bit. Hubo demasiadas advertencias y mi cerebro no pudo procesarlas ayer, pero lo descubrí hoy mientras intentaba depurar esta mierda. Les sugiero a todos que verifiquen cuidadosamente el número de bits y las advertencias.

~ sobre y cerrado ~

    
respondido por el anon

Lea otras preguntas en las etiquetas