Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Генерация синхронного кода VHDL из блоков Matlab Function
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
Skryppy
Здравствуйте. Генерирую 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;
andrew_b
Ну поставьте после этого блока у себя регистр, делов-то.
Skryppy
Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.
petrov
Обычно использование блока Matlab Function усугубляет непонимание, лучше его избегать, имеется достаточный набор примитивных блоков, чтобы описать всё.
MiPe
Цитата(Skryppy @ Oct 31 2017, 19:48) *
Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.

Причина как раз понятна. В вашем простом примере нет ни одного состояния (регистра, Unit Delay). Когда логика полностью stateless, генератор кода не генерирует дополнительные порты.

Как сказали выше, добавьте Unit Delay, А еще правильней - правой мышью по блоку MATLAB Function, HDL Code -> HDL Block Properties -> OutputPipeline поставить 1. Тогда модель не будет захламляться лишними блоками.
Skryppy
Понятно, спасибо большое. Будем дальше работать sm.gif
Tpeck
Цитата(Skryppy @ Oct 31 2017, 16:18) *
Здравствуйте. Генерирую VHDL код из блока Matlab Function


А с какой целью Вы это делаете?
Skryppy
Мне проще некоторые вещи описать кодом, чем собирать из блоков simulink.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.