Inferir D-latch en Zedboard dentro de Vivado Error

Estoy tratando de implementar un pestillo simple en un ZedBoard a través de Vivado.

begin
process(D,Enable) begin
   if(Enable = '1') then 
       Q <= D;
       Qbar <= not(D);
   end if;
end process;

Estoy usando E/S de usuario en las restricciones para las entradas/salidas. Asigno la entrada a dos pines SWITCH y las salidas a dos pines LED.

El enrutamiento (fase de implementación) me da el siguiente error:

[Lugar 30-574] Mala ubicación para el enrutamiento entre un pin IO y BUFG. Si esta condición subóptima es aceptable para este diseño, puede usar la restricción CLOCK_DEDICATED_ROUTE en el archivo .xdc para degradar este mensaje a ADVERTENCIA. Sin embargo, se desaconseja encarecidamente el uso de esta anulación. Estos ejemplos se pueden usar directamente en el archivo .xdc para anular esta regla de reloj. < establecer_propiedad CLOCK_DEDICATED_ROUTE FALSO [get_nets Enable_IBUF] >

Enable_IBUF_inst (IBUF.O) está bloqueado en IOB_X1Y125 y Enable_IBUF_BUFG_inst (BUFG.I) está colocado provisionalmente por clockplacer en BUFGCTRL_X0Y31`

Las dos soluciones sugeridas para el problema están aquí y configurando los < set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets Enable_IBUF] >trabajos, pero me gustaría entender la solución 1 1) Move the clock input to a clock capable pin.ya que parece importante.

¿Cómo puedo encontrar una entrada con capacidad de reloj que pueda presionar/mover como lo hago en el interruptor?

Editar: Enlace de los pines de ZedBoard (ya probé C19 -> FMC_CLK1)

Respuestas (2)

Lo que sucede aquí es que las herramientas interpretan su señal Habilitar como un reloj. (Puede ver su diseño implementado en la herramienta para verificar esto). Si intenta diseñar alguna lógica asíncrona, las herramientas generalmente se esfuerzan mucho por encontrar un reloj, porque los modelos de tiempo FPGA asumen un sistema síncrono.

Entonces, recibe la advertencia CLOCK_DEDICATED_ROUTE porque las herramientas creen que la señal de habilitación es un reloj real. Si fuera un reloj real, querría usar los pines de reloj especiales en el FPGA que están directamente conectados a los recursos de enrutamiento del reloj. (Estos están etiquetados como MRCC y SRCC, para varias regiones y una sola región, respectivamente). Pero dado que sus señales provienen de conmutadores físicos, a los efectos de su experimento, el enrutamiento no ideal realmente no importa.

Una cosa que podría hacer es usar un pestillo Earle, que es una forma de pestillo D que usa un AND-OR con tres términos. Su herramienta de síntesis no debería reconocerlo como lógica secuencial (cronometrada). Consulte ¿Cómo puedo implementar un D-latch simple, solo Q, usando VHDL? .

Sin expresar un segundo pestillo para Qbar:

library ieee;
use ieee.std_logic_1164.all;

entity dlatch is
    port (
        D:      in  std_logic;
        Enable: in  std_logic;
        Q:      out std_logic;
        Qbar:   out std_logic
    );
end entity;

architecture fum of dlatch is
    signal QQ:   std_logic;
begin
    process(D, enable, QQ) 
    begin
        QQ <= (Enable and D) or 
              (not Enable and QQ) or
              (D and QQ);          -- consensus term
        Q <= QQ;
       Qbar <= not QQ;
    end process;
end architecture;

Esto debería ser elegible para síntesis.

Y aquí hay un banco de pruebas para determinar que los tres términos son correctos:

library ieee;
use ieee.std_logic_1164.all;

entity dlatch_tb is
end entity;

architecture test of dlatch_tb is
    signal D:       std_logic := '0';
    signal Enable:  std_logic := '0';
    signal Q:       std_logic;
    signal Qbar:    std_logic;

    component dlatch is
        port (
            D:      in  std_logic;
            Enable: in  std_logic;
            Q:      out std_logic;
            Qbar:   out std_logic
        );
    end component;

begin
DUT:
    dlatch
        port map (
            D => D,
            Enable => Enable,
            Q => Q,
            Qbar => Qbar
        );
STIM:
    process
    begin
        wait for 10 ns;
        Enable <= '1';
        wait for 10 ns;
        Enable <= '0';
        wait for 10 ns;
        d <= '1';
        wait for 10 ns;
        Enable <= '1';
        wait for 10 ns;
        Enable <= '0';
        wait for 10 ns;
        wait;
    end process;
end architecture;

Por otro lado "- No importa"

Estoy usando E/S de usuario en las restricciones para las entradas/salidas. Asigno las entradas a dos pines SWITCH y las salidas a dos pines LED.

y

¿Cómo puedo encontrar una entrada con capacidad de reloj que pueda presionar/mover como lo hago en el interruptor?

Si está utilizando interruptores para operar su pestillo, no debería preocuparse por el enrutamiento subóptimo y establecer la restricción 'CLOCK_DEDICATED_ROUTE en el archivo .xdc para degradar este mensaje a ADVERTENCIA' es perfectamente válido.

Es muy poco probable que pueda alternar ambos interruptores tan juntos que corre el riesgo de que se almacene el estado 'incorrecto' con cierto grado de certeza en qué orden se alternaron. Estamos hablando de enrutamiento subóptimo en el orden extremadamente cercano de un nanosegundo considerando la baja carga capacitiva.