Sincronización de señales con relojes globales en FPGA / CPLD y detección de bordes

3

Soy un novato en diseño de lógica digital y estoy tratando de entender cómo sincronizar las señales externas con el reloj global en un FPGA. Por ejemplo, la señal / reloj SCK alimentado a un FPGA por el SPI Master. Entiendo que esto se puede hacer de la siguiente manera en VHDL (código tomado de enlace )

entity SyncClocks is
port( SCK   :   in std_logic;
        CLK :   in  std_logic;
        rise    :   out std_logic;
        fall    :   out std_logic);
end SyncClocks;

architecture RTL of SyncClocks is
begin
    sync1: process(CLK)
        variable resync : std_logic_vector(1 to 3);
            begin
                if rising_edge(CLK) then
                    rise <= resync(2) and not resync(3);
                    fall <= resync(3) and not resync(2);
                    resync := SCK & resync(1 to 2);
                end if;
            end process;
end architecture;

Simulando los resultados anteriores en:

Ahoraséporquélasseñalesdesubida/caídaseretrasandosrelojes,porqueSCKpasapordosflip-flops.TambiénmehandichoqueesmejoractuarsobreestasseñalesdeascensoydescensoquesobrelapropiaseñalSCK.Mipreguntaes:¿esteretrasodedoshorasnoafectarealmentelaformaenquesetransfierenlosdatos?SupongamosquetengounmicrocontroladoractuandocomoSPIMasteryhablandoconmiFPGA,queesunSPISlave.EstánoperandoenelmodoSPI0.Además,supongamosqueelFPGAnecesitatransferiralgunosdatosalmicrocontrolador.

TanprontocomoelniveldeSSbaje,elmicrocontroladoresperaráunpocodepresenciaenlalíneaMISO,quesemuestrearáenelbordeascendentedeSCK.CuandoSCKcae,elFPGAtienequecambiarotrobitalalíneaMISO,peroelFPGAesperadosciclosderelojdebidoanuestrasincronización.ydeteccióndebordes.Enotraspalabras,nosedesplazarárealmentehaciaelbordedescendentedeSCK,sedesplazarácuandolaseñal"Caída" sea "1" en el ejemplo anterior.

¿Esto no causará problemas en el extremo del microcontrolador? Obviamente, el microcontrolador no tiene conocimiento de Rise / Fall y es posible que el reloj se ejecute de forma completamente independiente a una frecuencia diferente.

He intentado pensar en esto y me parece que el problema no se producirá si la señal SCK es lenta en comparación con el reloj global. Esto se debe a que, aunque hay un retraso, no importa porque el FPGA se desplazará un poco 'lo suficientemente rápido', es decir, antes de que SCK aumente. ¿Qué tan equivocado estoy?

    
pregunta Saad

2 respuestas

3

El diseño de su FPGA está utilizando la señal caída para registrar los datos en MISO. Pero es probable que esté usando rise para registrar datos desde MOSI. El microcontrolador hará lo mismo. Sabe que el borde descendente de SCLK le está diciendo al esclavo que cambie la línea MISO, por lo que no registrará esos datos hasta el borde ascendente de SCLK. Debe asegurarse de que su reloj FPGA sea lo suficientemente rápido para que, incluso con dos relojes demorados en detectar el flanco descendente, presentará datos válidos al microcontrolador en el momento del flanco ascendente.

Esta disposición no solo le da a su dispositivo esclavo un margen de maniobra en la rapidez con la que responde a SCLK, sino que también permite cierta incertidumbre acerca de si los cables o cables SCLK o MISO tienen la misma longitud. Al muestrear MISO a la mitad de su período válido, permite que el retardo de transmisión SCLK sea más largo o más corto que el retardo de transmisión MISO. Otra forma de decir esto es que el receptor SPI está diseñado con tiempos de configuración y retención equilibrados.

Esto es diferente de la forma en que normalmente organiza la transferencia de datos entre puertas en su FPGA. Allí, tus flip-flops generalmente tienen cero tiempo de espera. Es decir, registran los datos antiguos en el mismo borde cuando el flip-flop ascendente está cambiando su estado de salida. Pueden hacerlo retrasando sus entradas de datos solo un poco más que sus entradas de reloj, y es una disposición que generalmente brinda las mejores velocidades de reloj máximas posibles y al mismo tiempo es relativamente fácil garantizar la sincronización con herramientas automatizadas.

El arreglo equilibrado de configuración y retención en SPI no puede alcanzar las mismas altas velocidades de reloj que las interfaces dentro del FPGA, pero tampoco requiere un manejo cuidadoso de los retrasos de propagación entre el remitente y el receptor .

    
respondido por el The Photon
1

Creo que lo tienes bien. Si su reloj global es lo suficientemente rápido, puede hacer que funcione como lo ha descrito, la respuesta de The Photon describe cómo esto es posible debido a la forma en que se relacionan el reloj SPI y los datos.

Para evitar esta limitación, puede ejecutar la lógica SPI con la velocidad de reloj de sclk. Luego manejar el cruce de dominio con los datos paralelos. Como siempre, tenga cuidado de cruzar dominios con los datos paralelos.

¿Eso tiene sentido?

    
respondido por el davidd

Lea otras preguntas en las etiquetas