Contador de anillo Verilog con saltos

Quiero probar un contador de 0 a 12. Puede ser un contador simple.

always @(posedge clock) begin
        count <= count+1;
        if (count == 4'd12) begin
        counter <= 0;
        end
end

Pero mi tarea necesita contar salteada. Por ejemplo, cuando el salto es 4, cuente 0-5-10-15-20-25-30, porque es un contador de 4 bits, debe continuar contando como 0-5-10-2-7-12. Este conteo de saltos puede ser cualquier número entre 0 y 11. ¿Cómo modificar el código simple de verilog según mi tarea?

¿Por qué está utilizando una asignación de bloqueo en una secuencia siempre @?
Soy nuevo en Verilog. Yo uso VHDL. ¿Como debería ser?
Quizás lea esta página para ver algunos casos de ejemplo. O esta página para la educación de recuperación.
Oh, lo siento, debería ser <= en lugar de =.
Pero, la pregunta es un poco diferente. Si será un contador exacto de 4 bits, puede funcionar solo. ¿Cómo calcular la transición 10-2 cuando el salto es igual a 4?
Obtuve "asignación de bloqueo" fácilmente, gracias.
¿Cuándo se ejecuta la declaración 'if' en relación con la declaración "count+1"? ¿ Crees que debe seguir ? ¿O crees que se lleva a cabo en el mismo momento? En resumen, ¿por qué no comienza con la comparación y elige aumentar o establecer un valor? Me gustaría saber acerca de su modelo mental. ¿Qué está pasando en tu cabeza en relación con el código que ves allí?
Si entiendo correctamente, quiere decir que el código será if(count == 12) else count+1, ¿verdad?
Pero el problema es; si incremento el valor en 5 cuando es 10, no toca su valor límite (por ejemplo, 12), se desbordará como un contador de 4 bits, no como un contador limitado (hasta 12). Por favor avíseme, si la pregunta no es muy clara.
Solo su seguridad, sé que los registros y las asignaciones ocurrirán al final del ciclo del reloj.
Además, no puedo restablecer el contador a cero. Si es mayor que 12, el residual debe agregarse a cero.
¿Por qué no algo como esto ?
Cuando skip es igual a 4, 0-5-10 next no será igual a 12.
No puedo decir que entiendo completamente su pregunta. No has sido lo suficientemente detallado para mí en él. Así que tengo que retroceder en este punto hasta que llegue más de ti o alguien más me aclare las cosas.
wire [3:0] temp = count + 1 + skip; always @(posedge clock) count <= temp >= limit ? temp - limit : temp;
Creo que la única persona que entiende el problema @DaveTweed. Gracias. Tu respuesta es genial. EDITARÉ la pregunta y la respuesta.
@DaveTweed; ¿Se puede resolver este problema sin usar cables o asignaciones de bloqueo?
Introduje el cable solo para simplificar la asignación county, con suerte, demostrar la lógica más claramente. Ciertamente puede escribirlo sin usar el cable. Y siempre que solo haga una asignación a count, puede usar una asignación de bloqueo o de no bloqueo.always @(posedge clock) count = count + 1 + skip >= limit ? count + 1 + skip - limit : count + 1 + skip;

Respuestas (1)

Tal vez le sea útil a alguien.

module Counter(iClk, iRst, iSkip, iRev, oState);
     input iClk, iRst, iSkip, iRev;
   //declare oState:
   //declare internal wires and reg types here:
     output [3:0] oState;
     parameter [3:0] limit = 14;
     reg [4:0] temp = 5'd0;
     reg [4:0] cnt = 5'd0;
     integer skip = 1;

 always @ (posedge iClk)
 begin
  if (!iRst) begin
     
     temp = 5'd0; // to prevent overflow 5bits required
     cnt = 5'd0;
      
  end 
  else begin 
        
        if (iSkip && !iRev) begin // only iSkip asserted
            skip = 5;
        end 
        else if(!iSkip && iRev) begin // only iRev asserted
            skip = -2;
        end
        else if(iSkip && iRev) begin //iSkip and iRev asserted
            skip = 9;
        end
        else begin //Neither asserted
            skip = 1;
        end

        temp = temp + skip;
        
        if (temp > limit) begin
        cnt = temp-limit-1;
        end
        else begin
        cnt = temp;
        end
        
        temp = cnt;
            
        
  end
 end