Tengo dos señales entrantes entre las que quiero probar la coincidencia. Pero primero quiero retrasar todas las señales de un canal por 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 recopilarse, y continuar este proceso una y otra vez. ¿Es esto factible usando 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(s) método(s) sería(n) mejor(es) para lograr tal 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,3 V, aproximadamente 50 ns de ancho de pulso). Luego, las señales se envían a una placa Altera DE2, donde se prueban con compuertas AND para detectar coincidencias (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 recuentos reales y los recuentos de ruido aleatorio de estos detectores no siguen ningún 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 luego probar la coincidencia. Debido a que el láser es tan lento, no es práctico retrasar la señal físicamente (requeriría alrededor de 1 km de fibra óptica). Entonces, estoy tratando de hacer este retraso a través del propio FPGA. Ahora para reformular mis preguntas:
(1) ¿Es posible mantener la precisión temporal (hasta muy pocos nanosegundos) cuando se usa un búfer FIFO para retrasar una de las señales entrantes , o el envío de las señales al búfer perderá esa precisión y solo compartirá flancos ascendentes/descendentes con mi ¿reloj? (¿El búfer dice que el bloque de datos es completamente cero o completamente 1, dependiendo de si la señal estaba en un estado alto o bajo en el flanco ascendente del reloj cuando recopila los datos?)
(2) ¿Cómo comenzaría a escribir código para dicho búfer? ¿Es algo de lo que pueda encontrar una copia en línea o habría algún "asistente de búfer" que pueda crear usando un programa VHDL como Quartus II?
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 del tiempo. En computadoras y este tipo de bibliotecas específicas se desarrollaron para facilitar la programación con el tiempo.
Sin embargo, la electrónica síncrona, como un FPGA, generalmente está sincronizada: impulsada 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 conserva 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, usar registros FPGA separados es bastante ineficiente.
Otra solución sería usar una característica de los FPGA que se introdujo no hace mucho tiempo: es posible usar los LUT (tablas de búsqueda) como registros de desplazamiento. Esto es mucho más eficiente que usar 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 retraso fijo. Al ver que la demora es mayor, es bastante común usar un bloque de RAM de doble puerto en este caso: en el lado A, escribe los datos de entrada en un bucle infinito y en el lado B lee estos datos con un desplazamiento de dirección de 100000.
después de su edición:
Bien, parece que estás tratando de determinar el tiempo entre dos pulsos. Eso es algo diferente -y mucho más simple- que determinar el cambio de tiempo de los datos. En realidad, 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 (parada), como lo hace un cronómetro.
Si desea determinar el tiempo con mayor precisión, es decir, con un intervalo de período inferior al reloj, le sugiero que consulte la solución híbrida (es decir, el método Nutt). Ese combina un contador simple con un interpolador vernier. A. Aloisio et al. han sugerido una buena implementación de FPGA en "Implementación de FPGA de convertidor de tiempo a digital de alta resolución" (espero que tenga acceso a IEEE).
el fotón
usuario3528438
Spehro Pefhany
TonyM
Cody495
Cody495
bruce abbott
Cody495
chris stratton
chris stratton
deserializer
bloque funcional para dividir una señal de 1 bit de alta velocidad en una señal de baja velocidad más ancha y almacenarla a una velocidad más moderada en una memoria de muchos bits de ancho. Cuando examina el búfer en su tiempo libre, el momento en que sucedió algo es la dirección de la palabra multiplicada por el ancho de la palabra, más la posición del bit en la palabra, todo multiplicado por el gigahercio o cualquier intervalo de muestra.JHBonarius
chris stratton
Cody495
chris stratton