pulso en el borde de un reloj diferente

5

Tengo un reloj que viene de un pin (GMI_CLK). Pasa a través de un PLL y se genera un nuevo reloj con 4 veces la frecuencia (Sys_CLK). Ahora necesito un pulso cada vez que se detecta un flanco ascendente del reloj original (Sys_valid).

Estofuncionaperfectoenlasimulación.Sehacodificadocomoseindicaacontinuación,peroambasformasgeneranerroresdurantelasíntesis:

make_clkvalid:process(sys_clk)variableGMI_CLK_alt:std_logic;beginifrising_edge(sys_clk)thenifGMI_CLK='1'andGMI_CLK_alt='0'thenSys_valid<='1';elseSys_valid<='0';endif;GMI_CLK_alt:=GMI_CLK;endif;endprocessmake_clkvalid;
  

Elpuerto[Synth8-5535]tieneconexionesilegales.Esilegaltenerunpuertoconectadoaunbúferdeentradayotroscomponentes.Lassiguientessonlasconexionesdepuerto:  Bufferdeentrada:      PuertoIdelainstanciaclkin1_ibufg(IBUF)enelmódulo  Otroscomponentes:      PuertoI1delainstanciai_43(LUT2)enelmóduloGMI_IO      PuertoI1delainstanciai_42(LUT2)enelmóduloGMI_IO      PuertoDdelainstanciaGMI_CLK_alt_reg__0(FD)enelmóduloGMI_IO      PuertoDdelainstanciaGMI_CLK_alt_reg(FD_1)enelmóduloGMI_IO

ocomoesto:

make_clkvalid:process(GMI_CLK,Sys_clk)beginifrising_edge(GMI_CLK)thenSys_valid<='1';elsiffalling_edge(Sys_clk)thenSys_valid<='0';endif;endprocessmake_clkvalid;
  

[Synth8-27]cláusulaelsedespuésdeverificarelrelojnocompatible[GMI_IO.vhd": 183]

¿Cómo puedo implementarlo para síntesis?

    
pregunta Botnic

1 respuesta

6

Tu segunda implementación falla debido a lo que es un error común. El patrón de código:

if rising_edge(clk_a) then
    signal_a <= '1';
elsif falling_edge(clk_b) then 
    signal_a <= '0';
end if;

No se puede realizar en hardware, ya que describe un registro de 1 bit con dos entradas de reloj diferentes. Dicho registro no existe en el tejido FPGA; el más cercano es un registro de salida DDR que puede estar presente, pero incluso esto está destinado a ser usado con un reloj y su inverso, no dos relojes totalmente separados.

El primer intento parece más sensato. Si pudiera incluir el mensaje de error que genera, actualizaré mi respuesta.

Ahora que agregó el mensaje de error, puedo ver que esto no tiene nada que ver con el fragmento de código que publicó. Aunque no se ha proporcionado el código relevante, creo que el error aquí es que tiene su entrada de reloj GMI conectada a un IBUFG, y también a la lógica de este módulo.

La causa más probable de esto es que ha creado su código PLL usando CoreGen. CoreGen colocará innecesariamente un búfer de reloj global entre un pin de entrada de reloj y una instancia de PLL / DCM. El resultado es que cuando conecta este mismo pin a otra cosa (es decir, a su circuito de detección de bordes), el diseño no se puede enrutar debido a la estructura del FPGA.

Para resolver esto, todo lo que tiene que hacer es eliminar la creación de instancias de BUFG del archivo .VHD que creó CoreGen, y luego conectar lo que fue la entrada a BUFG, a la entrada de la instancia de PLL / DCM. La síntesis insertará un búfer de reloj en el lugar apropiado para permitir que su diseño funcione.

Según el comentario de @TomCarpenter, si lo anterior resuelve su problema, hay una opción en CoreGen para establecer el búfer de entrada en "Ninguno". Esto evita modificar la salida de CoreGen, que podría atrapar a alguien más adelante.

Incluso mejor sería no usar CoreGen para algo tan simple como crear una instancia de un PLL; Si vas a Editar > Plantillas de idioma > VHDL > Dispositivo de instanciación primitiva > Spartan 6 (o lo que sea) > Los componentes del reloj en ISE (está en Ventana > Plantillas de idioma > etc en Vivado), puede encontrar plantillas simples para crear instancias de su PLL, sin la molestia / problemas de CoreGen (como el problema que ha visto).

    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas