N pozitif tam sayısının karekökü bulma işlemleri esnasında ilk olarak Tablo 1’da tanımlı N sayısından küçük en büyük tam sayı tespiti yapılmaktadır. Örneğin 20 sayısı için Değer 16, 144 için 64 olmaktadır.

Tablo 1 Değer parametresi

tablo-300x134

Değer değişkeninin tespit edilmesi ile birlikte N sayısının karekökü bulma işlemi işin Denklem (1)’de tanımlanan işlemler yapılmaktadır. Denklemden de görüleceği üzere N tam sayı değeri Değer ile Karakök toplamına eşit veya büyük ise N tam sayısından Değer ile Karekök’ün toplamının çıkarılması ile yeni N değeri elde edilir. Karekök başlangıçta sıfırdır. Yeni Karekök değeri ise Karekök’ün 2’ye bölümünün Değer ile toplamıdır. Aksi durumlarda ise Karekök değerin 2’ye bölünerek güncellenir. Değer ise her adımda 4’e bölünür.

denklem1-300x87

144 sayısının karekökünün bulunmasına ilişkin örnek çözüm Tablo 2’de verilmiştir.

Tablo 2 144 sayısının karekökünün bulunması

tablo2-300x104

Yukarıda anlatılan karekök bulma işlemine ilişkin VHDL kodu aşağıda verilmiştir.

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  4. use IEEE.STD_LOGIC_ARITH.ALL;
  5.  
  6. entity sqrt_v1 is
  7.     generic(
  8.         DATA_WIDTH : integer := 25
  9.     );
  10.     Port (
  11.         in_clk : in std_logic;
  12.         in_rst : in std_logic;
  13.         in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
  14.         in_data_vld : in std_logic;
  15.         out_data : out std_logic_vector(DATA_WIDTH - 1 downto 0);
  16.         out_data_vld : out std_logic
  17.    
  18.     );
  19. end sqrt_v1;
  20.  
  21. architecture Behavioral of sqrt_v1 is
  22.    
  23.     function f_WIDTH_CNTRL (DATA_WIDTH : integer) return integer is
  24.     begin
  25.        if (DATA_WIDTH / 2) * 2 = DATA_WIDTH then
  26.            return DATA_WIDTH;
  27.        else
  28.            return DATA_WIDTH + 1;
  29.        end if;
  30.     end f_WIDTH_CNTRL;
  31.    
  32.     function f_DATA_CNTRL(c_DATA_WIDTH, g_DATA_WIDTH : integer; in_data : std_logic_vector(DATA_WIDTH - 1 downto 0)) return std_logic_vector is
  33.     begin
  34.        if g_DATA_WIDTH = c_DATA_WIDTH then
  35.            return in_data;
  36.        else
  37.            return ('0' & in_data);
  38.        end if;
  39.     end f_DATA_CNTRL;
  40.    
  41.     constant c_DATA_WIDTH : integer := f_WIDTH_CNTRL(DATA_WIDTH);
  42.    
  43.     type t_Cntrl is (IDLE, SHIFT_BIT, CHK_DATA, DONE);
  44.     signal r_Cntrl : t_Cntrl := IDLE;
  45.  
  46.     signal r_data_in : std_logic_vector(c_DATA_WIDTH -1 downto 0) := (others => '0');
  47.     signal r_res : std_logic_vector(c_DATA_WIDTH -1 downto 0) := (others => '0');
  48.     signal r_bit : std_logic_vector(c_DATA_WIDTH -1 downto 0) := conv_std_logic_vector(2**(c_DATA_WIDTH - 2), c_DATA_WIDTH);
  49.     signal r_data_vld : std_logic := '0';
  50.    
  51.    
  52.  
  53. begin
  54.  
  55.     out_data <= r_res(DATA_WIDTH - 1 downto 0);
  56.     out_data_vld <= r_data_vld;
  57.  
  58.     process(in_rst, in_clk)
  59.     begin
  60.         if in_rst = '1' then
  61.             r_Cntrl <= IDLE;
  62.             r_data_in <= (others => '0');
  63.             r_res <= (others => '0');
  64.             r_bit <= conv_std_logic_vector(2**(c_DATA_WIDTH - 2), c_DATA_WIDTH);
  65.             r_data_vld <= '0';
  66.         elsif rising_edge(in_clk) then
  67.             r_data_vld <= '0';
  68.             case r_Cntrl is
  69.                 when IDLE =>                   
  70.                     r_res <= (others => '0');
  71.                     r_bit <= conv_std_logic_vector(2**(c_DATA_WIDTH - 2), c_DATA_WIDTH);
  72.                     if in_data_vld = '1' then
  73.                         r_data_in <= f_DATA_CNTRL(c_DATA_WIDTH, DATA_WIDTH, in_data);
  74.                         r_Cntrl <= SHIFT_BIT;
  75.                     end if;
  76.                    
  77.                 when SHIFT_BIT =>
  78.                     if r_bit > r_data_in then
  79.                         r_bit <= "00" & r_bit(r_bit'high downto 2);                    
  80.                     else
  81.                         r_Cntrl <= CHK_DATA;
  82.                     end if;
  83.                    
  84.                 when CHK_DATA =>
  85.                     if r_bit /= 0 then
  86.                         if r_data_in >= (r_res + r_bit) then
  87.                             r_data_in <= r_data_in - (r_res + r_bit) ;
  88.                             r_res <= ('0' & r_res(r_res'high downto 1)) + r_bit;
  89.                         else
  90.                             r_res <= '0' & r_res(r_res'high downto 1);                             
  91.                         end if;    
  92.                         r_bit <= "00" & r_bit(r_bit'high downto 2);                        
  93.                     else
  94.                         r_data_vld <= '1';
  95.                         r_Cntrl <= DONE;
  96.                     end if;
  97.                 when others => NULL;
  98.             end case;
  99.            
  100.         end if;
  101.     end process;
  102.  
  103.  
  104. end Behavioral;