Tam Sayılar için Karekök Hesaplama İşleminin VHDL ile Gerçeklenmesi

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

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

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

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

 

  1. var quads_screen_width = document.body.clientWidth;
  2. if ( quads_screen_width >= 1140 ) {
  3. /* desktop monitors */
  4. document.write('');
  5. (adsbygoogle = window.adsbygoogle || []).push({});
  6. }if ( quads_screen_width >= 1024 && quads_screen_width < 1140 ) {
  7. /* tablet landscape */
  8. document.write('');
  9. (adsbygoogle = window.adsbygoogle || []).push({});
  10. }if ( quads_screen_width >= 768 && quads_screen_width < 1024 ) {
  11. /* tablet portrait */
  12. document.write('');
  13. (adsbygoogle = window.adsbygoogle || []).push({});
  14. }if ( quads_screen_width < 768 ) {
  15. /* phone */
  16. document.write('');
  17. (adsbygoogle = window.adsbygoogle || []).push({});
  18. }
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. library IEEE;
  26. use IEEE.STD_LOGIC_1164.ALL;
  27. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  28. use IEEE.STD_LOGIC_ARITH.ALL;
  29.  
  30. entity sqrt_v1 is
  31. generic(
  32. DATA_WIDTH : integer := 25
  33. );
  34. Port (
  35. in_clk : in std_logic;
  36. in_rst : in std_logic;
  37. in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
  38. in_data_vld : in std_logic;
  39. out_data : out std_logic_vector(DATA_WIDTH - 1 downto 0);
  40. out_data_vld : out std_logic
  41.  
  42. );
  43. end sqrt_v1;
  44.  
  45. architecture Behavioral of sqrt_v1 is
  46.  
  47. function f_WIDTH_CNTRL (DATA_WIDTH : integer) return integer is
  48. begin
  49. if (DATA_WIDTH / 2) * 2 = DATA_WIDTH then
  50. return DATA_WIDTH;
  51. else
  52. return DATA_WIDTH + 1;
  53. end if;
  54. end f_WIDTH_CNTRL;
  55.  
  56. 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
  57. begin
  58. if g_DATA_WIDTH = c_DATA_WIDTH then
  59. return in_data;
  60. else
  61. return ('0' & in_data);
  62. end if;
  63. end f_DATA_CNTRL;
  64.  
  65. constant c_DATA_WIDTH : integer := f_WIDTH_CNTRL(DATA_WIDTH);
  66.  
  67. type t_Cntrl is (IDLE, SHIFT_BIT, CHK_DATA, DONE);
  68. signal r_Cntrl : t_Cntrl := IDLE;
  69.  
  70. signal r_data_in : std_logic_vector(c_DATA_WIDTH -1 downto 0) := (others => '0');
  71. signal r_res : std_logic_vector(c_DATA_WIDTH -1 downto 0) := (others => '0');
  72. signal r_bit : std_logic_vector(c_DATA_WIDTH -1 downto 0) := conv_std_logic_vector(2**(c_DATA_WIDTH - 2), c_DATA_WIDTH);
  73. signal r_data_vld : std_logic := '0';
  74.  
  75.  
  76.  
  77. begin
  78.  
  79. out_data <= r_res(DATA_WIDTH - 1 downto 0);
  80. out_data_vld <= r_data_vld;
  81.  
  82. process(in_rst, in_clk)
  83. begin
  84. if in_rst = '1' then
  85. r_Cntrl <= IDLE;
  86. r_data_in <= (others => '0');
  87. r_res <= (others => '0');
  88. r_bit <= conv_std_logic_vector(2**(c_DATA_WIDTH - 2), c_DATA_WIDTH);
  89. r_data_vld <= '0';
  90. elsif rising_edge(in_clk) then
  91. r_data_vld <= '0';
  92. case r_Cntrl is
  93. when IDLE =>
  94. r_res <= (others => '0');
  95. r_bit <= conv_std_logic_vector(2**(c_DATA_WIDTH - 2), c_DATA_WIDTH);
  96. if in_data_vld = '1' then
  97. r_data_in <= f_DATA_CNTRL(c_DATA_WIDTH, DATA_WIDTH, in_data);
  98. r_Cntrl <= SHIFT_BIT;
  99. end if;
  100.  
  101. when SHIFT_BIT =>
  102. if r_bit > r_data_in then
  103. r_bit <= "00" & r_bit(r_bit'high downto 2);
  104. else
  105. r_Cntrl <= CHK_DATA;
  106. end if;
  107.  
  108. when CHK_DATA =>
  109. if r_bit /= 0 then
  110. if r_data_in >= (r_res + r_bit) then
  111. r_data_in <= r_data_in - (r_res + r_bit) ;
  112. r_res <= ('0' & r_res(r_res'high downto 1)) + r_bit;
  113. else
  114. r_res <= '0' & r_res(r_res'high downto 1);
  115. end if;
  116. r_bit <= "00" & r_bit(r_bit'high downto 2);
  117. else
  118. r_data_vld <= '1';
  119. r_Cntrl <= DONE;
  120. end if;
  121. when others => NULL;
  122. end case;
  123.  
  124. end if;
  125. end process;
  126.  
  127.  
  128. end Behavioral;

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir