我正在用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;运算符)没有为整数数据类型定义。我怎么能这样做?
答案 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;