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

    

Skryppy

Участник
  • Публикаций

    67
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Skryppy

  • Звание
    Участник
  • День рождения 26.04.1987

Информация

  • Город
    Жуков, Калужская область

Старые поля

  • Vkontakte
    skryppy

Посетители профиля

1 029 просмотров профиля
  1. Т.к. У вас тактовая частота fs=200 кГц, а фильтруете узкую полосу, то не понижая fs ваш фильтр будет, примерно, порядка 1687. Чтобы не тратить такое огромное количество ресурсов надо понижать тактовую. Собрал модель, получается каскадное соединение фильтров займет 30+17 = 47 коэффициентов. Причем симметричных, на этом можно еще вдвое сэкономить ресурсов. Поиграйтесь с количеством каскадов, децимирование в 2 и более раз, различные типы фильтров: halfband, lowpass и т.д. untitled.rar
  2. Так как у вас сигнал медленно изменяется надо уменьшить тактовую частоту внутри плис. Поставте блок dcm, mmcm (блок xilinx) или аналогичный и поделите ваши 100 МГц на столько, сколько считаете нужным.
  3. Чтобы получить синтезируемый hdl код из fdatool, надо после получения нужной ачх перейти на вкладку quantization и выставить нужную разрядность входных/выходных портов. Только после этого генерить код. Вообще, если вам нужен максимально оптимизированный код под вашу плис, используйте matlab system generator. Тогда полученные фильтры на virtex7 работают на частотах выше 400 МГц. Красивый HDL код получается при генерации из Матлаб кода с помощью матлаб APPS-> HDL Coder (Hdl coder project).
  4. Мне проще некоторые вещи описать кодом, чем собирать из блоков simulink.
  5. Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.
  6. Здравствуйте. Генерирую 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;
  7. Заработало. Внес директиву #pragma HLS INLINE внутрь каждой функции- my_func1, my_func2. Спасибо всем за помощь.
  8. Спасибо, отредактировал сообщение. Использовал директивы inline, unroll, pipeline,dataflow. Так и не смог отвязаться от valid data_in2.
  9. Алгоритм этой функции простой - коммутировать данные на выход при наличии команды. просто valid сигналов данных data_in1 и data_in2 может быть разный. Сделал функции my_func1, my_func2. Но результат тот же. Я не пойму как засунуть функции в параллельные процессы CODE #include "ap_int.h" void my_func1(int data_in, int command, int *data_out) { static bool flag; if (command == 1){ flag = true; } if (command != 0 && command != 1){ flag = false; } if (flag == true){ *data_out = data_in; }else{ } } void my_func2(int data_in, int command, int *data_out) { static bool flag; if (command == 1){ flag = false; } if (command != 0 && command != 1){ flag = true; } if (flag == true){ *data_out = data_in; }else{ } } void test( int data_in1, int data_in2, int command, int *data_out1, int *data_out2 ) { #pragma HLS INTERFACE ap_vld port=data_in1 #pragma HLS INTERFACE ap_vld port=data_in2 #pragma HLS INTERFACE ap_vld port=command #pragma HLS INTERFACE ap_vld port=data_out1 #pragma HLS INTERFACE ap_vld port=data_out2 #pragma HLS PIPELINE II=1 my_func1(data_in1, command, data_out1); my_func2(data_in2, command, data_out2); }
  10. Спасибо, но все равно не понятно, как сделать порты независимыми. Добавил еще flag, но все равно нет данных: static bool flag1 = true; static bool flag2 = true; if (command == 1){ flag1 = true; } if (command == 1){ flag2 = false; } if (command != 0 && command != 1){ flag1 = false; } if (command != 0 && command != 1){ flag2 = true; } if (flag1 == true){ *data_out1 = data_in1; } if(flag2 == true){ *data_out2 = data_in2; }
  11. Здравствуйте. Сделал в Vivado HLS проект: #include "ap_int.h" void test( int data_in1, int data_in2, int command, int *data_out1, int *data_out2 ) { #pragma HLS INTERFACE ap_vld port=data_in1 #pragma HLS INTERFACE ap_vld port=data_in2 #pragma HLS INTERFACE ap_vld port=command #pragma HLS INTERFACE ap_vld port=data_out1 #pragma HLS INTERFACE ap_vld port=data_out2 static bool flag; if (command == 1){ flag = true; } if (command != 0 && command != 1){ flag = false; } if (flag == true){ *data_out1 = data_in1; }else{ *data_out2 = data_in2; } } Не могу понять, как сделать порты data_in1 и data_in2 независимыми друг от друга. Когда сигналы valid data_in1 и data_in2 =1, то все работает нормально Но если valid data_in2 = 0, то на выход не подается и data_in1, хотя по идеи они независимые Пытался делать их в разных if-else блоках, итог такой же. Может кто сталкивался с такой проблемой?
  12. HDL-coder использую совместно со Stateflow -для генерации кода,в Stateflow делаю блоки управления (они тактируются частотами не более 100 МГц). Все высокочастотные блоки беру из Xilinx System Generator.
  13. Работаю с матлабовскими HDL-coder, Stateflow, Xilinx System Generator -проекты в железе работают на частотах больше 400 МГц (Virtex7). Громадные проекты(30-80% ресурсов Virtex7), отлаживать одному (особенно, когда раз в неделю получаешь новые указания, на доработки) просто нереально без матлаба. Когда компиляция в железе(Xilinx ISE) уже готового кода занимает более суток, цена каждой ошибки очень высока по времени(и нервам).