¿Cómo redirigir / regenerar un reloj de entrada a un pin de salida en mi diseño FPGA (Verilog)

0

Tengo un ADC que requiere que le envíe 20 pulsos de reloj cuando solicito leer datos de su registro interno (después de haberlos activado para leer datos de mi sensor).

Pude simular esto perfectamente bien en ModelSim, pero soy nuevo en Verilog y no me di cuenta de que tendría problemas durante la síntesis al crear el tren de pulsos de esta manera:

reg [4:0] counter = 5'b10100;
parameter counter = 0;

always (posedge clk and negedge clk) 
  begin
   if (counter > 0)
     begin
       counter <= counter - 1;
       serial_out <= ~serial_out; 
     end
  end

Intenté dividir esto en 2 bloques siempre: uno que establece serial_out a 1 en un campo de posición y otro que establece serial_out en 0 durante el tiempo de espera, ambos verificando si el contador es mayor que 0. Esto es problemático porque soy intentar conducir contador en dos lugares y obtener errores que indiquen que "no se pueden resolver varios controladores constantes para el contador neto".

Quizás hay una mejor manera de hacer esto?

He visto algunas publicaciones que sugieren duplicar la frecuencia de clk para leer los datos en el reloj del reloj. Esto funcionaría, pero necesito mantener el reloj a 30 MHz (no puedo ir a 60 MHz por otras razones).

¿Cómo sugeriría que condicione / replique condicionalmente 20 pulsos de mi reloj de entrada periódico de 30 MHz siempre activo a un pin de salida?

Cualquier ayuda será muy apreciada.

    
pregunta reacher33

1 respuesta

1

Yo sugeriría usar una salida DDR flip flop. Cómo implementas eso depende de qué FPGA estés usando. Para Xilinx, sería una primitiva ODDR u ODDR2. Para Altera, es ALTDDIO_OUT.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas