Inferir D-latch en Zedboard dentro de un error de Vivado

0

Estoy intentando implementar un cierre 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 la E / S del usuario en las restricciones para las entradas / salidas. Asigno el inpus a dos pines SWITCH y las salidas a dos pines LED.

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

  

[Place 30-574] Mala ubicación para enrutar 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 una ADVERTENCIA. Sin embargo, el uso de esta anulación es altamente desaconsejable. Estos ejemplos se pueden usar directamente en el archivo .xdc para anular esta regla de reloj.       < set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets Enable_IBUF] >

     

Enable_IBUF_inst (IBUF.O) está bloqueado en IOB_X1Y125        y enable_IBUF_BUFG_inst (BUFG.I) es colocado provisionalmente por clockplacer en BUFGCTRL_X0Y31 '

Las dos soluciones sugeridas para el problema son aquí y configurar el < set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets Enable_IBUF] > funciona pero lo haría 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 ZedBoard (ya probé C19 - > FMC_CLK1)

    
pregunta João Pereira

2 respuestas

1

Lo que está sucediendo aquí es que las herramientas interpretan su señal de Habilitación 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 intentan encontrar un reloj, porque los modelos de temporización FPGA asumen un sistema síncrono.

Por lo tanto, está recibiendo la advertencia CLOCK_DEDICATED_ROUTE porque las herramientas creen que la señal de habilitación es un reloj real. Si se tratara de un reloj real, desearía usar los pines especiales del reloj en el FPGA que están conectados directamente a los recursos de enrutamiento del reloj. (Estos están etiquetados como MRCC y SRCC, para multi-región y región única, respectivamente.) Pero como sus señales provienen de interruptores físicos, para los fines de su experimento, el enrutamiento no ideal no importa realmente.

    
respondido por el mng
1

Una cosa que podrías hacer es usar un cierre Earle, que es una forma de cierre D que usa un AND-OR con tres términos. Su herramienta de síntesis no debe reconocerlo como una lógica secuencial (sincronizada). Consulte cómo ¿Puedo implementar un simple, solo Q, D-latch 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 si 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 otra parte, "- No importa"

  

Estoy usando la E / S del usuario en las restricciones para las entradas / salidas. Asigno el inpu (t) s 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á usando interruptores para operar su seguro, no debería preocuparse por el enrutamiento óptimo y establecer la restricción 'CLOCK_DEDICATED_ROUTE en el archivo .xdc para degradar este mensaje a una ADVERTENCIA' es perfectamente válido.

Es muy improbable que pueda manejar ambos conmutadores tan juntos que se corre el riesgo de que se almacene el estado "incorrecto" con cierto grado de certeza en qué orden se alternaron. Estamos hablando de rutas sub óptimas en el orden extremadamente cercano de un nanosegundo considerando la carga capacitiva baja.

    
respondido por el user8352

Lea otras preguntas en las etiquetas