Estoy pensando en un diseño y tengo dudas sobre el cronometraje. ¿Qué es mejor? ¿Creo diferentes relojes o creo habilitaciones de reloj y solo uso uno? ¿Cuál es la mejor opción en términos de recursos? ¿Qué es más reutilizable?
¡Gracias!
Estoy pensando en un diseño y tengo dudas sobre el cronometraje. ¿Qué es mejor? ¿Creo diferentes relojes o creo habilitaciones de reloj y solo uso uno? ¿Cuál es la mejor opción en términos de recursos? ¿Qué es más reutilizable?
¡Gracias!
Hay diferentes razones por las que alguien quiere / necesita tener diferentes relojes en un diseño. La mayoría de las veces trato de mantener todo mi diseño funcionando con el mismo reloj.
Al trabajar con varios relojes, hablamos de diferentes dominios de reloj. Cada señal tiene su dominio de reloj de casa. Las herramientas de enrutamiento necesitan estos dominios de reloj para encontrar un diseño que cumpla con el tiempo (= retraso máximo aceptable).
Si una señal se cruza de un dominio de reloj a otro, se recomienda utilizar alguna lógica de cruce para evitar problemas como la metastabilidad. La mayoría de las veces, esto se hace mediante FIFOs o Dual-port-BRAM. (Más información sobre este tema se puede encontrar aquí: enlace )
A menudo, las interfaces externas están controladas por sus propios relojes. En estos casos no podemos evitar tener diferentes dominios de reloj. Use el reloj de la interfaz para muestrear los datos y tal vez realice un procesamiento previo y luego migre los datos al reloj del sistema.
Habilita el reloj: en los diseños de FPGA, el reloj habilita el uso de relojes cerrados y debe evitarse por todos los medios. Los relojes se enrutan en redes especiales. Esta infraestructura de reloj se encarga de entregar la señal de reloj a cada puerta al mismo tiempo. Después de agregar la lógica en la ruta del reloj (por ejemplo, una habilitación), la señal del reloj se enrutará en las rutas de señal normales. El proceso de ubicación y ruta tendrá dificultades para asegurarse de que se cumplan todos los requisitos de tiempo. Mejor que habilitar el reloj, sería hacer una entrada HABILITAR en su lógica. El reloj permanece intacto, pero la lógica sabe si tiene que reaccionar o no. En VHDL esto se vería así:
enable_example: process(clk_C)
begin
if rising_edge(clk_C) then
if enable_DI = '1' then
<< write your logic here>>
end if;
end if;
end process enable_example;
Recursos: en términos de recursos necesitamos especificar un poco qué tipo de recursos. Hay principalmente 3 tipos de recursos de los que podríamos hablar:
Usar el reloj habilita y hacer que la velocidad de datos independiente del reloj FPGA sea más eficiente en términos de recursos.
Si tiene diferentes dominios de reloj, necesitará una gran cantidad de IP de cruce de dominio de reloj (dependiendo de cuántos puntos de conexión haya). Esto normalmente será FIFOs. En el lado más rápido de la cola, el control de flujo es necesario de todos modos.
El circuito para habilitaciones de resistencia a fallas generalmente está presente en cada registro FPGA, así que úselo. El uso de un estándar como Avalon ST fomenta las buenas prácticas de diseño. El cableado para la señalización válida y rdy utiliza recursos de enrutamiento adicionales, pero tendrá menos impacto que una gran cantidad de FIFO.
Hay una excepción notable: si su diseño se interconecta con la lógica fuera del chip con transferencia de datos síncrona (como un ADC que da un valor en cada reloj), es común tener una pequeña isla de su diseño funcionando en ese reloj externo. Mantenga esa isla lo más pequeña posible e inserte un FIFO para adaptarse al dominio de reloj FPGA.