5 votos

Pulso en el borde de reloj diferentes

Tengo un reloj que viene de un pin (GMI_CLK). Pasa a través de un PLL y un nuevo reloj con 4 veces la frecuencia es generada (Sys_CLK). Ahora necesito un pulso cada vez que un flanco de subida del reloj original es detectada (Sys_valid). enter image description here

Esto funciona perfecto en la simulación. Se ha codificado como seguido, pero de las dos formas de generar errores durante la síntesis:

make_clkvalid: process(sys_clk)
    variable GMI_CLK_alt : std_logic;
begin
    if rising_edge(sys_clk) then
        if GMI_CLK = '1' and GMI_CLK_alt = '0' then
            Sys_valid <= '1';
        else
            Sys_valid <= '0';
        end if;

        GMI_CLK_alt := GMI_CLK;

    end if;
end process make_clkvalid;

[Sintetizador 8-5535] puerto tiene conexiones ilegales. Es ilegal tener un puerto conectado a un buffer de entrada y otros componentes. Las siguientes son las conexiones de los puertos : Búfer De Entrada: Del puerto de la instancia de clkin1_ibufg(IBUF) en el módulo Otros Componentes: Puerto I1 de instancia i_43(LUT2) en el módulo GMI_IO Puerto I1 de instancia i_42(LUT2) en el módulo GMI_IO Puerto D de instancia GMI_CLK_alt_reg__0(FD) en el módulo GMI_IO Puerto D de instancia GMI_CLK_alt_reg(FD_1) en el módulo GMI_IO


o como esta:

make_clkvalid: process(GMI_CLK, Sys_clk)
begin
    if rising_edge(GMI_CLK) then
        Sys_valid <= '1';
    elsif falling_edge(Sys_clk) then 
        Sys_valid <= '0';
    end if;
end process make_clkvalid;

[Sintetizador 8-27] cláusula else después de comprobar el reloj no se admite [GMI_IO.vhd":183]


¿Cómo puedo aplicar para la síntesis?

6voto

Rob Donnelly Puntos 108

Su segunda aplicación falla porque de 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 puede ser realizada en hardware, porque describe un 1 bit de registro con dos diferentes entradas de reloj. Dicho registro no existe en la FPGA de la tela; el más cercano es un DDR de salida del registro que pueden estar presentes, pero incluso esto está destinado a ser utilizado con un reloj y su inversa, no son dos cosas totalmente separadas de los relojes.

El primer intento parece más sensato. Si se puede incluir el mensaje de error que se genera, voy a actualizar mi respuesta.


Ahora que ha agregado el mensaje de error, puedo ver que esto no tiene nada que ver con el fragmento de código que has publicado. Aunque el código no ha sido facilitada, creo que el error aquí es que usted tiene su GMI entrada de reloj conectado a un IBUFG, y también a la lógica en este módulo.

La causa más probable de esto es que han creado su PLL código utilizando CoreGen. CoreGen le innecesariamente lugar mundial reloj buffer entre un reloj pin de entrada y un PLL/DCM instancia. El resultado es que al conectar este mismo pin para algo más (es decir, su borde circuito de detección), el diseño no puede ser enrutado a causa de la estructura de la FPGA.

Para solucionar esto, todo lo que tienes que hacer es quitar el BUFG la creación de instancias de la .Archivo VHD que CoreGen creado y, a continuación, conectar lo que era la entrada a la BUFG, a la entrada del PLL/DCM instancia. La síntesis se inserte un reloj de búfer en el lugar apropiado para permitir el diseño de trabajo.

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

Aún mejor sería no utilizar CoreGen para algo tan simple como crear una instancia de un PLL, Si vas a Editar > Plantillas de Idioma > VHDL > Dispositivo Primitivo de la creación de instancias > Spartan 6 (o lo que sea) > Reloj Componentes en ISE (en Ventana > Plantillas de Idioma > etc en Vivado), usted puede encontrar plantillas sencillas para crear instancias de su PLL, sin las dificultades / problemas de CoreGen (tales como el problema que he visto).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X