Jump to content

    

ConstHw

Участник
  • Content Count

    56
  • Joined

  • Last visited

Community Reputation

0 Обычный

About ConstHw

  • Rank
    Участник
  1. Всем привет Есть комплект ZC706+ плата ЦАП/АЦП . Таких комплектов два. На каждом на процессоре запущено приложение, работающее поверх, LWIP, через который происходит управление - загрузка/чтение чтение данных из памяти, запуск DMA контроллеров для DAC/ADC. Синхронизацию радиочасти сейчас опустим, как завести обший клок на FPGA тоже понятно. Надо, чтобы обе платы запускали свои DMA транзакции (а значит и вещание в эфир) строго одновременно. Как я сейчас это вижу 1) В обе платы по сети загружаются данные. 2) Плата А переводится в режим slave и процессор ждет прерывания 3) Плата B в режиме мастер, получает по сети коману "давай" и посылает прерывание наружу, ждет N тактов и запускает свой DMA контроллер 4) Плата А получает прерывание и тоже запускает свой DMA 5) Profit! Соединить платы между собой можно через SMA разъем, на него у платы А можно вывести один из портов прерывания. А вот как быть с платой B? Как сформировать сигнал запуска с минимальной задержкой? Вытащить процесс синхронизации блоков между собой в RTL часть? Или все не так и есть другие способы решения? Спасибо
  2. Вы симулятор свой пишите? Похвально Вопрос не в том, как написать тикль, чтобы написать add_wave /bla/bla/sig0 radix -decimal Вопрос, как сделать так чтобы при добавлении сигнала его radix выбирался автоматически в зависимости от типа сигнала signed/unsigned. Тиклем вы можете написать эту директиву для конкретных сигналов, а такой вариант как раз и не устраивает.
  3. iosifk, Maverick, коллеги, обращаю внимание Я знаю, как настроить для отдельного сигнала. Из гуя, из консоли, как сохранить результат. Проблема - САПР понимал и менял радикс, не я руками.
  4. Всем привет Столкнулся с такой проблемой. Допустим есть сигналы logic signed [9:0] sig0; logic unsigned [9:0] sig1; logic [9:0] sig2; Ранее пользовался симулятором Cadence и когда вытаскивал эти сигналы на Waveform они отображались соответствующим radix sig0 - signed decimal, sig1 - unsigned decima, sig2 - hex Сейчас пользуюсь QusetaSim 10.4d и он никакой разницы для них не делают - все отображаются в виде global Radix, приходится менять radix каждого сигнала руками в GUI или в консоле/скрипте. Подскажите, есть ли способ настроить ModelSim чтоб он чуял типы сигналов и для явно обозначенных signed/unsigned применялся соответствующий radix?
  5. lexus.mephi Это синтезабельно? RobFPGA То что синтезатор вивады не умеет в массив интерфейсов =/ http://www.xilinx.com/support/answers/55135.html С этим проектом пока приходится пользоваться старой вивадой, но может кто в курсе - в 16.2 не починили еще? Пока решил поставил костыль расщеплением интерфейса на структуры, протаскивание через generate цикл внутрь блока и сборка обратно в интерфейс внутри.
  6. Всем привет У меня есть некоторый вычисительный блок, который я копирую N-раз в generate. Допустим я задал где то снаружи порт A и присвоил его в генерейте module foo_block #() ( input [7:0] port_a, input [7:0] port_b, output [7:0] port_c ); //------------------- logic [N-1:0][7:0] a_values; logic [N-1:0][7:0] c_rez; for (i = 0; i<N; i++) begin my_gen foo_block #( ) u_foo_block ( .port_a ( a_values [ i ] ), .port_c ( c_rez [ i ] ) ); end А вот к порту B я хочу иметь непосредственный доступ. То есть назначить каждый индивидуально my_gen[0].u_foo_block( .port_b(42) ); my_gen[0].u_foo_block( .port_b(17) ); my_gen[0].u_foo_block( .port_b(25) ) Как это сделать? Вариант создать массив B и задать в него руками значения, а потом присвоить в генерейте не подходит logic [N-1:0][7:0] b_values; assign b_vales[0] = 42; assign b_vales[0] = 17; assign b_vales[0] = 25; Не подходит потому что порт b на самом деле интерфейс, а Xilinx не поддерживает массив интерфейсов =/ Или поддерживает?
  7. Всем привет Среда Vivado 2016.1 Есть модуль, в который заходит 2 клока, регистр защелкнутый по первому клоку (cfg_clk) передается во второй регистр, который защелкивается по второму (clk) module foo ( input clk_cfg , input clk , input a , output b ) always @(posedge clk_cfg) begin reg_a <= a; end always @(posedge clk) begin reg_b <= reg_a; end Модуль предполагается использовать в режиме, когда оба эти клока будут одинаковые, т.е. браться физически из одного клока .cfg_clk (clk) .clk (clk) Сейчас синтезирую модуль отдельно и не могу понять,как правильно указать виваде что эти клоки суть один клок. Через визард создаю констрейн что порт clk главный и от него рожается клок cfg_clk create_clock -period 4.000 -name clk -waveform {4.000 2.000} -add [get_ports clk] create_generated_clock -name cfg_clk -source [get_ports clk] -multiply_by 1 -combinational -add -master_clock clk [get_ports {cfg_clk}] Однако после синтеза вижу inter clock paths violation, для цепи reg_b <= reg_a; поскольку требуемая задержка 0.000. Что я делаю не так? вариант set false path не предлагать.
  8. Всем привет Возник тонкий вопрос. Пользуюсь перечисляемым типом с предустановленными значениями и хочу этот тип переключать enum logic [1:0] {ALPHA = 0, BETA = 1, GAMMA = 2} muxer; always @(posedge clk) muxer <= cfg_wdata[1:0]; end Cadence Incisive при симуляции высыпает варнгинг This assignment is a violation of SystemVerilog strong typing rules for enumeration datatypes. Как правильно присваивать значение, чтобы избежать этого нарушения?
  9. 1) Смысл библиотек станет понятным, если нажав ctr кликнуть по ним мышкой и посмотреть содержимое :) 2) Список памятей поддерживаемых 7 серией http://www.xilinx.com/products/technology/...ng.html#7series Да, на тему что попробовать - Лаба 4, полшаговое руководство http://www.xilinx.com/support/documentatio...dded-design.pdf Цинк бук, там примеры по цинку, но примеры программ переносимы на Микроблейз http://www.zynqbook.com/download-book.html ПыСы и английский не очень для точного понимания. Это критическая проблема, которую надо решать чем скорее тем лучше, если вы хотите развиваться.
  10. Однако в XSIM это симулируется корректно. Интерфейсу в тестбенче можно вызвать таск, другому интерфейсу в RTL можно присвоить значение через assign. Да, SV
  11. Подскажите, как быть. Есть интерфейс, для простоты будет считать, что в нем только клок. interface foo_int #(); logic clk; task RunRst (); clk <= 0; endtask endinterface Дальше я объявляю этот интерфейс и хочу присвоить в него (в RTL коде, не в симуляции) какой то клок foo_int s0_cfg(); assign s0_cfg.clk = clk ; И вот тут падает ошибка : Illegal combination of driver and procedural assignment to variable clk detected (procedural assignment found in task/function RunClk Task нигде не вызывается, но Cadence все равно ругается. Замена в таске присвоения <= на = не меняет результат. Что я делаю не так? Как оставить возможность вызывать таски интерфейса в тестбенче, при этом сохраняя возможность присвоения в RTL? UPD http://stackoverflow.com/questions/1924986...ignment-warning Замена не помогает. Видимо я не понимаю что то важное про интерфейсы
  12. [-1] для примера, там сложная логика в цикле виде for (i=0;i<M;i++) register (i*8**MAGIC-FOO+i/3), то есть индексы выходят за обе границы. Симуляция не останавливается, варнинги сыпятся на компиляции, их много и это мешает вычитывать остальные
  13. Raven в первом случае ошибка присвоения assign в reg. И в обоих проблема (проблема ли?) чтения выходного регистра.