Jump to content

    

RobFPGA

Свой
  • Content Count

    2018
  • Joined

  • Last visited

Community Reputation

0 Обычный

1 Follower

About RobFPGA

  • Rank
    Гуру

Recent Profile Visitors

11351 profile views
  1. Приветствую! Да - это основное что сложно делать в Vivado при использовании концепции IP ядер. Понятие красоты оно такое разное Как по мне отдельный функционал в отдельные библиотеки как раз красивое решение (и легко реюзабельное). Я на VHDL почти не пишу, но мне кажется что тут у вас проблемы не с библиотеками, а с организацией структуры проектов. Если вы несколько разных проектов хотите свалит в общую кучу work то ясень пень в нем не могут быть одинаковые entity. Да и в Qu у вас же в qip указывается имя библиотеки куда компилируются исходник. То как оно будет работать если в вашем исходнике будет референс на work а не на эту library, разве найдется нужный entity? Так что тут либо отдельные проекты растягивать по отделенным library (и менять референс work в них на имя проектной library). Либо компилировать эти суб-проекты как отдельные сущности (как IP или отдельные проекты). Ну или может поможет еще какая магия VHDL типа configurations. Но что то я сомневаюсь в этом. Удачи! Rob.
  2. Приветствую! Мне почему то всегда казалось что в проекте не может быть несколько library с одинаковым именем. А иначе как понять из какой library брать соответствующий entity? Упаковка в IP не обязательно подразумевает работу в BD. Вы также можете генерировать свои корки и включать их непосредственно в RTL. Думаю что без упаковки в IP тут вам не обойтись. Хотя полноценной заменой .qip это не будет. Так как .qip автоматизирует добавление исходников в общий список файлов проекта. А IP корки в Vivado нужно генерировать с заданными параметрами перед использованием в синтезе. То есть RTL параметры из модуля где эта корка используется динамически в корке не изменить. Как вариант видится: добавление файлов в проект своим скриптом который парсит ваши .qip и создает в проекте нужную структуру библиотек работа в Vivado в non-project режиме - в таком случае вы в tcl скрипте можете напрямую включать существующие .qip файлы. Ну либо экзотический путь - hook-нуть стандартные функции Vivado типа synth_design. А в своей обертке hook_synth_design парсить список файлов проекта для синтеза, выделять от туда .qip файлы которые добавлены в Vviado проект (например как data или memory initialization type). Парсить эти .qip и динамически добавлять исходники в проект перед вызовом родной synth_design функции. (вот это я навернул ) Удачи! Rob. P.S. Только что проверил эту бредовую идею - и ведь работает! Можно будет подшутить над коллегами - смотри мол - в списке файлов проекта исходника нет, а проект собирается без ошибок
  3. Приветствую! Ну так надо было до конца там статью читать - так как то что вы там взяли не рабоче (о чем там же и пишут). А "пофиксиный" вариант от туда работает за один такт, что хорошо видно на приведенном скриншоте сима . Такое годится для симуляции но ни как для синтеза (хотя бывают же на свете чудаки ). Удачи! Rob.
  4. Приветствую! Ну разные они только в максимальной частоте линии QSFP 1G, QSFP+ 10G, QSFP28 28G соответственно. Поэтому если нужно 10G base-r то используете одну линию из 4 (или все 4 для 4 каналов), а в разъем нужно будет вставить QSPP+ --> 4xSFP+ разветвитель (pigtail), или конвертор разъема. Удачи! Rob.
  5. Приветствую! Вы каким алгоритмом сортировку делаете ? Судя по всему пузырьком, максимальный элемент двигаете в конец массива, так? А какой при этом признак что массив отсортирован? Если мне память не изменяет - за проход по массиву не было ни одной перестановки. Ну и то что вы написали работать не будет вообще. По тому как все циклы for у вас крутится в одном такте тактовой А надо бы сделать так чтобы в каждом такте выполнялся только один цикл (сравнение, перестановка). Что то типа такого ... when ST_START => cnt_i <= 0; cnt_j <= len-1; state <= ST_SORT; when ST_SORT => if (var(i) > var(i+1)) then var(i) <= var(i+1); var(i+1) <= var(i); end cnt_i <= cnt_i + 1; if (cnt_i == cnt_j) then cnt_i <= 0; cnt_j <= cnt_j-1; if (cnt_j==1) then state <= ST_READY; end end ... Удачи! Rob.
  6. Как сделать аппарат ИВЛ ?

    Приветствую! Наверное то что человек это не плата со сгоревшей микросхемой - которую можно перепаять, спиртиком отмыть и будет как новая. Тяжелый формы болезней, даже если тебя успешно откачали, будут давать знать (и далеко не радостным способом) о себе всю оставшуюся жизнь. Судя по всему вам мало что известно. "Опыт итальянских и китайских врачей подсказал, что хорошие результаты дает простой прием: переворот пациента с положения "на спине" в положение "на животе"" Удачи! Rob.
  7. Приветствую! Это вы что то спутали - что вниз что вверх структура счетчика одинакова. Даже наоборот - счет вниз на самом деле это счет вверх cnt <= cnt - K -> cnt <= cnt + ~K + 1'b1. Если по каким то причинам разрешение счета будет реализовано как управление K (например К это регистр в вашей логике) то это потребует разводки нескольких цепей от источника К к каждому разряду счетчика. А это доп проблемы и задержки. Для счет вверх нужна только 1 цепь к младшему разряду. На стары семействах если скорости не хватает то основная техника ускорения это pipeline счетчика - разбиваем счетчик на 2 ( или более) меньших по разрядности с регистром в цепи переноса в старшие разряды и проблем нет. Удачи! Rob.
  8. Приветствую! Основное правило повышения частоты - уменьшение длинны критических путей. Отсюда не использовать непосредственно результат сравнения в условиях. А добавлять регистр как в примере blackfin. Увы это не так. Для этого достаточно проанализировать когда на выходе схемы ускоренного переноса в структуре счетчика появляется 1. Но в тоже время схему ускоренного переноса внутри счетчика выгодно использовать в случае когда нужно именно задержка а само значение счетчика не важно. localparam CNT_WH = $clog2(CNT_DIV_MAX); logic [CNT_WH-1:0] cnt ; logic cnt_last; always @(posedge clk) begin {cnt_last, cnt} <= {cnt_last, cnt} + 1'b1; if (rst || cnt_last) begin {cnt_last, cnt} <= 2**CNT_WH+1-CNT_DIV; end // {cnt_last, cnt} <= {cnt_last, cnt} - 1'b1; // if (rst || cnt_last) begin // {cnt_last, cnt} <= CNT_DIV-2; // end end А если нужны и правильные значения то можно в паралель 2 счетчика - один для правильных значений, а один для быстрого сравнения. Это имеет смыл именно для упрощения логики, если нужно считать для разных начальных значений счетчика меняющихся динамически во время работы. А внешнему к счетчику компаратору одинаково с чем сравнивать. К тому же сейчас многоразрядные компараторы тоже могут синтезироаться с использованием carry-chain для объединения частичных результатов с LUT. Удачи! Rob.
  9. Как сделать аппарат ИВЛ ?

    Приветствую! Вот то что будет в многоточиях, если не удалось, и есть самое сложное. Особенно если выяснится спасения этим "матрасом" поспособствовало смерти. Сертификация оборудования, материалов и протоколов лечения снимает часть тяжести ответственности с врачей. Удачи! Rob.
  10. Приветствую! Логические проблемы решаются на нормальном симуляторе, а не по неполному куску кода. В купе с предварительным анализом что как можно сделать для оптимальной реализации заданного функционала. Операция деления очень затратная при реализации в FPGA. Фактически это будет комбинаторный делитель! Удачи! Rob.
  11. Приветствую. Увы - не будет у вас "полного счастья" - а будет fixed point. Ведь умножение на 1/x можно преобразовать как (value * round(2^N/x)) / 2^N. Выбирая величину числа N будете регулировать точность приближения к "полному счастью" Удачи! Rob.
  12. Приветствую! Вы это синтезируете? С операцией деления на произвольную величину? А вы уверенны что при синтезе у вас деление на переменную не заменяется на деление на ближайшую степень 2ки? Меня в школе учили что деление на x можно заменить умножением на 1/x. Но это давно было - сейчас такому может уже и не учат. Удачи! Rob.
  13. Приветствую! Моделирование и верификация для такой корки будет основной работой. Поэтому использовать встроенный в Qu симулятор для этого годится разве что для садо-мазо любителей. Если будете все писать с ноля, по спекам, то соответственно нужно делать сим. модель которая покрывает все требуемые сценарии как правильной таки и неправильной работы. Если же поделка "для себя" можно тупо передрать функционал с готовой base-r корки и ограничится только симуляцией основных сценариев, авось и так сойдет Удачи! Rob.
  14. Приветствую! Думаю вполне подойдет. Удачи! Rob.
  15. Приветствую! Не знаю, их много (lossless packet capture nic), я специально не занимался этим - мне было проще на FPGA сделать что нужно было. Поищите по теме "capture millions packet" можно найти инфу как настраивать стек при большом packet rate. Удачи! Rob.