Tengo un ADC que requiere que le envíe 20 pulsos de reloj cuando solicito leer datos de su registro interno (después de haberlo activado para leer datos de mi sensor).
Pude simular esto muy 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 como este:
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 en 1 en un posedge clk y otro que establece serial_out en 0 durante negedge clk, ambos verificando si el contador es mayor que 0. Esto es problemático porque estoy tratando de conducir contador en dos lugares y obtiene errores que indican "no se puede resolver el controlador constante múltiple 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 del posedge 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 enrute/reproduzca condicionalmente 20 pulsos de mi reloj de entrada periódico de 30 MHz siempre activo a un pin de salida?
Cualquier ayuda será apreciada.
Sugeriría usar un flip flop DDR de salida. La forma en que implemente eso depende de qué FPGA esté usando. Para Xilinx, sería una primitiva ODDR u ODDR2. Para Altera, es ALTDDIO_OUT.
'1'
→ transición alta, y '0'
después de una transición alta→baja).
Viejo pedo
alcanzador33