Retraso de todas las señales entrantes por 2 ms usando VHDL

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?

¿Tiene un reloj de 0,5 kHz, sincronizado con sus datos, disponible?
¿Cuál es su tasa de datos o tasa de muestreo?
¿Cuántos bits en su registro de desplazamiento y cuál será la frecuencia del reloj?
Las asignaciones retrasadas en VHDL son puramente una conveniencia proporcionada en la simulación. Recuerde que VHDL no es un lenguaje de programación para ejecutar instrucciones en una CPU, sino un lenguaje descriptor para diseñar circuitos lógicos digitales, como lo hace un diagrama de circuito. Entonces, debe imaginar el circuito lógico digital que puede producir su operación de retardo, luego escribir el VHDL para implementar ese circuito. El registro de desplazamiento que se ejecuta desde un circuito divisor que produce una habilitación de desplazamiento parece sensato. Recuerde, no haga un reloj dividiendo su reloj lógico, haga una habilitación. Espero que su experiencia lo haga familiar.
Tengo un reloj interno de 50 MHz y no estoy seguro de los bits en el registro de desplazamiento. ¿Es algo que está limitado por el hardware o algo que programa? ¿Y por qué no divides un reloj lógico? Soy relativamente nuevo en la programación de vhdl, por lo que mi experiencia es limitada. Voy a buscar en la creación de una habilitación ahora.
Mi láser envía un pulso cada 2 ms, pero el detector que usamos también envía señales accidentales entre ese período.
"Quiero probar la coincidencia": qué tan cerca quiere 'probar' la coincidencia, es decir. ¿Qué resolución de tiempo quieres?
Los pulsos entrantes tienen un ancho de 50 ns, pero primero se acortan internamente a 5-15 ns antes de usar puertas lógicas AND para probar la coincidencia.
No, un retraso de tipo FIFO no ofrecerá una resolución de tiempo más fina que el intervalo del reloj. A menos que pueda redefinir su necesidad, es probable que requiera técnicas bastante "exóticas". Parece que se encuentra en un entorno académico o de investigación formal, ¿quizás tiene experiencia local en instrumentación con la que podría discutir todo el experimento? Bien puede haber una forma de rediseñarlo que haga que la medición se ajuste mejor a las tecnologías disponibles.
La existencia de osciloscopios de gigasample de precio medio puede ofrecer una pista; sus datos parecen no ser realmente analógicos, pero parte de cómo funcionan es multiplexando la ruta rápida, es decir, puede usar un deserializerbloque 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.
Por favor, mira mi respuesta actualizada.
¿Quiere retrasar un solo evento bien definido, o quiere retrasar un montón de ruido en algún lugar dentro del cual se esconde su señal? La idea del deserializador puede hacer cualquiera de las dos cosas, pero para un solo evento puede haber esquemas más simples.
@ChrisStratton Quiero retrasar un montón de ruido con la señal en algún lugar escondido dentro. En su comentario anterior, ¿está sugiriendo usar un reloj externo más rápido?
Busca SERDES. Solo necesita el deserializador, en esencia, si divide un flujo rápido en 8 bits paralelos, puede construir un FIFO de gigasample a partir de la memoria que se ejecuta solo una octava vez más rápido. Eso es en concepto, habrá detalles prácticos para resolver ya que no tiene una interfaz de comunicación estándar como fuente. O tal vez la resolución de 8 ns sea suficiente, y puede usar dicha memoria directamente. En algún lugar hay una combinación de técnicas y velocidades tecnológicas que deberían hacer lo que tú quieres.

Respuestas (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 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).

un reloj de 50 MHz en realidad tiene 100 000 flancos ascendentes en 2 ms, ¿seguirá siendo factible este gran tamaño utilizando un bloque de RAM de doble puerto?
@ Cody495 100k no suena grande para una RAM, ¿verdad? Si realmente desea conservar todos los datos, no tiene otra opción. ¿Pero realmente estás muestreando a 50 MHz? Deberías explicar mejor tu problema. Por ejemplo, ¿qué es "la señal"?
He editado mi publicación original, espero que esta explicación sea más útil.
En una medida muy limitada, el "valor del tiempo" en realidad es sintetizable, no desde el HDL en sí mismo, sino en términos de restricciones mínimas y máximas que se pueden colocar para la etapa posterior de lugar y ruta. El software tiene un modelo del rendimiento de la FPGA e intenta encontrar un camino que satisfaga la necesidad. Pero esto no va a ofrecer ninguna solución obvia al aparente problema de la pregunta.
@ChrisStratton es cierto, aunque la FPGA todavía no conoce el concepto de "tiempo" usando eso. La herramienta de síntesis, lugar y ruta lo resuelve por ti. Además, como dijiste: 2 ms es inalcanzable de esa manera.
Todavía creo que no me quedó claro, no necesito ayuda para contar las coincidencias (¡aunque los enlaces que proporcionaste son interesantes!), Necesito ayuda para retrasar una de las señales en 2 ms. Hice una edición más para aclarar.
@ Cody495 luego solo use el bloque de RAM. O tener dos generadores de datos, generando los mismos datos con un desfase de tiempo.
@JHBonarius ¿Cómo haría entonces para escribir el código para usar la memoria RAM bock? Como pregunté anteriormente, ¿es solo un código estándar que encuentro en línea o uso un asistente para crear?
@ Cody495 lea las pautas de codificación del fabricante sobre cómo instanciar un bloque de RAM