2016-04-14 32 views
1

Xilinx pg060 Kayan Nokta Çekirdeğini kullanmayı denedim. Xilinx Kayan Nokta Çekirdeği - Hatalı 'X' değerleri?

enter image description here böyle yukarıda zamanlama diyagramı ve demo Testbençin olarak sağlanan şemalar, inceledik (deneyimsiz böyle kendime olarak, oldukça kafa karıştırıcı!) Ben sadece iki sayıyı çarpar kısa programını oluşturduk. İlk bakışta, yanlış bir şey yapmış olduğumu düşündüm, çünkü sonuç bilinmeyen X'lerle doluydu.

enter image description here

Ancak, kullanıcı kılavuzunda önerildiği gibi birçok başka şeyler kontrol ettikten sonra, bu doğru sonuçlar oldu '1' ile her 'X' yerini ve buldum.

Bu a) normal mi yoksa b) Bu örnekte sadece neyse ki çekirdeğin yanlış kullanımı bana doğru bir cevap verdi mi?

DÜZENLEME: Muhtemelen benim hatamdan dolayı - neden bu meydana geldi?

Çok teşekkürler!

entity FloatMul is 
    port(SYSCLK : IN STD_LOGIC; 
     RESET_N : IN STD_LOGIC; 
     A, B : IN FLOAT32;   --input 
     E  : OUT FLOAT32   -- E = A*B 
    ); 
end FloatMul; 

architecture Behavioral of FloatMul is 
    type fsm is (load, ready, waiting, results); 
    signal state     : fsm  := load; --state machine controller 
    signal a_val, b_val, prod_val : std_logic := '0'; --valid data flags 
    signal prod     : std_logic_vector(31 downto 0); 

    component fp_mul 
     port(
      aclk     : in std_logic; 
      s_axis_a_tvalid  : in std_logic; 
      s_axis_a_tdata  : in std_logic_vector(31 downto 0); 
      s_axis_b_tvalid  : in std_logic; 
      s_axis_b_tdata  : in std_logic_vector(31 downto 0); 
      m_axis_result_tvalid : out std_logic; 
      m_axis_result_tdata : out std_logic_vector(31 downto 0) 
     ); 
    end component; 
begin 
    fp_core : FP_Mul 
     PORT MAP(
      aclk     => SYSCLK, 
      s_axis_a_tvalid  => a_val, 
      s_axis_a_tdata  => std_logic_vector(A), --Data from input 
      s_axis_b_tvalid  => b_val, 
      s_axis_b_tdata  => std_logic_vector(B), 
      m_axis_result_tvalid => prod_val, 
      m_axis_result_tdata => prod 
     ); 

    state_machine : process(SYSCLK) 
    begin 
     if rising_edge(SYSCLK) then 
      case state is 
       when load =>   --initial state 
        state <= ready; 
       when ready => 
        a_val <= '1';  --set flags to ready 
        b_val <= '1'; 
        state <= waiting; 
       when waiting => 
        if prod_val = '1' then 
         a_val <= '0'; --when result ready, remove flags 
         b_val <= '0'; 
         state <= results; 
        else 
         state <= waiting; --wait til result ready 
        end if; 
       when results => 
        E  <= float(prod); --cast result to float 
        state <= load; 
      end case; 
      if RESET_N = '0' then  --synchronous reset 
       state <= load; 
       a_val <= '0'; 
       b_val <= '0'; 
       prod <= (others => '0'); 
      end if; 
     end if; 
    end process; 
end Behavioral; 
+1

Son soruyla ilgili olarak: Yani, basit bir 32 bitlik FP çoğaltmasının 10 döngüden daha uzun sürdüğünü görüyorsunuz. belki de büyük AXI arayüzü olmadan FP ünitesini yaratabilirsiniz. Pipetlemeyi etkinleştirmek de mümkündür, bu nedenle çevrim başına bir sonuç hesaplanır, ancak> 10 döngü gecikme ile. – Paebbels

+0

Teşekkürler v. Çok - içine bakacak! Basit bir boru hattını gösteren bir kaynak/şablon/örnek biliyor musunuz? – davidhood2

+0

[DS816] 'da açıklanan bir Engelleme dışı modu var (http://www.xilinx.com/support/documentation/ip_documentation/floating_point/v6_0/ds816_floating_point.pdf) = pipelined. – Paebbels

cevap

4

Tur Testbenç Xilinx çekirdeğinin çıkışı sinyalinin sıfıra prod, tahrik eder. Sürülen değerin çözülemediği 2 sürücü bulunduğundan (çekirdek sürüş 1 ve test tezgahınız 0 sürüş gibi) sonuç “X” dir.

Sadece prod <= (others => '0') numaralı satırı kaldırın ve iyi çalışacaktır!