Jump to content

    

RobFPGA

Свой
  • Content Count

    1504
  • Joined

  • Last visited

Community Reputation

0 Обычный

1 Follower

About RobFPGA

  • Rank
    Профессионал

Recent Profile Visitors

10198 profile views
  1. Приветствую! Поэтому я и говорю что сначала надо смотреть лог крит. путей timing анализа и расположение на кристалле после P&R. Чтобы понятно было что сколько слоев логики и что тормозить. Удачи! Rob.
  2. Приветствую! У Альтеры это называется Show-Ahead. Хотя при конфигурации корки пишут что в этом хуже времянка, но скорее всего это из-за доп логики в цепи управления чтением, а не шины данных. Надо пробовать. IMHO корка FIFO у Альтеры на мой взгляд не изменилась со времен MaxPlusII . Я когда начал опять с Альтерой работать первым делом свои корки FIFO адаптировал. Чтобы не страдать так мучительно. "Подвинуть" FIFO к приемнику можно как явно - используя place constrain, так и не явно просто добавив например 1-2 stage pipeline регистров на входах data/wr_en в FIFO. Это позволит при P&R разместить FIFO ближе к получателю. Хотя для начало все же надо смотреть как оно сейчас размещено. А то может быть слаки все-же из-за большого числа слоев логики, а не за роутинга. Свой вариант синхронного мини FWFT FIFO на 1-2 регистра пишется просто, фактически это FSM на 2 или 4 состояния. Удачи! Rob.
  3. Приветствую! Золотое правило лентяя - сложную работу делай медленно Если есть возможность упаковывать данные на стороне записи в FIFO то это упростить цепи на стороне чтения и заодно добавив дополнительный stage регистров между источником данных и входом FIFO. Позволив разместить его ближе к получателю на стороне чтения. Если "ленится" лень, то можно попробовать поставить для FIFO режим First Word Fall Thru. В этом режиме на выходе памяти FIFO обычно добавляется еще регистр что улучшает времянку чтения. Фактически добавление маленького FIFO на выход большого делает почти то же самое. В простейшем случае такое мини FIFO делают на регистрах на 1 или 2 слова. Что также позволяет "растянуть" связи по кристаллу. Удачи! Rob.
  4. Приветствую! Фантазировать на тему что там не так можно долго. Надо бы конкретику - какая частота чтения, что за корка фифо, с какими параметрами сгенеренное, как чтение управляется, что на выходе фифо подключено, и.т.д... Только анализируя всю цепочку где слак появился можно решат что делать. Удачи! Rob.
  5. Приветствую! Вопрос не в технической, а в организационной плоскости - кроме вас или заказчика никто не ответит КУДА двигаться. Ведь должна у вас быть прописана процедура начального запуска системы при включении питания. Все остальные фантазии на тему датчиков можно реализовывать после определения этих процедур (ну и ответственных за их проведение ). Удачи! Rob.
  6. Приветствую! С какой это стати? Транспортная задержка (задержка распространения) лишь задерживает сигнал, а не фильтрует его. Естественно есть и минимальная длительность импульса (inertial delay) которую цепь может пропустить. Которая и ограничивает макс. частоту сигнала в этой цепи. Но обычно эта задержка меньше чем transport delay. И при малых fanout и короткой цепи (input buffer -> input Clk) макc. частота обычно в 2-3 раза выше чем макс частота для клокового дерева - отсюда и выигрыш в частоте счета. Удачи! Rob.
  7. Приветствую! Ну не все так страшно - все зависит от структуры конкретной FPGA. На Xilinx вполне можно забабахать ripple-clock счетчик чисто на локальном routinge без привлечения global/regional clock network. Да и констрейнится все просто - от простейшего - "TIG - как получится" - до "from to" с заданием минимальной задержки физически реализуемой в данной FPGA для такой цепи (с неким запасом естественно). В первом случае общая задержка после останова счета будет непредсказуема и должна браться с потолка с запасом. Во втором она будет минимальна и предсказуема. Частота счета при этом ограниченна лишь частотой toggle первого триггера. Ну и естественно частотой буфера входного пина. К стати, похоже делают всякие мониторы наличия и качества входного клока. Удачи! Rob.
  8. Приветствую! Как раз при правильной организации накидать скриптами BD любого размера не сложно - у меня библиотечка на TCL из 2-3 десятков шаблонов заготовок наиболее часто используемых структур блоков на BD из которых создать нужную BD дело пары минут. Да и в текст интегрировать BD тоже не сложно - макросы вам в помощь в этом деле. Например вот так у меня коннектятся AXI шины. При некой организации это покрывает 99% процентов потребностей. `include "AXI4_macro.vh" ... // `AXI4_WIRE_BUS(m_ddr0_data, 36, 256, 4, 0, pcie_aclk, pcie_arstn, "false"); `AXI4L_WIRE_BUS(m_ddr0_ctrl, 32, 32, ctrl_aclk, ctrl_arstn); `AXI4S_WIRE_BUS(m_stream_out, 256, 0, 0, pcie_aclk, pcie_arstn, "false"); axis_if #(.TDATA_WH(256), TUSER_WH(0)) if_stream_in(.clk(pcie_aclk), .rst(~pcie_arstn)); pcie_sys_bd i_pcie_sys ( `AXI4_PORT_CONNECT(M00_AXI, m_ddr0_data), `AXI4L_PORT_CONNECT(M01_AXIL, m_ddr0_ctrl), `AXI4S_PORT_CONNECT(M02_AXIS, m_stream_out), `AXI4S_IF_CONNECT(S03_AXIS, if_stream_in), ... ); Была идея на tcl сделать пост процессор BD чтобы сразу генерировал враппер к BD с интерфесами да как то все лень. Как раз большой и жирный плюс Vivado в том что ты не привязан жестко к авторской концепции. И если есть желание можешь сделать так как тебе будет удобно. Вплоть до того что свой редактор BD написать с плюшками и шлюшками Удачи! Rob.
  9. Приветствую! Не разбираетесь. Можете быстро на проектировать компоненты в тексте TCL скрипта который потом сгенерирует вам нужную BD. И никакого клацанья мышкой. Удачи! Rob.
  10. Приветствую! На FPGA !? . Единственное оправданное применение ripple-clock это реализация счета внешних импульсов с максимальной частотой в старт/стоп режиме. Да и то только в тех FPGA где нет локальных быстрых клоков. Удачи! Rob. P.S. Как раз на CollRuner и делали такой счетчик/частотомер, работал до ~450 МНz при максимальной синхронной ~200 MHz.
  11. Приветствую! IMHO никак - в SV тип возвращаемый из функции должен быть определен на этапе компиляции. Поэтому либо заранее резервируете длинный вектор "logic [max_x*max_y-1:0]" с последующими плясками с приведением типов, либо извратится (если только для симуляции нужно) как то так: module tst; typedef bit dynarray_of_bit_t[]; function dynarray_of_bit_t gen_one (input int size); gen_one=new[size*size]; for (int ii=0;ii<size;++ii) begin gen_one[ii*size+ii]=1; end endfunction bit [2:0][2:0] arr3x3; bit [4:0][4:0] arr5x5; initial begin arr3x3 = {>> {gen_one(3)}}; arr5x5 = {>> {gen_one(5)}}; end endmodule Удачи! Rob.
  12. Приветствую! Обычным PID тоже вполне удается замыкать контур положения. При одном условии - не пытаться получить от мехники того чего она физически сделать не может. На входе от задатчика положения ставится корректирующий фильтр/формирователь траектории который гарантирует что усилия требуемые для изменения положения не будут насыщать (выводить из линейного режима) контур тока. В таком случае привод всегда находится в следящем режиме. Естественно этот вариант применим если возмущающее воздействия со стороны нагрузки не велики. Удачи! Rob.
  13. Приветствую! Не сложно - суммируете константу K=2^N/427.018... в регистр разрядностью N бит, старший бит которого и будет переключиться с нужной вам частотой. Выбором N можете получить почти любую точность деления. Удачи! Rob.
  14. Приветствую! Смотрим сюда и сюда: И размышляем - может быть линии PCIe "перекрученные" на этом разъеме? Удачи! Rob.
  15. Приветствую! Судя по всему ***_BUFG как бы намекает что вы куда-то к клоку или на цепь с огромным fanout пытаетесь подцепить ILA. А это не всегда возможно. То есть не все соединения что вы хотите физически возможны. Надо смотреть что за цепь, почему там BUFG, какой сигнал от ILA туда цепляется, и.т.д. В общем лазить/ковырять нетлист после добавления ILA. Удачи! Rob.