Skryppy 0 31 октября, 2017 Опубликовано 31 октября, 2017 (изменено) · Жалоба Здравствуйте. Генерирую 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; Изменено 31 октября, 2017 пользователем Skryppy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 31 октября, 2017 Опубликовано 31 октября, 2017 · Жалоба Ну поставьте после этого блока у себя регистр, делов-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 31 октября, 2017 Опубликовано 31 октября, 2017 · Жалоба Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 6 31 октября, 2017 Опубликовано 31 октября, 2017 · Жалоба Обычно использование блока Matlab Function усугубляет непонимание, лучше его избегать, имеется достаточный набор примитивных блоков, чтобы описать всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
peselnik 0 1 ноября, 2017 Опубликовано 1 ноября, 2017 (изменено) · Жалоба Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет. Причина как раз понятна. В вашем простом примере нет ни одного состояния (регистра, Unit Delay). Когда логика полностью stateless, генератор кода не генерирует дополнительные порты. Как сказали выше, добавьте Unit Delay, А еще правильней - правой мышью по блоку MATLAB Function, HDL Code -> HDL Block Properties -> OutputPipeline поставить 1. Тогда модель не будет захламляться лишними блоками. Изменено 1 ноября, 2017 пользователем MiPe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 1 ноября, 2017 Опубликовано 1 ноября, 2017 · Жалоба Понятно, спасибо большое. Будем дальше работать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 2 ноября, 2017 Опубликовано 2 ноября, 2017 · Жалоба Здравствуйте. Генерирую VHDL код из блока Matlab Function А с какой целью Вы это делаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 2 ноября, 2017 Опубликовано 2 ноября, 2017 · Жалоба Мне проще некоторые вещи описать кодом, чем собирать из блоков simulink. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться