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

 
 
 
Reply to this topicStart new topic
> Генерация синхронного кода 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
andrew_b
сообщение Oct 31 2017, 14:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Ну поставьте после этого блока у себя регистр, делов-то.
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Oct 31 2017, 16:48
Сообщение #3


Участник
*

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



Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.
Go to the top of the page
 
+Quote Post
petrov
сообщение Oct 31 2017, 16:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Обычно использование блока Matlab Function усугубляет непонимание, лучше его избегать, имеется достаточный набор примитивных блоков, чтобы описать всё.
Go to the top of the page
 
+Quote Post
MiPe
сообщение Nov 1 2017, 05:09
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 17-08-11
Пользователь №: 66 760



Цитата(Skryppy @ Oct 31 2017, 19:48) *
Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.

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

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

Сообщение отредактировал MiPe - Nov 1 2017, 05:11
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Nov 1 2017, 17:16
Сообщение #6


Участник
*

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



Понятно, спасибо большое. Будем дальше работать sm.gif
Go to the top of the page
 
+Quote Post
Tpeck
сообщение Nov 2 2017, 08:09
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 14-03-06
Пользователь №: 15 243



Цитата(Skryppy @ Oct 31 2017, 16:18) *
Здравствуйте. Генерирую VHDL код из блока Matlab Function


А с какой целью Вы это делаете?
Go to the top of the page
 
+Quote Post
Skryppy
сообщение Nov 2 2017, 18:44
Сообщение #8


Участник
*

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



Мне проще некоторые вещи описать кодом, чем собирать из блоков simulink.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 03:14
Рейтинг@Mail.ru


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