VHDL ile Sabit Noktalı Sayı Formatı Dönüşümü İşleminin Gerçeklenmesi

Sabit noktalı sayı formatı sayının tam kısmı ve ondalık kısmı ile yazılır. Bu sayı formatında tasarlanacak sisteme göre, istenilen sayının maksimum büyüklüğü ve hassasiyet göz önünde bulundurularak bir uzunlukları belirlenir.

 i.f

i : Tam kısım

f : Ondalık kısım

n bitlik sabit noktalı sayının matematiksel ifadesi aşağıda verilmiştir.

Sayi =n 2^{-m}

n: n bitlik sayının integer değeri

m : noktadan sonraki bit sayısı

Örneğin 3,375 sayısını sayısı incelenecek olursa

Sayı = 011.011 biçiminde sabit noktalı sayı formatına çevrilir.

n = 27, m = 3 olarak bulunur.

Matematiksel ifadede değerleri yerine koyarsak;

Sayı = 27 * 2 -3

Sayı = 27 / 8

Sayı = 3.375

şeklinde ifade edilir.

Pozitif sayıların gösteriminde tam kısım ikili olarak ifade edilir. Ondalık kısım ise ikili formatta tam olarak ifade edilemeyip, ondalık kısmın ifade edileceği bit sayısına göre hata medyana getirebilir. Aşağıda bir sayının tam kısmı için 5 bit ve ondalık kısmı için 7 bit kabul edilerek sabit noktalı sayı formatına dönüşümü verilmiştir.

Sayı = 3.1875

Tam kısım = 3

Ondalık = 0.1875

Tam kısmı 5 bitlik ikili sayı şeklinde yazarsak

Tam = 00011

Ondalık kısmın çevriminde ondalık kısım, bu kısmın istendiği bit uzunluğu kadar 2 ile çarpılır. Çarpımın sonucu 1 den küçükse bit değerine 0, 1’den büyük ve eşitse bit değerine 1 yazılır ve çarpım sonucu 1’den çıkarılır. Sayı örneğimizin ondalık kısmının çevrimi aşağıda verilmiştir.

1. 0.1875 * 2 = 0.375 → 0
2. 0.375 * 2 = 0.75 → 0
3. 0.75 * 2 = 1.5 → 1
4. 0.5 * 2 = 1 → 1
5. 0 * 2 = 0 → 0
6. 0 * 2 = 0 → 0
7. 0 * 2 = 0 → 0
Dönüşümler sonucunda 3.1875 sayısının sabit noktalı sayı gösterimi aşağıdaki gibidir.

00011.00110000

Bir sayının pozitif veya negatif olduğu en anlamlı bitine bakarak karar verilir. Bu bit 0 ise sayı pozitif , 1 ise sayı negatiftir. Pozitif sayıların gösterimini yukarıda tanımladım. Negatif sayıların gösterimi ise normal iklili, bire tümleyen ve ikiye tümleyen şeklinde 3 grupta toplayabiliriz. Yukarıda elde ettiğimiz sayıyı negatife çevrimi aşağıdaki gibi yapılır

Sayı = 00011.0011000

Normal İkili : 1 0011.0011000
1’e tümleyen : 1 1100.1100111
2’ye tümleyen : 1 1100.1101000

Aşağıda gerçel bir sayının sabit noktalı sayı formatına dönüştüren real_to_fix fonksiyonu VHDL kodu verilmiştir.

  1. function real_to_fix(data : real; e, f : integer) return std_logic_vector is
  2. variable v_data_abs : real;
  3. variable v_data_frac : real;
  4. variable v_fix_data : std_logic_vector(e + f - 1 downto 0) := (others => '0');
  5. begin
  6. v_data_abs := abs(data);
  7. v_data_frac := v_data_abs - floor(v_data_abs);
  8. v_fix_data(e + f - 1 downto f) := int_to_bin(integer(floor(v_data_abs)), e);
  9. v_fix_data(f - 1 downto 0) := frac_to_bin(v_data_frac, f);
  10.  
  11. if data < 0.0 then
  12. v_fix_data := not(v_fix_data) + 1;
  13. end if;
  14.  
  15. return v_fix_data;
  16. end real_to_fix;

 

real_to_fix fonksiyonu içerisinde tanımlı int_to_bin ve frac_to_bin fonksiyonları VHDL kodları aşağıda verilmiştir.

  1. function int_to_bin(int, e : integer) return std_logic_vector is
  2. variable v_exp : std_logic_vector(e - 1 downto 0);
  3. variable v_int : integer;
  4. begin
  5. v_int := int;
  6. for n_i in 0 to e - 1 loop
  7. if v_int /= 0 then
  8. if (v_int / 2) = ((v_int - 1) / 2) then
  9. v_exp(n_i) := '1';
  10. else
  11. v_exp(n_i) := '0';
  12. end if;
  13. else
  14. v_exp(n_i) := '0';
  15.  
  16. end if;
  17. v_int := v_int / 2;
  18. end loop;
  19. return v_exp;
  20. end int_to_bin;

 

Rastgele üretilen -8 ile +8 aralığında sayıların sabit noktalı sayı formatına dönüşüm işlemlerine ilişkin VHDL kodu ve benzetim çıktısı aşağıda gösterilmiştir.

fixed

  1. process
  2. variable seed1, seed2 : positive;
  3. variable rand : real;
  4. begin
  5. clk <= '1';
  6. uniform(seed1, seed2, rand);
  7. r_rand <= 16.0 * (rand - 0.5);
  8. r_rand_int <= integer(floor(abs(16.0 * (rand - 0.5))));
  9. data <= real_to_fix(16.0 * (rand - 0.5), 4, 12);
  10. wait for CLK_PERIOD / 2;
  11. clk <= '0';
  12. wait for CLK_PERIOD / 2;
  13. end process;

Bir Cevap Yazın

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