2016-12-20 87 views
-1

我正在用VHDL編寫代碼以合成到XilinX FPGA上。我通常使用GHDL來模擬我的測試平臺。我需要利用XilinX分部核心來劃分變量,但我不確定如何去做,因爲在XilinX文檔中似乎沒有例子。我是否必須使用XilinX軟件爲分頻器生成VHDL組件?或者XilinX隱含地理解分配器意味着使用IP核?如果我的第二個陳述是真實的,那麼我將如何使用GHDL進行仿真,還是必須使用XilinX仿真工具?我真的可以用一個使用XilinX分頻器內核來實現除法的例子來做一個簡單的例子。是這樣的:如何使用賽靈思分區IP內核

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; 

此示例代碼顯然不作爲分割工作(在「/」操作符)沒有爲整數數據類型定義。我該怎麼辦?

回答

0

我最終編寫了我自己的部門代碼,這比使用XilinX的IP核更快,更容易實現。我使用了二進制除法算法詳細的here,併爲有符號的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;