如何使用Xilinx Division IP Core

时间:2016-12-20 11:33:24

标签: vhdl fpga xilinx divider

我正在用VHDL编写代码以合成到XilinX FPGA上。我通常使用GHDL来模拟我的测试平台。我需要利用XilinX分区核心来划分变量,但我不知道如何做到这一点,因为XilinX文档中似乎没有例子。我是否必须使用XilinX软件为分频器生成VHDL组件?或者XilinX是否隐含地理解分频器意味着使用IP内核?如果我的第二个陈述是真的,我将如何使用GHDL模拟这个或者我是否必须使用XilinX仿真工具?我真的可以用一个最小的例子来使用XilinX分频器内核来实现一个变量的除法,例如:像这样的东西:

library ieee;      
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;

entity DividingExample is
  port (
    clk : in std_logic;
    reset : in std_logic;
    InputSignal : in std_logic_vector(15 downto 0);
    OutputSignal : out std_logic_vector(15 downto 0)
    );
end DividingExample;

architecture behaviour of DividingExample is
-- declarations
  signal numerator : integer;
begin
-- behaviour
  process(clk)
  begin
    if(rising_edge(clk)) then
      if(reset = '1') then
        -- reset values
        numerator <= 1000;  
      else
        -- calculate value to be output
        OutputSignal <= numerator/to_integer(signed(InputSignal))
    end if;
  end if;
end process;
end behaviour;

这个示例代码显然不能作为除法(&#39; /&#39;运算符)没有为整数数据类型定义。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

I ended up writing my own division code, which was significantly quicker and easier to implement than using XilinX's IP Core. I used the binary division algorithm detailed here分享时,iOS上的BBM不会将%20转换为空格,并为签名的32位分区编写以下VHDL代码:

  function Divide(N : signed(31 downto 0); D : signed(31 downto 0)) return signed is                                                                                                                    
    variable Q : signed(31 downto 0) := to_signed(0, 32);                                                      
    variable R : signed(31 downto 0) := to_signed(0, 32);                                                      
    variable l : line;                                                                                           
    constant N_Abs : signed(31 downto 0) := abs(N);                                                             
    constant D_Abs : signed(31 downto 0) := abs(D);                                                             
  begin                                                                                                          
    -- behaviour                                                                                                 
    for i in N_Abs'high downto 0 loop                                                                            
      R := shift_left(R, 1);                                                                                     
      R(0) := N_Abs(i);                                                                                          
      if R >= D_Abs then                                                                                         
        R := R - D;                                                                                              
        Q(i) := '1';                                                                                             
      end if;                                                                                                    
    end loop;                                                                                                    

    if ((N < 0 and D > 0) or (N > 0 and D < 0)) then                                                             
      return -Q;                                                                                                 
    else                                                                                                         
      return Q;                                                                                                  
    end if;                                                                                                      
  end function;