Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => FPGA Öğreniyorum => Konuyu başlatan: 94onur94 - 17 Mart 2022, 10:51:26

Başlık: Floating Point sonucu yanlış çıkıyor
Gönderen: 94onur94 - 17 Mart 2022, 10:51:26
Merhaba arkadaşlar, floating point çarpma işlemi yapıyorum. 32 bitlik giriş portumdaki sayıyı sabit sayı ile çarparak çıkışa aktarıyorum. Simulasyonda sonuç doğru çıkmasına rağmen donanım üzerinde çalıştırınca sonuç yanlış çıkıyor.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
use work.float_pkg.all;
 
entity test_block is
    Port (
        data_in : in std_logic_vector (31 downto 0);
        data_out : out std_logic_vector (31 downto 0)
    );
end test_block;
 
architecture Behavioral of test_block is
    constant adc_coef : real := 0.000000298023223876953125;
begin
    data_out <= to_slv(to_float(signed(data_in))*adc_coef); 
end Behavioral;

Simulasyon görseli
(https://i.ibb.co/1JnNkrM/s-sim.jpg) (https://ibb.co/1JnNkrM)

Giriş portumda x"000727AC" (decimal 468908) değeri yer alıyor. Çarpım sonucu 0x000727AC * 0.000000298023223876953125 = 0x3e0f1970 (float 0.139745) olarak çıkıyor. Simulasyonda sorun yok.

Donanım üzerinde ILA görseli
(https://i.ibb.co/jJn5LVx/s-out.jpg) (https://ibb.co/jJn5LVx)

Ama donanım üzerinde çalıştırınca sonuç 0x34a8f197 (float 0.000000314682182) olarak çıkıyor. Farklı sayılar ile çarpmayı, toplamayı denedim sonuç hep yanlış çıkıyor. Nerede hata yapıyorum?

Blok Tasarım
(https://i.ibb.co/2tmJ8pb/ss.jpg) (https://ibb.co/2tmJ8pb)
Başlık: Ynt: Floating Point sonucu yanlış çıkıyor
Gönderen: muuzoo - 17 Mart 2022, 15:47:57
Float işlemler için üreticinin sağladığı IP çekirdeklerini kullanın. Vivado'nun VHDL-200X implementasyonu henüz tam değil. Ayrıca mümkün mertebe float işlemlerden kaçının. Mümkünse fix point ya da integer çalışın. Normal şartlar altında real veri tipi sentezlenebilir bir veri tipi değildir. Sadece simülasyonda kullanmanızı öneririm.

https://www.xilinx.com/support/documentation/ip_documentation/floating_point/v7_1/pg060-floating-point.pdf
Başlık: Ynt: Floating Point sonucu yanlış çıkıyor
Gönderen: devrecii - 17 Mart 2022, 23:54:50
Test block_0'a çift tıkla içindeki devreyi göstermesi gerekir , derleyici orada nasıl devre kurmuş acaba? Hazır çarpıcı mı kullanmıs yoksa yüzlerce kapı mı ?

Ucuz fpga'lar haric, çip içinde 24bit çarpıcılar var  bununla float çarpma bölme yapılabilir. Özellikle çarpma çok kolay.

Float toplama çıkarma için 24bit shift yapmak ve normal toplama işlemi yetiyor .
Başlık: Ynt: Floating Point sonucu yanlış çıkıyor
Gönderen: muuzoo - 18 Mart 2022, 10:25:51
Alıntı yapılan: devrecii - 17 Mart 2022, 23:54:50Test block_0'a çift tıkla içindeki devreyi göstermesi gerekir , derleyici orada nasıl devre kurmuş acaba? Hazır çarpıcı mı kullanmıs yoksa yüzlerce kapı mı ?

Ucuz fpga'lar haric, çip içinde 24bit çarpıcılar var  bununla float çarpma bölme yapılabilir. Özellikle çarpma çok kolay.

Float toplama çıkarma için 24bit shift yapmak ve normal toplama işlemi yetiyor .

Algoritmanızı paylaşabilir misiniz? Tam olarak 24 bit kaydırmadan kastınızı anlamadım. Acaba Fix Point aritmetiği ile karıştırıyor olabilir misiniz? Floating-Point aritmetiği biraz daha kompleks bir işlemdir. Örnek bir akış eklemek istiyorum.

(https://media.geeksforgeeks.org/wp-content/uploads/floating-point-arithmetic.jpg)
Başlık: Ynt: Floating Point sonucu yanlış çıkıyor
Gönderen: devrecii - 18 Mart 2022, 19:31:36
@muuzoo   exponentlerin farkını alıp  küçük expli olan sayıyı bu fark kadar shift yapıp sign+23bit = 24bit toplamak. carry varsa büyük expi bir artırmak yada azaltmak son exp budur.

Yukarıda verdiğn şemayı elektronik olarak düşünsene 1milyon transstor lazım. döngü bile var bana saçma geldi.