Buenas.
Yo te aconsejo que lo pongas en un fichero aparte con el nombre de .sqrt32.vhd Para "Instanciar", (ya que en vhdl no existen las subrrutinas, sino módulos de descripción lógica) este fichero puedes fijarte en este ejemplo:
Codigo:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity prueba is
Port ( --Aqui van los puertos de tu diseño donde vas a insertar la raiz cuadrada
);
end prueba;
architecture Behavioral of prueba is
component sqrt32
port ( P : in std_logic_vector(31 downto 0);
U : out std_logic_vector(15 downto 0));
end component;
-- Aqui van las señales de tu diseño
signal P : std_logic_vector(31 downto 0);
signal U : std_logic_vector(15 downto 0);
begin
-- Instanciacion del fichero sqrt32.vhd
U_sqrt32: sqrt32
port map (P, U);
--Aqui los procesos o asignaciones de tu diseño
end Behavioral;
En cuanto a lo del "std_logic_vector", se trata de señales consideradas "UNSIGNED" de 32 y 16 bits, lo cual tiene bastante sentido puesto que una raiz cuadrada no puede tener como entradas ni salidas números negativos. Tendrás que cambiar en tu diseño estas señales por el tipo "std_logic_vector".
El componente se declara tal y como te señalo en rojo en el mensaje anterior. El nombre del componente será el nombre del fichero sin la extensión .vhd
La senten cia "use" es solo para las librerías y no tiene nada que ver con los ficheros que se utilicen.
En cuanto al "U_sqrt", es el nombre que le he dado a la llamada al componente "sqrt". Le puedes poner "pepito_grillo" o lo que se te ocurra. Lo pongo así porque si hago varias llamadas a varios componentes siguo la secuencia U1, U2 U3, etc.
Codigo:
U1:decodificador_7seg port map (numero, segme);
U2:bin2bcd port map (bin, unidades, decenas, centenas);