Lista de sensibilidad para cambio de estado y borde de reloj

0

No estoy seguro si esta es la implementación correcta, aunque funciona hasta ahora. Emití los datos en el flanco ascendente de la señal FETCH (esto no es un reloj). Los datos solo deben estar en el estado OUTP. Esto también cuenta la cantidad de palabras emitidas hasta el momento, y la máquina de estado (no se muestra) hace la transición a un estado diferente si el recuento de palabras alcanza algún valor.

always @(posedge FETCH)
    case(state)
        OUTP:   begin
                OUT_DATA <= DATA[WordCounter];
                WordCounter <= WordCounter + 1 ;
                end
        default:WordCounter <= 6'd0;
    endcase

El problema es que para reiniciar WordCounter, debo pulsar la señal FETCH cuando no esté en el estado OUTP. ¿Existe una forma mejor de volver a escribir este código, de modo que pueda recuperar los datos en el borde, pero el WordCounter se puede restablecer en cualquier estado que no sea OUTP que no requiera un borde ascendente?

    
pregunta Nazar

2 respuestas

1
  

Emití los datos en el flanco ascendente de la señal FETCH (esto no es un reloj).

Cambias OUT_DATA y WordCounter en el flanco ascendente de FETCH (pero no solo para restablecerlos o predefinirlos). Por lo tanto, FETCH es un reloj (al menos para este subcircuito).

Si no desea usar FETCH como un reloj, pero sigue observando sus flancos ascendentes, necesita tener otra señal de reloj para usar, y debe garantizarse que tenga al menos un flanco ascendente para cada pulso de FETCH . Entonces puedes hacerlo

reg FETCH2;
always @(posedge CLK) begin
    FETCH2 <= FETCH;
    if ( state == OUTP ) begin
        if (FETCH & ~FETCH2) begin // rising edge of FETCH
            OUT_DATA <= DATA[WordCounter];
            WordCounter <= WordCounter + 1;
        end
    end
    else begin
        WordCounter <= 0;
    end
end
    
respondido por el The Photon
0

Respondiendo estrictamente a la pregunta, este código le da una señal separada que restablecerá las variables:

always @(posedge FETCH or posedge clear)
begin
   if (clear)
   begin 
      OUT_DATA  <= out_data_reset_value;
      WordCounter  <= WordCounter _reset_value;
   end
   else
      case(state)
          OUTP:   begin
                  OUT_DATA <= DATA[WordCounter];
                  WordCounter <= WordCounter + 1 ;
                  end
          default:WordCounter <= 6'd0;
      endcase
end

Pero, como mi texto "Estrictamente ..." ya sugiere, ese estilo de codificación está muy mal visto. Siempre debe intentar hacer que todo su código esté sincronizado con un reloj y no introducir otros 'relojes'. (Que FETCH es). El uso de mi código con un borrado asíncrono introduce un nuevo conjunto adicional de condiciones de carrera potenciales. Yo personalmente nunca lo usaría. caveat emptor !!

Mientras tanto, veo que The_Photon ya está trabajando en esto.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas