Перейти к содержанию

    

Генерация синхронного кода VHDL из блоков Matlab Function

Здравствуйте. Генерирую 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну поставьте после этого блока у себя регистр, делов-то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно использование блока Matlab Function усугубляет непонимание, лучше его избегать, имеется достаточный набор примитивных блоков, чтобы описать всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.

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

 

Как сказали выше, добавьте Unit Delay, А еще правильней - правой мышью по блоку MATLAB Function, HDL Code -> HDL Block Properties -> OutputPipeline поставить 1. Тогда модель не будет захламляться лишними блоками.

Изменено пользователем MiPe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно, спасибо большое. Будем дальше работать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Здравствуйте. Генерирую VHDL код из блока Matlab Function

 

А с какой целью Вы это делаете?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне проще некоторые вещи описать кодом, чем собирать из блоков simulink.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация