¿cuál es la forma correcta de agregar un contador dentro del flip-flop?

1

Quiero contar el número de señales de "habilitación de reloj" dentro del flip flop.

Aprendo de los tutoriales que el valor de salida debe asignarse para todas las combinaciones de entrada.

Sin embargo, no sé cómo agregar un contador ese contador debería actualizarse solo si clk_enable = 1.

Por favor avise.

module count_ce (
  input logic reset_n, 
  input logic clk, 
  input logic clk_enable,
  output logic[63:0] counter
);

always_ff @(posedge clk or negedge reset_n) begin
  if (!reset_n) begin
    counter <= 64'd0;
  end else begin
    if (clk_enable) begin
      counter <= counter + 1;
    end else begin
      //counter <= counter; // ?
      counter <= 64'd0; // have to assign counter for else-case otherwise infer latch?
    end
  end
end

endmodule
    
pregunta Ken Tsang

3 respuestas

0

En este caso, do desea inferir un pestillo. Más correctamente, usted quiere inferir 64 flip-flops disparados por el borde. Dado que esa es su intención, no necesita realizar una acción para todos los casos de entrada, o puede usar la declaración donde el valor actual del contador se asigna nuevamente al contador.

    
respondido por el Elliot Alderson
0

Tu código le gusta razonablemente excepto:

  1. Usted no puede generar cierres en una declaración always_ff o @(pos/neg edge always. Como tal, puede / puede descartar toda la sección else .

  2. De hecho, aquí descartaría la sección else porque tan pronto como el clk_enable desaparece, tu contador se reinicia y tu cuenta se pierde.

  3. Su contador es de 64 bits, que es un poco grande. Limita tu velocidad máxima de funcionamiento. Incluso funcionando a 3GHz tardará unos 195 años en desbordarse.

  4. Simplemente parece un poco extraño tener el contador en marcha desde que se reinició y no poder borrarlo ni reiniciarlo.

respondido por el Oldfart
0
  

Aprendo de los tutoriales que el valor de salida debe asignarse para   Todas las combinaciones de entrada.

Esto es cierto para la lógica combinacional, pero ciertamente tiene la intención de implementar elementos secuenciales activados por el borde (flip-flops).

En caso de que utilice always_ff y / o posedge clk , no hay posibilidad de inferir los latches. Sin duda tendrás chanclas.

always_ff @(posedge clk or negedge reset_n) begin
  if (!reset_n)
    counter <= 64'd0;
  else begin
    if (clk_enable)
      counter <= counter + 1;
  end
end

El bloque always anterior es seguro incluso si no hay una condición else . counter aumentará si clock_enable es ALTO, conservará su valor si clock_enable es BAJO.

El siguiente código tiene el mismo comportamiento, la parte else es simplemente redundante.

always_ff @(posedge clk or negedge reset_n) begin
  if (!reset_n)
    counter <= 64'd0;
  else begin
    if (clk_enable)
      counter <= counter + 1;
    else
      counter <= counter;
  end
end
    
respondido por el ahmedus

Lea otras preguntas en las etiquetas