VHDL ile Kayan Noktalı Sayılarda Çarpma İşleminin Gerçeklenmesi

Bu yazımızda kayan noktalı sayılarda çarpma işlemini pipeline mimaride fonksiyonlar ile gerçekleştirilmesini anlatacağız.

Kayan noktalı sayılarda dört işlemle ilgili detaylı yazımıza buradan ulaşabilirsiniz.

Yazıda çarpma işlemlerine ait gösterilen tüm adımlar birer fonksiyon olarak tanımlanmıştır.

Aşağıda VHDL dili kullanılarak kayan noktalı sayılarda çarpma işlemini gerçekleştiren fonksiyon kodları verilmiştir. Koddan da görüleceği üzere ilk olarak işaret biti tanımlama işlemleri gerçekleştirilmektedir. Burada saklayıcı amacı ile değerin saklnamasının nedeni pipeline mimarini işletilebilmesidir. İkinci kısımda ise çarpan değerinin hesaplandığı fonksiyonlar ve üçüncü kısımda bu mantis değerinin hesaplandığı fonksiyonlar gösterilmiştir.

Sabit atamalarında kullanılan g_e üst değerinin saklanacağı bit sayısını, g_f ise mantis değerinin saklanacağı bit sayısını göstermektedir.

Bu fonksiyonlarda sıfırla çarpma, sonsuzla çarpma gibi bazı kontroller eksik bırakılmıştır.

.....
constant g_e : natural := 8;
constant g_f : natural := 23;
.....
.....

out_rslt <= r_s_rslt & r_e_rslt & r_f_rslt;

-- işaret bitini belirle
r_s_rslt <= r_s_rslt_reg ;
r_s_rslt_reg <= sign_bit_calc_m_d(in_a_nmb(in_a_nmb'high), in_b_nmb(in_b_nmb'high));

-- üst kısımların hesaplanma işlemleri
r_exp_add_rslt <= exp_calc_m(in_a_nmb(g_e + g_f - 1 downto g_f), in_b_nmb(g_e + g_f - 1 downto g_f));

-- 
r_e_rslt <= exp_update_m(r_exp_add_rslt, r_mant_mul_rslt(r_mant_mul_rslt'high));

--çarpan kısmının hesaplanması
r_mant_mul_rslt    <=  mantissa_calc_m(in_a_nmb(g_f - 1 downto 0), in_b_nmb(g_f - 1 downto 0));

-- 
r_f_rslt <= mant_update_m(r_mant_mul_rslt, r_mant_mul_rslt(r_mant_mul_rslt'high));

Bu fonksiyon iki sayının çarpımı sonucunda elde edilecek sayının işaret biti değerini döndürmektedir.

function sign_bit_calc_m_d( a_sign, b_sign : std_logic) return std_logic is
begin
    return a_sign xor b_sign;
end sign_bit_calc_m_d;

Bu fonksiyon iki sayının çarpımı sonucunda üst kısmını hesaplama sonucunu döndürmektedir.

function exp_calc_m(a_exp, b_exp : std_logic_vector(g_e - 1 downto 0)) return std_logic_vector is
begin
    return (a_exp + b_exp - conv_std_logic_vector(2**(g_e - 1) - 1, g_e));
end exp_calc_m;

Bu fonksiyon çarpanlarn çarpımı sonucuna göre nihai üst değerini döndürmektedir.

function exp_update_m(exp_add : std_logic_vector(g_e - 1 downto 0); mant_bit : std_logic) return std_logic_vector is
begin
    if mant_bit = '0' then
        return exp_add;
    else
        return exp_add + 1;
    end if;
end exp_update_m;

Bu fonksiyon çarpanlarn çarpımı sonucuna döndürmektedir.

function mantissa_calc_m(a_mant, b_mant : std_logic_vector(g_f - 1 downto 0)) 
        return std_logic_vector is
    variable mant_mul_rslt : std_logic_vector(2 * g_f + 1 downto 0) := (others => '0');     
begin
    mant_mul_rslt := ('1' & a_mant) * ('1' & b_mant);
    return mant_mul_rslt(mant_mul_rslt'high downto mant_mul_rslt'high - g_f - 1);
end mantissa_calc_m;    

Bu fonksiyon çarpanlarn çarpımı sonucunun nihai değerini döndürmektedir.

function mant_update_m(mant_mul : std_logic_vector(g_f + 1 downto 0); mant_bit : std_logic) return std_logic_vector is
begin
    if mant_bit = '0' then
        return mant_mul(mant_mul'high - 2 downto mant_mul'high - g_f - 1 );			
    else
        return mant_mul(mant_mul'high - 1 downto mant_mul'high - g_f);
    end if;		
end mant_update_m;
Latest Comments
  1. hakan özbek

    merhaba M.Ali bey,
    gerçekten kitabınızı cok faydalı buldum.vhdl ile sayısal tasarım ve fpga uygulamaları kitabındaki sinyal işlemede convulasyon projesine örnegine gelmiştim.web sayfanızdaki VHDL’de FIR Filtre Tasarımı projenizde yapılan örnekten farklı mı ? kodları birbirleriyle tamenen farklı ve kitapta da bir filtreleme yapılmış anlayamadım? bu tamanen farklı bir proje mi?

    ayrıca web sayfasınızdaki ,bahsettigim VHDL’de FIR Filtre Tasarımı projesini fpga ile gerçekleştirmek istesek sadece test bench yazmak yeterli olur mu?matlab kodlarını matlab programı dışında simule edebilecegim bir program var mıdır?

    ayrıca, sayfanızda fpga-tabanli-sinyal-ve-goruntu-isleme slaytınızı gördüm.kitaptaki sinyal işleme ve konvulasyon projesi örtüşüyor gibi geldi?
    sinyal işlemde çok bir bilgim yok . ögrenmeye çalışıyorum.biraz daha projeyi açıklamanız mümkün müdür?
    teşekkür ederim.

    • Mehmet Ali Çavuşlu

      Merhabalar,
      Aslında iki kod birbirinden farklı olarak çalışmakta. Kitaptakini referanas almanızda fayda vardır. 
      Gerçekleme için değil ama tüm kodları test etmek amacı ile testbench yazmanıs gerekmektedir. Kodları bu şekilde doğruladıktan sonra gerçeklemem aşamasında sorun yaşamaz iseniz kod çalışacaktır.
      O sunum SİU konferansında eğitim amaçlı bir sunumdu. Bu işle uğraşmak adına farklı kaynaklardan sinyal işleme hakkında bilgi edinmenizde ve fpga üzerinde uygulanabilecek sayı formatları hakkına uygulama geliştirme edinmenizdir.

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.