Retrasando todas las señales entrantes en 2 ms usando VHDL

1

Tengo dos señales entrantes con las que quiero probar la coincidencia. Pero, primero quiero retrasar todas las señales de un canal en el período en el que se envían las señales (2 ms) y comparar la coincidencia de esta manera. Básicamente, quiero almacenar la información en tiempo real durante 2 ms y luego reproducirla tan pronto como termine de recopilar, y continuar este proceso una y otra vez. ¿Es esto factible usar un FPGA? Estaba pensando en usar uno de los siguientes:

outputA <= inputA after 2 ms; outputA <= inertial inputA after 2 ms; outputA <= transport inputA after 2 ms;

pero por lo que entiendo, ¿estos solo se usan para simulación? ¿Qué otro método sería mejor para lograr esa tarea? ¿Usando un registro de desplazamiento o algo similar?

editar:

En mi configuración, tengo dos detectores (módulos de conteo de fotones individuales) que convierten los fotones de luz en una señal digital (3.3V, aproximadamente 50 ns de ancho de pulso). Luego, las señales se envían a una placa Altera DE2, donde se prueban con puertas AND para ver si coinciden (tenga en cuenta que las señales se acortan de 50 ns a alrededor de 15 a 25 ns de antemano, con lógica interna y sin pérdida de tiempo). El reloj de esta placa funciona a 50 MHz, que tiene un flanco ascendente cada 20 ns. El láser envía un pulso cada 2 ms. Los conteos reales y los conteos de ruido aleatorios de estos detectores no siguen el reloj, por lo que no necesariamente compartirán un flanco ascendente o descendente exactamente el reloj de 50 MHz. Probar la coincidencia no es el problema que tengo, lo que debo hacer ahora es retrasar una de las señales por el período del láser y probar la coincidencia en ese momento. Debido a que el láser es muy lento, no es práctico retrasar la señal físicamente (requeriría alrededor de 1 km de fibra óptica). Por lo tanto, estoy tratando de hacer este retraso a través del mismo FPGA. Ahora para reformular mis preguntas:

(1) ¿Es posible mantener la precisión temporal (hasta muy pocos nanosegundos) al usar un búfer FIFO para retrasar una de las señales entrantes , o enviar las señales al búfer perderá eso? ¿Precisión y solo compartir los flancos ascendentes / descendentes con mi reloj? (¿Dice el búfer que el bloque de datos es totalmente cero o totalmente 1, dependiendo de si la señal estaba en estado alto o bajo en el borde ascendente del reloj cuando recopila los datos?)

(2) ¿Cómo podría comenzar a escribir código para un búfer de este tipo? ¿Es esto algo que puedo encontrar una copia en línea o podría haber algún "asistente de búfer" que pueda crear utilizando un programa VHDL como Quartus II? / p>     

pregunta Cody495

1 respuesta

1

Cualquier valor de tiempo no es sintetizable por un FPGA, porque un FPGA no es consciente del concepto "tiempo". En realidad, ningún circuito electrónico es consciente de nuestro concepto de tiempo. En las computadoras y tales bibliotecas específicas se desarrollaron para facilitar la programación con el tiempo.

Sin embargo, los dispositivos electrónicos síncronos, como un FPGA, suelen estar sincronizados: controlados por un oscilador. Este oscilador tiene un cierto período intrínseco: la frecuencia de reloj. Puede utilizar esta frecuencia para medir un cierto período de tiempo. Es decir. un oscilador de 50 MHz habrá oscilado 100000 veces en 2 ms.

Si desea retrasar una señal, deberá introducir memoria en el sistema, que contiene la información durante un período específico. En este caso 100000 ciclos de reloj. Tiene varias opciones allí, una de las cuales es una columna de 100000 registros de n bits. Sin embargo, el uso de registros FPGA separados es bastante ineficiente.

Otra solución sería utilizar una característica de los FPGA que se introdujo no hace mucho tiempo: es posible utilizar las LUT (tablas de consulta) como registros de desplazamiento. Esto es mucho más eficiente que el uso de registros separados. Sin embargo, en el caso de 100000 ciclos de reloj, es probable que esto no sea tan ineficiente.

De hecho, está creando un búfer FIFO (primero en entrar, primero en salir) con un retardo fijo. Al ver que la demora está en el lado más grande, es bastante común usar un bloque de RAM de doble puerto en este caso: en el lado A se escriben los datos de entrada en un bucle infinito y en el lado B se leen estos datos con una dirección de desplazamiento de 100000.

después de tu edición:

Ok, entonces parece que estás tratando de determinar el tiempo entre dos pulsos. Eso es algo diferente, y mucho más simple, que determina el cambio de tiempo de los datos. Esto se hace mucho en aplicaciones de radar y lidar, etc. El componente que hace eso es un convertidor de tiempo a digital . Simplemente determina el tiempo entre el pulso 1 (inicio) y el pulso 2 (detener), como lo hace un cronómetro.

Si desea determinar la hora con mayor precisión, es decir, con un intervalo de sub-reloj, le sugiero que mire la solución híbrida (es decir, el método de Nutt). Ese combina un contador simple con un interpolador a vernier. A. Aloisio et al. he sugerido una buena implementación de FPGA en "Implementación de FPGA de convertidor de tiempo a digital de alta resolución" (Espero que tengas acceso a IEEE).

    
respondido por el JHBonarius

Lea otras preguntas en las etiquetas