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.