Да вот именно этот кусковый меня всем устраивает. Точность на последнем месте, на первом минимум ресурсов (особенно памяти), на втором скорость. На вход лог. ф-ции будет подаваться выход DSP48, поэтому хотелось бы чтобы работала она со скоростью DSP, который сейчас синтезируется на 400 МГц.
Сейчас набросал на коленке код, в симуляторе работает нормально, но
почему-то не синтезируется - остаются только 3 латча. Где я накосячил? Вроде как все переменные должны поглотиться во время синтеза. Ворнинги понятные: Y ограничено в (0,1), арифметика у меня 5.13, старшие биты будут задеяны. Совмещение ресурсов тоже понятно.
Ворнинги:
Код
Xst:1767 - HDL ADVISOR - Resource sharing has identified that some arithmetic operations in this design can share the same physical resources for reduced device utilization. For improved clock frequency you may try to disable resource sharing.
Xst:2261 - The FF/Latch <Y_14> in Unit <logistic> is equivalent to the following 3 FFs/Latches, which will be removed : <Y_15> <Y_16> <Y_17>
Рапорт:
CODE
=======================================================================
==
Advanced HDL Synthesis Report
Macro Statistics
# Adders/Subtractors : 3
18-bit adder : 2
18-bit subtractor : 1
# Registers : 18
Flip-Flops : 18
# Comparators : 9
18-bit comparator greater : 9
# Multiplexers : 16
18-bit 2-to-1 multiplexer : 16
# Xors : 17
1-bit xor2 : 17
=========================================================================
=========================================================================
* Low Level Synthesis *
=========================================================================
Optimizing unit <logistic> ...
INFO:Xst:2261 - The FF/Latch <Y_14> in Unit <logistic> is equivalent to the following 3 FFs/Latches,
which will be removed : <Y_15> <Y_16> <Y_17>
Mapping all equations...
Building and optimizing final netlist ...
Found area constraint ratio of 100 (+ 5) on block logistic, actual ratio is 0.
FlipFlop Y_14 has been replicated 3 time(s) to handle iob=true attribute.
Final Macro Processing ...
=========================================================================
Final Register Report
Macro Statistics
# Registers : 18
Flip-Flops : 18
=========================================================================
CODE
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use ieee.math_real.all;
entity logistic is
generic ( FRAC_WIDTH: integer := 13;
DATA_WIDTH :integer :=18);
Port (
CLK: in STD_LOGIC;
X : in STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0);
Y : out STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0));
end logistic;
architecture Behavioral of logistic is -- Ax+b;
type i_bound_t is array (0 to 8) of std_logic_vector(DATA_WIDTH-1 downto 0);
constant boundary: i_bound_t:=(
std_logic_vector(to_signed(integer(real(7.236)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(5.846)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(5.147)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(4.442)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(3.724)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(2.977)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(2.164)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(1.065)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(0)*real(2**FRAC_WIDTH)),DATA_WIDTH))
);
constant B: i_bound_t:=(
std_logic_vector(to_signed(integer(real(7.236)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(0.984375)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.97265625)*real(2**FRAC_WIDTH)),DATA_WI
DTH)),
std_logic_vector(to_signed(integer(real(0.953125)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.91796875)*real(2**FRAC_WIDTH)),DATA_WI
DTH)),
std_logic_vector(to_signed(integer(real(0.859375)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.765625)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.6328125)*real(2**FRAC_WIDTH)),DATA_WID
TH)),
std_logic_vector(to_signed(integer(real(0.5)*real(2**FRAC_WIDTH)),DATA_WIDTH))
);
begin
process(CLK)
variable X_abs:std_logic_vector(DATA_WIDTH-1 downto 0);
variable X_shifted:std_logic_vector(DATA_WIDTH-1 downto 0);
variable Y_abs:std_logic_vector(DATA_WIDTH-1 downto 0);
begin
if(rising_edge(CLK)) then
X_abs:=std_logic_vector(abs(signed(X)));
if(X_abs>boundary(0)) then
Y_abs:=std_logic_vector(to_signed(integer(real(1)*real(2**FRAC_WIDTH)),DATA_WIDT
H));
elsif X_abs>boundary(1) then
X_shifted:=std_logic_vector(signed(X_abs) srl 9);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(1)));
elsif X_abs>boundary(2) then
X_shifted:=std_logic_vector(signed(X_abs) srl 8);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(2)));
elsif X_abs>boundary(3) then
X_shifted:=std_logic_vector(signed(X_abs) srl 7);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(3)));
elsif X_abs>boundary(4) then
X_shifted:=std_logic_vector(signed(X_abs) srl 6);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(4)));
elsif X_abs>boundary(5) then
X_shifted:=std_logic_vector(signed(X_abs) srl 5);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(5)));
elsif X_abs>boundary(6) then
X_shifted:=std_logic_vector(signed(X_abs) srl 4);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(6)));
elsif X_abs>boundary(7) then
X_shifted:=std_logic_vector(signed(X_abs) srl 3);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(7)));
else
X_shifted:=std_logic_vector(signed(X_abs) srl 2);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(8)));
end if;
if(signed(X)<0) then
Y<=std_logic_vector(1-signed(Y_abs));
else
Y<=Y_abs;
end if;
end if;
end process;
end Behavioral;