асинхронен и не содержит портов clk,rst,ce. Непонятно как сделать генерируемый код синхронным.
Пример матлаба по генерации "Symmetric Fir Filter" делает синхронный VHDL код, так что дело в правильном написании функции.
Я думаю, что умножение, сравнение чисел, должно обязательно быть синхронным, иначе все развалится на высоких частотах,
может это не так?
Конкретный пример, пусть есть функция матлаб:
Код
function data_out = my_mult(data_in1, data_in2)
data_out = int32(data_in1 * data_in2);
end
data_out = int32(data_in1 * data_in2);
end
Сгенерированный код VHDL:
Код
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY my_mult IS
PORT( data_in1 : IN std_logic_vector(15 DOWNTO 0); -- int16
data_in2 : IN std_logic_vector(15 DOWNTO 0); -- int16
data_out : OUT std_logic_vector(31 DOWNTO 0) -- int32
);
END my_mult;
ARCHITECTURE rtl OF my_mult IS
-- Signals
SIGNAL data_in1_signed : signed(15 DOWNTO 0); -- int16
SIGNAL data_in2_signed : signed(15 DOWNTO 0); -- int16
SIGNAL data_out_tmp : signed(31 DOWNTO 0); -- int32
SIGNAL mul_temp : signed(31 DOWNTO 0); -- sfix32
SIGNAL cast : signed(15 DOWNTO 0); -- int16
BEGIN
data_in1_signed <= signed(data_in1);
data_in2_signed <= signed(data_in2);
mul_temp <= data_in1_signed * data_in2_signed;
cast <= X"7FFF" WHEN (mul_temp(31) = '0') AND (mul_temp(30 DOWNTO 15) /= X"0000") ELSE
X"8000" WHEN (mul_temp(31) = '1') AND (mul_temp(30 DOWNTO 15) /= X"FFFF") ELSE
mul_temp(15 DOWNTO 0);
data_out_tmp <= resize(cast, 32);
data_out <= std_logic_vector(data_out_tmp);
END rtl;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY my_mult IS
PORT( data_in1 : IN std_logic_vector(15 DOWNTO 0); -- int16
data_in2 : IN std_logic_vector(15 DOWNTO 0); -- int16
data_out : OUT std_logic_vector(31 DOWNTO 0) -- int32
);
END my_mult;
ARCHITECTURE rtl OF my_mult IS
-- Signals
SIGNAL data_in1_signed : signed(15 DOWNTO 0); -- int16
SIGNAL data_in2_signed : signed(15 DOWNTO 0); -- int16
SIGNAL data_out_tmp : signed(31 DOWNTO 0); -- int32
SIGNAL mul_temp : signed(31 DOWNTO 0); -- sfix32
SIGNAL cast : signed(15 DOWNTO 0); -- int16
BEGIN
data_in1_signed <= signed(data_in1);
data_in2_signed <= signed(data_in2);
mul_temp <= data_in1_signed * data_in2_signed;
cast <= X"7FFF" WHEN (mul_temp(31) = '0') AND (mul_temp(30 DOWNTO 15) /= X"0000") ELSE
X"8000" WHEN (mul_temp(31) = '1') AND (mul_temp(30 DOWNTO 15) /= X"FFFF") ELSE
mul_temp(15 DOWNTO 0);
data_out_tmp <= resize(cast, 32);
data_out <= std_logic_vector(data_out_tmp);
END rtl;