2016-04-14 13 views
1

Ich habe versucht, den Xilinx pg060 Floating Point Core zu verwenden. enter image description hereXilinx Floating Point Core - Fehlerhafte X-Werte?

Nachdem durch den Diagrammen zur Verfügung gestellt, wie das Zeitdiagramm oben und der Demo-Prüfstand suchen (die für den unerfahrenen wie mich, verwirrend ist recht!) Habe ich ein kurzes Programm, das zusammen zwei Zahlen multipliziert einfach.

Auf den ersten Blick dachte ich, ich hätte etwas falsch gemacht, weil das Ergebnis voller unbekannter X ist.

enter image description here

Nachdem jedoch in der Bedienungsanleitung zu lesen, wie empfohlen viele andere Dinge, die Überprüfung, ersetzt ich jedes ‚X‘ mit einer ‚1‘, und fand, das die richtigen Ergebnisse war.

Ist das a) normal oder b) mein Missbrauch des Kerns, der gerade in diesem Fall glücklicherweise eine richtige Antwort gegeben hat?

EDIT: Wie es ist wahrscheinlich mein Fehler - warum ist das passiert?

Vielen Dank!

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

Zu Ihrer letzten Frage: Sie sehen also, dass eine einfache 32-Bit-FP-Multiplikation über 10 Zyklen dauert. Vielleicht können Sie die FP-Einheit auch ohne die große AXI-Schnittstelle erstellen. Es ist auch möglich, die Datenpipelierung zu aktivieren, so dass ein Ergebnis pro Zyklus berechnet wird, jedoch mit einer Verzögerung von> 10 Zyklen. – Paebbels

+0

Danke v. Viel - werde hineinschauen! Kennen Sie eine Ressource/Vorlage/Beispiel, die einfaches Pipelining zeigt? – davidhood2

+0

Es gibt einen nicht blockierenden Modus, der in [DS816] (http://www.xilinx.com/support/documentation/ip_documentation/floating_point/v6_0/ds816_floating_point.pdf) = pipelined beschrieben ist. – Paebbels

Antwort

4

Tour-Testbank treibt das Signal prod auf Null, die die Ausgabe von Xilinx Kern. Da es 2 Treiber gibt, bei denen der gefahrene Wert nicht aufgelöst werden kann (wie der Kern, der 1 fährt und Ihr Testbench 0 fährt), ist das Ergebnis "X".

Entfernen Sie einfach die Linie prod <= (others => '0') und es wird gut funktionieren!