【问题标题】:Xilinx Floating Point Core - Erroneous 'X' values?Xilinx 浮点内核 - 错误的“X”值?
【发布时间】:2016-04-14 17:30:16
【问题描述】:

我尝试使用 Xilinx pg060 浮点内核。

查看提供的图表后,例如上面的时序图和演示测试台(对于像我这样没有经验的人来说,这很令人困惑!)我创建了一个简单的将两个数字相乘的小程序。

乍一看,我以为我做错了什么,因为结果充满了未知的“X”。

但是,在检查了用户指南中推荐的许多其他内容后,我将每个“X”替换为“1”,发现这是正确的结果。

这是a)正常还是b)我对核心的误用在这种情况下幸运地给了我一个正确的答案?

编辑:这很可能是我的错误 - 为什么会发生这种情况?

非常感谢!

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;

【问题讨论】:

  • 关于你最后一个问题:所以你看到一个简单的 32 位 FP 乘法需要 10 个周期。也许您可以创建没有大 AXI 接口的 FP 单元。也可以启用流水线,因此它每个周期计算一个结果,但延迟大于 10 个周期。
  • 非常感谢 - 会调查的!你知道展示简单流水线的资源/模板/示例吗?
  • DS816 = pipelined 中描述了一种非阻塞模式。

标签: floating-point vhdl multiplication xilinx-ise spartan


【解决方案1】:

Tour 测试台将信号prod 驱动为零,这是赛灵思内核的输出。由于有 2 个驱动程序,其中驱动的值无法解析(例如核心驱动 1 和您的测试台驱动 0),因此结果为“X”。

只需删除行 prod &lt;= (others =&gt; '0') 即可正常工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2012-12-02
    • 1970-01-01
    • 2014-08-28
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多