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)
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
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 .
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)
@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.