Jump to content

    

novartis

Свой
  • Content Count

    389
  • Joined

  • Last visited

Community Reputation

0 Обычный

About novartis

  • Rank
    Местный

Информация

  • Город
    Свердловский регион

Recent Profile Visitors

5679 profile views
  1. Прошло пол года Перепаяли транзистор, управление оборотами вентилятора восстановилось!
  2. Попробуйте написать вместо write(L,"Cycle cnt. = "); следующее write(L,string'("Cycle cnt. = "));
  3. У вас в ARMCoreSimTop.vhd опечатка в строке 158: ARMSimMemSubsystem_Inst:entity ARMSimMemSubsystem generic map( -- Bus monitor control Вы же тут подключаете компонент, надо не ARMSimMemSubsystem_Inst:entity ARMSimMemSubsystem generic map( , а ARMSimMemSubsystem_Inst:component ARMSimMemSubsystem generic map(
  4. пишу в FIFO 64 бита на 250Mhz... в эти M20K пишется сразу 256бит.. и такая запись длится 3 такта 250Mhz - это как вообще?? При записи проверяете переполнение фифо? У сигналов wrfull и wrusedw есть задержка в такт или несколько тактов, лучше проверять wrusedw < FIFO_SIZE - 5, ну то есть небольшой запас оставить. Тоже самое и с сигналами rdempty и rdusedw, чтение нужно останавливать не когда rdempty = 1, а заранее, в зависимости от настроек самого фифо нужно подобрать, за один или два такта, промоделировать этот момент к примеру в моделсиме и подобрать. Хорошо бы вывести либо в сигналтап либо в регистры, доступные на чтение по pcie, флаг, указывающий, что была запись в переполненное фифо, и флаг, указывающий, что было чтение из пустого фифо - для отладки и статистики. На картинке показал как у меня одно из альтеровских двухклоковых фифо работает, вроде бы rdempty уже в 1 перешло, то есть фифо пустое, но rdusedw еще не обнулилось. А чтение остановил когда rdusedw = 2.
  5. Добавьте сигналы Avalon-MM в сигналтап, поймайте эту ситуацию, проанализируйте как следует, посверяйте с даташитом на Avalon-MM шину. Ну и сюда эту картинку. Еще посмотрите сразу в Таймквест, заданы ли у вас все необходимые констрейны и удовлетворены ли они.
  6. да, есть такая таблица для Аррии 10
  7. Я так и делаю. И если нужно сообщить из одного клока в другой о каком то событии, то приходится ставить схемы борьбы с метастабильностью и тому подобное. А если будет нулевое расхождение клоков - это ж сколько головной боли уйдет и можно сосредоточиться на других проблемах. И ресурсов кристалла будет меньше затрачено.
  8. Не понятно как то... Вот у меня есть проект с Transceiver Native Phy для 10G эзернета, и в проект добавлен CMU PLL. В проект входит ref_clk = 644Мгц (с копейками). Этот ref_clk подается в трансивер как rx_cdr_ref_clk (Rx Clock Data Recovery), он нужен для выделения опорной частоты из входящего rx потока. И тот же ref_clk подается в CMU PLL, из которого выходит ~5ГГц, эти 5ГГц подаются в трансивер как tx_serial_clk. Сам трансивер в итоге выдает два клока rx_pma_clkout и tx_pma_clkout, и эти два клока не синфазны, во всяком случае TimeQuest анализирует их как два разных частотных домена, и нужно принимать меры при пересечении данных этих доменов. Вот в описанном случае мне не понятно как можно сделать, чтобы "RX и TX работали на идентичных частотах с нулевым расхождением", а было бы неплохо такое получить.
  9. тоже вариант, встретил фразу, что это больше для входных пинов и надо в паре с set_min_delay я вижу причины) Схема рабочая, но не оптимальная, а когда появляются отрицательные слаки, то уже и не рабочая. Да и фальш пэс и мультицикл - это не кривые тайминги, а одни из рекомендуемых вендром способы описания временных ограничений.
  10. Есть модуль, который формирует 32 разрядный регистр reg32 и одноразрядный сигнал valid для него. Тактируется это частотой clk, сигнал valid выставляется на один такт, между валидами гарантированно достаточно большие паузы (ну скажем 100 тактов). Я передаю эти два сигнала в другой модуль, тактируется он тоже частотой clk. Во втором модуле можно по простому написать: always @(posedge clk) begin if (valid == 1'b1) reg32_r <= reg32; end Но тогда квартус будет думать, что reg32_r меняется на каждом такте, предъявляет жесткие требования по частоте, подтягивает модуль 2 поближе к модулю 1. Я пользовался следующей техникой. Задерживал валид на несколько тактов, защелкивание reg32_r делал через два такта от валида и прописывал false path между reg32 и reg32_r : reg valid_z0; reg valid_z1; always @(posedge clk) begin valid_z0 <= valid; valid_z1 <= valid_z0; if (valid_z1 == 1'b1) reg32_r <= reg32; end Логика у меня была такая, что квартус разводит reg32_r и reg32 не зависимо друг от друга, как ему удобно, во втором модуле reg32 появляется через скажем 1.5 такта клока, и когда я к нему обращаюсь во втором модуле в момент времени valid_z1, то эти данные стабильные. Но сегодня призадумался, а что если квартус так разведет проект по очень большому кристаллу, что reg32 появляется через скажем 3.5 такта клока, и тогда моя схема не работает корректно. Вроде можно попробовать прописать мультицикл на путь между этими двумя регистрами. set_multicycle_path -from {reg32} -to {reg32_r} -setup -end 2 set_multicycle_path -from {reg32} -to {reg32_r} -hold -end 1 То есть я рассчитываю, что квартус разведет с небольшим расслабоном, но если не уложится в два такта, то репортнет. Никогда не использовал констрейном мультицикл. Верный подход?
  11. Вчера осторожно пальцем притормозили вентилятор. В сигналтапе смотрю, какие обороты считываются, было 6570-6600, упало до 5700. Так что импульсы на 3 выводе J15 есть. Пока остановились на варианте перепаять мосфет, когда до этого дойдут руки (пока не кому паять). Накристальнся PLL - это что такое? У меня реализовано, что при превышении температуры все мои модули переводятся в состояние сброса, а также в состояние сброса переводятся IP корки (pcie и трансиверы). Мои модули работают в основном на частотах из корки pcie и из корок трансиверов, и если они сброшены будут, то и частот не будет, помимо того что они под сбросом. Doka - вы тоже самое имели ввиду под выключением накристальной PLL? Когда вентилятор не крутился вообще, температура кристалла была 74. Максимальную предельную частоту я задал 90 градусов, не много ли? Чип типа E, от 0 до 100 градусов.
  12. Есть плата от терасика DE5a-Net Arria 10 FPGA Development Kit. У нее есть радиатор охлаждения и вентилятор соответственно. Сам вентилятор крутится на максимальных оборотах очень громко, обороты у него варьируются от 1500 до 6600 об/с, чтоб не раздражал этот гул, зашиваю прошивку в плату и снижаю обороты до приемлемых (зависит от температуры кристалла, ну где-то 4000 об/с стоит обычно). Плата работает почти в нон стоп режиме два года. Через год после покупки начал разваливаться вентилятор (отвалилось несколько лопастей), связались с терасиком, объяснили ситуацию, заказали у них два вентилятора. Когда посылки приехали, поменяли неисправный на новый, один остался про запас. Вот прошел еще год. После новогодних праздников пришли в офис (плата все это время работала), вентилятор не крутится, температура кристалла 75 градусов. Выключили, поменяли на новый, прогнал тесты, плата живая, не подгорела. Смотрю, а обороты вентилятора 6600 (6570-6600), пытаюсь поменять - не меняется. Он и визуально крутится на все 6600. Для управления и мониторинга вентилятора на плате стоит микросхема MAX6650 (https://datasheets.maximintegrated.com/en/ds/MAX6650-MAX6651.pdf). Есть у нее разные регистры на запись и на чтение, проверяю, чтО вычитывается из нее - вычитывается все то, что и записывал. Делаю вывод, что микросхема эта живая. Схема управления такая: Как я понимаю, MAX6650 должна выдавать на ногу OUT разный уровень, в зависимости от записанного в нее значения скорости вентилятора, тем самым перекрывать полевой транзистор и регулировать уровень напряжения питания вентилятора. И сдается мне, что мосфет этот сдох. Вольтметром или осциллографом посмотреть возможности нет никакой. Хотелось бы услышать мнение форумчан по этому поводу. Действительно ли это мосфет может прекратить функционировать или же это очень надежный элемент? Или может есть другие варианты, почему не управляется вентилятор.
  13. Artur, на самой первой картинке у вас иерархия проекта в моделсиме top -> i1, а файл тестбенча у вас top_vhd_tst, с него то и должна начинаться иерархия. Если этот файл тестбенча у вас в проект моделсима добавлен, то старт симуляция надо делать с него. Переходите в моделсиме на вкладку Library, раскрываете work, там находите свой файл тестбенча, кликаете на нем правой клавишей мыши, выбираете Simulation without optimization. Откроется вкладка Wave. Ну или в командной строке написать vsim -novopt work.top_vhd_tst. Дальше уже добавьте сигналы в wave и стартаните симуляцию run 50us.
  14. U означает undefined, не определено. У вас входной клок и входные данные не заданы. На выходе соответственно тоже ничего не выдаётся. Незнаю как вы моделирует корку, но правильнее было написать ещё один файл тестбенча, назвать его к примеру tb, в нем подключить корку и подать на вход корки частоту (сгенерить клок) и входные данные (int_in - видимо целые числа подать на вход, а на выходе получите floating point).
  15. Два трансивера, больше не предвидится. По документации на чип - имеется 32 глобальных линии клока, 16 региональных, 384 Small periphery clock, 24 Large periphery clock (думаю это как раз мои клоки из трансиверов). Так что пару глобальных линий можно и потратить. это комбинаторика, это я по быстрому сообщение писал, не подумал, так то конечно квартус выкинет. altclkctrl я ставил, там в настройках ядра указывается для какой цели задается клок - ставил for global cljck. Даже ничего в sdc прописывать не надо. На тот момент я сделал глобальным клок для всей логики, от этого констрейны для параллельных данных от трансиверов перестали выполняться. Сейчас пытаюсь собрать проект, в котором часть логики (предварительная обработка параллельных данных из трансиверов) тактируется клоками из трансиверов (периферийными клоками), а уже дальнейшая логика тактируется клоками из pll, сгенеренными от тех же кварцев, что используются для трансиверов. С переходом через двухклоковое фифо.