Diseño de la cadena de transporte - Problemas con el reloj en diseño

-2

Estoy tratando de implementar la cadena de acarreo en FPGA y quiero que el resault de cada bloque se escriba en el registro. Cada bloque es un sumador de 10 bits con el siguiente código:

-- Carry10 Adder-------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity CarryN is
    generic (DATA_WIDTH : natural := 10);

    port ( 
             cin    :in std_logic;
             cout   :out std_logic;
             Q :out signed ((DATA_WIDTH-1) downto 0);
             STOP :in std_logic

         );

end CarryN;

architecture rtl of CarryN is

--SIGNAL Q: signed ((DATA_WIDTH-1) downto 0);
SIGNAL pomocni: signed ((DATA_WIDTH-1) downto 0);
SIGNAL a : signed ((DATA_WIDTH-1) downto 0);
SIGNAL b    : signed ((DATA_WIDTH-1) downto 0);

begin

a<=(others => '0');
b<=(others => '1');

process (STOP,cin)
    variable s : signed ((DATA_WIDTH) downto 0);
    begin
    s := ('0' & a) + ('0' & b) + ('0' & cin);
    --resoult<=s((DATA_WIDTH-1) downto 0);
    cout <= s(DATA_WIDTH);
    pomocni<=s((DATA_WIDTH-1) downto 0);

    if (rising_edge(STOP)) then
    Q<=pomocni;
    end if;



    end process;

end rtl;

---------------------------------------------------------

Entonces, cuando compilo este código como una entidad de NIVEL SUPERIOR, todo está bien y obtengo lo que quería. Después de eso, he creado una entidad de NIVEL SUPERIOR en la que utilizo este sumador de 10 bits como componente para la cadena de acarreo como barbecho:

-- TOP LEVEL ENTITY-----------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Pokusaj is

    generic (DATA_WIDTH : natural := 10;
                N: integer :=100);

    port ( 
             clk1   :in std_logic;
             clk2   :in std_logic

         );

end Pokusaj;

architecture rtl of Pokusaj is


component CarryN    is
port ( 
             cin    :in std_logic;
             cout   :out std_logic;
             Q :out signed ((DATA_WIDTH-1) downto 0);
             STOP :in std_logic

         );

end component;


SIGNAL START: std_logic;
SIGNAL STOP: std_logic;
SIGNAL S: signed (200 downto 0);
SIGNAL reg: signed (1500 downto 0);
SIGNAL I: integer := 0;
--SIGNAL : signed ((DATA_WIDTH-1) downto 0);
--SIGNAL a : signed ((DATA_WIDTH-1) downto 0);
--SIGNAL b  : signed ((DATA_WIDTH-1) downto 0);

begin

START<=clk1 xor clk2;
STOP <=clk1 and clk2;

S(0)<=START;

 G_1 : for I in 0 to N-1 generate     

            BEGIN

            Delay_Element1: CarryN
           port map

            (S(I),S(I+1),reg (10*(I+1)-1 downto 10*I), STOP);

         end generate;


end rtl;
----------------------------------------------------------------

Después de eso recibo el error de que no tengo relojes definidos en el diseño, pero el reloj está bien definido en el componente CarryN. He leído sobre problemas cuando el compilador llega a la conclusión de que el reloj no es necesario, por lo que lo dejó desde el diseño, pero no puedo averiguar cómo puede ser un problema si probé mi componente y todo funciona bien desde su perspectiva.

    
pregunta Ivan

1 respuesta

1

En términos generales, las herramientas de síntesis de FPGA no le permiten usar la lógica para generar un reloj interno sin requerir que lo ejecute explícitamente a través de un búfer de reloj. Es posible que también tenga que declarar la red como un reloj en el archivo de restricciones, así como darle valores de tiempo específicos.

Los FPGA modernos están altamente optimizados físicamente, con "árboles" separados de distribución de baja inclinación para relojes, y redes e interruptores altamente configurables para señales lógicas. No le permiten mezclarlos, excepto en circunstancias cuidadosamente controladas: la entrada de reloj de cualquier FF solo puede conectarse a un árbol de reloj, y todas las demás entradas solo pueden conectarse a redes lógicas.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas