¿Hay alguna manera de escribir en FIFO en ambos bordes del reloj?

Estoy usando Lattice ECP3 FPGA, no encontré ninguna información al respecto en Internet. Tengo un ADC que me proporciona datos de 12 bits en ambos bordes del reloj, así que utilicé la interfaz de E/S de alta velocidad Lattice:ingrese la descripción de la imagen aquí

Esta interfaz bloquea los datos ADC en un bus de 24 bits que se compone de los datos del borde positivo (bits inferiores: 11:0) y el borde negativo de los datos (bits superiores: 23:12). mi próximo paso es transferir todos estos datos ADC al bloque FFT, el problema es que FFT necesita trabajar en los datos de 12 bits que provienen del ADC y no en los 24 bits, por lo que necesito separar los datos en 2 y enviarlos en cada flanco ascendente de registre otra mitad de los datos, y es importante no perder ninguna muestra.

Así que ya tengo un diseño que funciona, hice 2 FIFO, uno para los datos de borde positivo y el segundo para los datos de borde negativo, creé mux que cambia su estado cada reloj de borde ascendente, y cuando quiero leer los datos de los FIFO al Bloque FFT, tomo una muestra del 1er FIFO y la 2da muestra del 2do FIFO y así sucesivamente ... Tengo síntesis y depuración de trabajo:

ingrese la descripción de la imagen aquí

como puede ver, la entrada al bloque FFT (dire) obtiene adc_data_posedge/negedge_buff como se describe. pero tengo la fuerte sensación de que esta forma de implementación no es la forma correcta de hacer este diseño. Leí que usar 2 FIFO para el mismo bloque de entrada podría generar problemas de sincronización, etc.

Podría ser mejor si pudiera tomar el bus de datos ADC de 24 bits y escribir en 2 celdas del FIFO a la vez en el flanco ascendente del reloj. De esta manera, crearé FIFO de 12 bits de ancho y escribiré en 2 celdas a la vez y no necesitaré usar 2 FIFO. hay una forma posible de hacerlo?

otra forma de hacer mi pregunta es, supongamos que tiene que diseñar una arquitectura que tome datos DDR ADC y los almacene en el FIFO y luego use la salida FIFO como entrada al bloque FFT. ¿como lo harias?

ingrese la descripción de la imagen aquí

Necesita un reloj 2x dentro de su FPGA. O bien, convierta los datos DDR a SDR con un par de registros (la mayoría de los FPGA tienen tales registros integrados en los IOB), duplicando el ancho y usando un solo FIFO que también es el doble de ancho.
ok gracias pero eso ya lo hice. Utilicé la interfaz de E/S de alta velocidad de Lattice (GDDRX1) que tomó los datos ddr de 12 bits del adc y los almacenó en un bus de 24 bits que puedo usar ahora. desde aquí no es un problema crear FIFO de 24 bits de ancho y almacenar allí esta fecha. PERO necesito usar el bus de 24 bits dos veces por ciclo de reloj porque en este bus de 24 bits se almacenan 2 datos de muestra (12 msb bits y 12 lsb). ¿Cómo puedo hacerlo sin usar el reloj 2x?
no puedes O necesita una FFT que acepte dos muestras por reloj, o solo puede transferir datos a la FFT a la mitad de la velocidad del ADC.
bueno, gracias. por lo que la forma de onda que adjunté en la publicación es una forma aceptable de hacerlo por lo que entiendo. (Lattice FFT IP no acepta dos muestras por reloj)
No, no si entiendo correctamente lo que estás haciendo. Parece que está creando otra secuencia DDR en la salida de los FIFO, que seguramente no será compatible con su FFT a menos que tenga un reloj 2x. ¿ Qué significa exactamente "Ya tengo un diseño que funciona" ?
Mire las formas de onda ... Estoy usando solo el borde ascendente del reloj, y con un mux estoy bloqueando los datos de 2 FIFO uno por uno (primera muestra de la primera FIFO, segunda muestra de la segunda FIFO y así sucesivamente). Hace el trabajo, envío todas estas muestras a FFT y de allí a CORDIC, en la salida de CORDIC puedo ver el espectro. (el problema es que el diseño funciona desde -45dBm +, cuando estoy proporcionando onda con -40dBm, la salida CORDIC no está dando buenos resultados... pero creo que tal vez se deba a la resolución del bloque FFT) Agregué una imagen de Matlab con los datos que llegan a la entrada FFT y la salida CORDIC.

Respuestas (1)

Mi primera inclinación sería sincronizar dos FIFO, cada uno trabajando en un borde de reloj diferente, y agregar circuitos adicionales para garantizar que permanezcan sincronizados. Un segundo enfoque sería XOR la ​​señal del reloj con una versión retrasada de sí mismo, esencialmente generando un pulso en cada borde del reloj. Sin embargo, si no tiene un reloj más rápido disponible, será un retraso asincrónico, por lo que debe asegurarse de satisfacer su configuración y tiempos de espera en todas las condiciones.