реклама на сайте
подробности

 
 
> Генерация синхронного кода VHDL из блоков Matlab Function, Код не содержит портов clk,rst,ce
Skryppy
сообщение Oct 31 2017, 13:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 14-02-11
Пользователь №: 62 975



Здравствуйте. Генерирую VHDL код из блока Matlab Function, проблема в том, что сгенерированный VHDL код часто
асинхронен и не содержит портов clk,rst,ce. Непонятно как сделать генерируемый код синхронным.
Пример матлаба по генерации "Symmetric Fir Filter" делает синхронный VHDL код, так что дело в правильном написании функции.
Я думаю, что умножение, сравнение чисел, должно обязательно быть синхронным, иначе все развалится на высоких частотах,
может это не так?

Конкретный пример, пусть есть функция матлаб:

Код
function data_out = my_mult(data_in1, data_in2)
    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;


Сообщение отредактировал Skryppy - Oct 31 2017, 13:19
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01337 секунд с 7
ELECTRONIX ©2004-2016