Comprender las restricciones de tiempo

No quiero un texto introductorio sobre las limitaciones de tiempo, ni una nota de aplicación, un manual de usuario, un seminario web. Los leí todos, ya, muchas veces. El concepto detrás de las restricciones de tiempo es muy sencillo. Aún así, cuando tengo que codificarlos en un archivo sdc, no puedo pasarlo. Tengo que pasar varios días intentando y fallando para que el software Quartus acepte mi diseño. Y estoy seguro de que muchos otros diseñadores de FPGA están sufriendo como yo.

¡Alguien por favor detenga esta agonía!

Intentemos con un ejemplo. Considere la siguiente entidad superior:

entity top is
    generic (
        W : positive := 8
    ) port (
        ser_data_in  : in  std_logic;                      -- Serial data in   
        ser_bclk_in  : in  std_logic;                      -- Bit clock in     
        ser_fclk_in  : in  std_logic;                      -- Frame clock in   
        par_data_in  : in  std_logic_vector(W-1 downto 0); -- Parallel data in 
        par_wclk_in  : in  std_logic;                      -- Word clock in    
        ser_data_out : out std_logic;                      -- Serial data out  
        ser_bclk_out : out std_logic;                      -- Bit clock out    
        ser_fclk_out : out std_logic;                      -- Frame clock out  
        par_data_out : out std_logic_vector(W-1 downto 0); -- Parallel data out
        par_wclk_out : out std_logic                       -- Word clock out   
    );
end entity;

Los datos en serie se transmiten en DDR, sincronizados por el reloj de bits (frecuencia = F), que está alineado en el centro. Los datos en serie también vienen con un reloj de cuadro, que se alinea en los bordes con el primer bit en serie (frecuencia = F/W). Los datos paralelos son SDR, sincronizados por el reloj de palabras (frecuencia = F/W), que está alineado en los bordes.

No entraré en detalles de SERDES, imaginemos que tengo un registro de desplazamiento simple que se desplaza con ser_bclk_in y transfiere sus datos a otro registro cada flanco ascendente de ser_fclk_in. Los datos deserializados funcionan de alguna manera con datos de entrada paralelos y el resultado se envía a ser_data_out y par_data_out. Naturalmente, el SERDES en la salida es especular a la entrada.

Mi pregunta es: para un sesgo máximo dado entre datos y relojes, ¿cómo limito dicho diseño? Dado que ya tengo todos los relojes que necesito, ¿puedo restringir con éxito este diseño sin usar PLL? ¿Es necesario declarar los caminos multiciclo? Si es así, ¿por qué?

PD: todavía estoy dispuesto a leer más sobre el tema, por lo tanto, si conoce algún texto inusualmente claro sobre las limitaciones de tiempo, compártalo también :)

La última vez que usé Quartus (hace muchos años, en la versión 9) había un bloque especial de "Megafunción" OpenLDI para LVDS SerDes. Aparentemente, en Altera Cyclone III, solo ciertas ubicaciones admiten LVDS. ¿Has mirado esta megafunción?
Sí lo hice, y no sin éxito. Las megafunciones también permiten crear instancias de PLL y restringir las entradas automáticamente. Mi pregunta es más general y quería que la respuesta a esta pregunta fuera una referencia de aprendizaje. No puedo creer que esto no se pueda explicar claramente de una vez por todas.
Todo depende de su frecuencia y qué tan preciso sea su reloj entrante, si está creando una interfaz DDR a baja frecuencia, entonces no necesita ningún PLL o muchas restricciones de tiempo, solo necesita identificar sus relojes y la herramienta lo hará. encárguese del resto, pero si tiene un reloj de alta velocidad, debe usar PLL, el resto de su pregunta es demasiado genérica para responder sin saber más sobre sus requisitos.

Respuestas (1)

  1. Abra TimeQuest Timing Analyzer eligiendo Herramientas > TimeQuest Timing Analyzer.

  2. Elija Archivo > Nuevo archivo SDC. Se abre el editor SDC.

  3. Escribe el siguiente código en el editor:

    create_clock -period 20.000 -name osc_clk osc_clk
    derive_pll_clocks
    derive_clock_uncertainty
    
  4. Guarde este archivo como my_first_fpga_top.sdc (vea la Figura 1–38).