FPGA de 50 MHz (Cyclone IV @ DE0-Nano) y entrada de 60 MHz desde el FT2232H

0

Quiero leer los datos de FT2232H utilizados en un modo FIFO síncrono de estilo FT245 ( enlace p.27) con placa DE0-Nano FPGA:

process(clk)
begin    
    if (rising_edge(clk)) then
        next_state <= current_state;

        case current_state IS
            when POLL_UNTIL_RXF_LOW =>
                if (rxf = '0') then
                    current_oe <= '0';
                    next_state <= WAIT_SET_RD_LOW;
                else
                    current_oe <= '1';
                end if;
                current_rd <= '1';

            when WAIT_SET_RD_LOW =>
                current_oe <= '0';
                current_rd <= '1';
                next_state <= SET_RD_LOW;

            when SET_RD_LOW =>
                current_oe <= '0';
                current_rd <= '0';                    
                next_state <= READ_DATA;

            when READ_DATA =>        
                if (rxf = '0') then
                    current_oe <= '0';
                    current_rd <= '0';

                    -- access data here
                else
                    current_oe <= '1';
                    current_rd <= '1';                        
                    next_state <= POLL_UNTIL_RXF_LOW;
                end if;

            when others =>
                null;
        end case;
    end if;
end process;

rd <= current_rd;
oe <= current_oe;

siwu <= '1';
wr <= '0';

Este código no funciona bien: aproximadamente el 51% de mis datos se pierden. Creo que esto está sucediendo porque clk en este código es un reloj de 60 MHz provisto por FT2232H; sin embargo, el DE0-Nano tiene un oscilador integrado de 50 MHz conectado directamente a uno de los pines del reloj FPGA. ¿Es posible leer datos de 60 MHz con FPGA con reloj de 50 MHz en absoluto? ¿Cómo lo haces?

    
pregunta themylogin

1 respuesta

3

Esto debería ser posible con un diseño cuidadoso.

Primero, como @Qui dice que debes generar una señal de reloj sincronizada dentro de tu FPGA a 60 MHz para permitirte leer los datos.

  1. Cree un PLL que se bloquee con la señal de reloj proporcionada por su FT2232 y emita un reloj de 60 MHz en una fase de 0 (sincronizado). El reloj FT2232 debe estar conectado a un pin de entrada con capacidad de reloj (consulte pinout del dispositivo y DE0-Nano manual del usuario para encontrar los pines).
  2. Use esta señal de reloj como el reloj lógico para todo el código que lee las líneas de datos hacia y desde el FT2232. Esto está en el dominio del reloj A.
  3. Escriba alguna lógica que observe el pin locked del PLL. Esto indica que el PLL se ha sincronizado correctamente. No debe intentar comunicarse con el FT2232 antes de los bloqueos de PLL.

Luego, puedes leer tus datos como lo has estado, ¡espero que con más éxito!

Luego tiene dos opciones para usar los datos, puede usar la salida PLL de 60 MHz para el resto de su lógica (simple) o mover los datos recibidos a través de un límite de dominio de reloj y procesarlos con Lógica sincronizada a tu reloj de 50 MHz. En el primer caso, siga adelante, pero si necesita usar los 50 MHz, siga leyendo.

Si necesita que sus señales se usen en el dominio de reloj de 50 MHz (dominio de reloj B), debe tener mucho cuidado al cruzar el límite del dominio de reloj o el mismo problema ocurrirá como ya ha experimentado (eso es efectivamente lo que Tú lo estás haciendo). En general debes

  1. Separe su lógica para que sepa exactamente qué partes del diseño están en qué dominio de reloj.
  2. Defina las señales que van a cruzar de una sección a la otra (A a B y B a A). Si puede, haga que las señales sean relativamente bajas (en comparación con cualquiera de los relojes), por ejemplo, transfiriendo una palabra completa a la vez en lugar de en serie.
  3. Sincronice cualquier señal que cruce el límite al nuevo dominio de reloj. Se requiere la sincronización para evitar metastability . El uso de un FIFO de doble puerto es probablemente la forma más sencilla y confiable. Consulte esta pregunta y este uno.
  4. Simule la lógica de cada dominio de reloj por separado con entradas ficticias para asegurarse de que funcionen antes de probarlas juntas.
  5. Simule todo el diseño para asegurarse de que funcione en el simulador.
  6. Defina cuidadosamente sus restricciones de tiempo antes de sintetizar el diseño, si lo hace bien, las herramientas deberían detectar problemas con los límites del reloj.
  7. Sintetizar y probar. Un buen osciloscopio de ancho de banda alto (150 MHz +) ayudará mucho a depurar las señales de los pines de prueba cuando se trata de ver si los relojes y las señales están sincronizados correctamente.

Desafortunadamente, no puedo ayudarte mucho con la última parte ya que no uso las herramientas de Altera.

    
respondido por el Xcodo

Lea otras preguntas en las etiquetas