Jump to content

    

Timmy

Участник
  • Content Count

    849
  • Joined

  • Last visited

Everything posted by Timmy


  1. High-Voltage activation UPDI

    https://microchipdeveloper.com/mplabx:avr-updi-info - то есть PICkit 4 и Power Debugger. Можно и самостоятельно сколхозить схемку для разлочки, там не сложно.
  2. Оператор {*}, позволяющий непосредственно разворачивать список в несколько параметров, появился относительно недавно.
  3. Тогда непонятно, как кавычки могли повлиять. Ещё хочу заметить, чтобы в vlog можно было передать несколько ключей, заданных в Keys списком, как независимые параметры, а не одной строкой, нужно написать в compilation.tcl eval vlog +acc $Keys [list $CurrDirectoryPath/*.$Extension2Compile] list нужен, чтобы eval не разобрал путь с маской на несколько параметров, если в пути вдруг будут пробелы. Или в современном варианте vlog +acc {*}$Keys $CurrDirectoryPath/*.$Extension2Compile
  4. Это выглядит потрясающе. Для стандартного TCL парсера не должно быть никакой разницы. Я специально проверил в tclsh: set a "+define+TEST_NUMBER=3" set b +define+TEST_NUMBER=3 put [expr {$a==$b}] 1 Неужели у Квесты парсер какой-то не стандартный?
  5. Можно попробовать написать аналог $clog2, через define с операторами ?: внутри, возможно, прокатит за простую арифметику.
  6. Это нормально, на высоких частотах магнитное поле частично экранируется вихревыми токами и не проникает на всю глубину сердечника, в результате эффективное сечение уменьшается, пластинчатая структура от этого не спасает.
  7. Я уже поднимал однажды этот вопрос, и привёл вариант решения, к сожалению не самый удобный - создавать локальную копию проблемной глобальной переменной, и в конце блока переносить её в глобальную переменную.
  8. Насчёт всегда не могу гарантировать, а на stm32 успешно пользуюсь этим приёмом при оцифровке сигналов с высоким импедансом. К сожалению, там нет внутренней коммутации на землю, которую лучше всего использовать в качестве источника постоянного напряжения, обычно приходится одну внешнюю ногу для этого выделять.
  9. Вот ещё простой пример с арифметикой, где VHDL удобнее: надо умножить две переменных произвольной разрядности, записав результат в другую переменную произвольной разрядности, с выравниванием по старшим битам, при необходимости обрезав лишние младшие биты, либо дополнив недостающие младшие биты нулями. Для этой достаточно типичной операции я написал универсальную функцию align_left, которую можно вызвать: c := align_left(a * b, c'length); А вот с Верилогом, кажется, придётся мудрить.
  10. На примере задачи из топика: function bitsum(v:unsigned; l:natural) return unsigned is variable s:unsigned(l-1 downto 0); begin s := to_unsigned(0, l); for i in v'range loop s := s + resize(v(i downto i), l); end loop; return s; end function; И попробуйте сделать такую же удобную в использовании функцию общего вида на Верилоге.
  11. Я в VHDL использовал integer только для индексов, а собственно арифметику только на numeric_std.signed/unsigned, так что никаких проблем с длиной и 31-м битом не было. Правда, пришлось сделать свою библиотеку для удобных преобразований векторов и ещё всякой всячины. При этом арифметика на VHDL внезапно получается проще и надёжнее, чем на Верилог, но вот про чистую логику этого сказать нельзя.
  12. Если скорость позволяет, можно использовать трансляторы уровней с двойным питанием и "ручной" установкой направления, например SN74LVC8T245 и SN74LVC1T45.
  13. Вот тут достаточно распространённая ошибка - так как регистр SR содержит биты типа "w0", его категорически запрещено менять простыми операторами типа &= , надо гарантировать, что в те биты "w0", которые менять не планируется, будет записываться единица, иначе можно непреднамеренно сбросить любой бит, если он будет аппаратно установлен между чтением и записью регистра.
  14. Открою страшную тайну: при использовании <= будет та же самая проблема. Вот ещё код попроще: reg t=1'b0; always begin @(t); t <= 1'b1; t <= 1'b0; end То есть update flag регистру всегда устанавливается немедленно, если присваивается значение, отличное от текущего. А когда неблокирующим присваиваиванием присваивается значение, равное текущему видимому, update flag уже не сбрасывается :-). И это может внезапно привести к проблемам. Для решения пришлось завести локальный промежуточный регистр и присваивать его "глобальному" регистру в конце always блока. Я удивлён, что регистры Верилога вообще имеют update flag, это как-то VHDL-ем попахивает :-). К счастью, на практике ситуация крайне редкая, я вот первый раз столкнулся.
  15. Столкнулся со странной особенностью Верилога в Active-HDL 9.1. Если симулировать следующий код, то он зациклится: reg t1=1'b0,t2=1'b0; always @(t1) begin t2 = 1'b1; if(!t1)begin t2 = 1'b0; end end always @(t2) begin t1 = 1'b1; if(!t2)begin t1 = 1'b0; end end Несмотря на то, что по завершении каждого always процесса, и t1 и t2 сохраняют своё прежнее значение, симулятор считает промежуточное присваивание другого значения достаточным основанием для update event. Попробовал почитать на эту тему стандарт, ясных разъяснений не нашёл. По-моему, это какая-то дичь.
  16. Всё так. Сигналы можно использовать, но только там, где нужно. В данном случае, например, для SCL и SDA. А вот MyByte должен быть переменной. Кстати, переменные занимают меньше памяти и быстрее симулируются. Я тоже иногда использовал wait for 0, не всё можно удобно сделать на переменных.
  17. В качестве параметров вы используете сигналы, в которые перед вызовом процедуры выполнено отложенное присваивание. Первый по времени(старший) бит уходит ещё до того, как теневое значение сигнала синхронизировалось с видимым. Это можно пофиксить с помощью wait for 0s, тогда на временной диаграмме не будет видимых отличий, а лучше стараться вообще не использовать сигналы в тестбенчах без особой надобности, а если использовать, то без отложенных присваиваний.
  18. Для косвенной передачи списков параметров в произвольную команду нужно использовать стандартную команду tcl eval: set arg "-2008 version.vhd" eval vcom $arg И никаких извращений:).
  19. Интересно, зачем тут ПЛИС, если можно использовать простой микроконтроллер с генерацией импульсов таймером?
  20. Можно попробовать атрибут KEEP поставить на A_Mux.
  21. Например, тактировать конфигурирование по SPI внешнего генератора частоты, который потом выдаст на FPGA основной тактовый сигнал.
  22. А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь.
  23. Да, здесь наверное более уместно было бы Past Perfect, надо у лингвистов спросить:).
  24. В доке всё чётко сказано. have been - это форма глагола Present Perfect, которая обозначает действие, полностью завершившееся к настоящему времени, то есть во время калибровки АЦП уже не должен быть в power-off.
  25. А смысл? Там же сложные алгоритмы, по-любому потребуется процессор.