Jump to content

    

Timmy

Участник
  • Content Count

    848
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Timmy

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

8132 profile views
  1. Оператор {*}, позволяющий непосредственно разворачивать список в несколько параметров, появился относительно недавно.
  2. Тогда непонятно, как кавычки могли повлиять. Ещё хочу заметить, чтобы в vlog можно было передать несколько ключей, заданных в Keys списком, как независимые параметры, а не одной строкой, нужно написать в compilation.tcl eval vlog +acc $Keys [list $CurrDirectoryPath/*.$Extension2Compile] list нужен, чтобы eval не разобрал путь с маской на несколько параметров, если в пути вдруг будут пробелы. Или в современном варианте vlog +acc {*}$Keys $CurrDirectoryPath/*.$Extension2Compile
  3. Это выглядит потрясающе. Для стандартного TCL парсера не должно быть никакой разницы. Я специально проверил в tclsh: set a "+define+TEST_NUMBER=3" set b +define+TEST_NUMBER=3 put [expr {$a==$b}] 1 Неужели у Квесты парсер какой-то не стандартный?
  4. Можно попробовать написать аналог $clog2, через define с операторами ?: внутри, возможно, прокатит за простую арифметику.
  5. Это нормально, на высоких частотах магнитное поле частично экранируется вихревыми токами и не проникает на всю глубину сердечника, в результате эффективное сечение уменьшается, пластинчатая структура от этого не спасает.
  6. Я уже поднимал однажды этот вопрос, и привёл вариант решения, к сожалению не самый удобный - создавать локальную копию проблемной глобальной переменной, и в конце блока переносить её в глобальную переменную.
  7. Насчёт всегда не могу гарантировать, а на stm32 успешно пользуюсь этим приёмом при оцифровке сигналов с высоким импедансом. К сожалению, там нет внутренней коммутации на землю, которую лучше всего использовать в качестве источника постоянного напряжения, обычно приходится одну внешнюю ногу для этого выделять.
  8. Вот ещё простой пример с арифметикой, где VHDL удобнее: надо умножить две переменных произвольной разрядности, записав результат в другую переменную произвольной разрядности, с выравниванием по старшим битам, при необходимости обрезав лишние младшие биты, либо дополнив недостающие младшие биты нулями. Для этой достаточно типичной операции я написал универсальную функцию align_left, которую можно вызвать: c := align_left(a * b, c'length); А вот с Верилогом, кажется, придётся мудрить.
  9. На примере задачи из топика: 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; И попробуйте сделать такую же удобную в использовании функцию общего вида на Верилоге.
  10. Я в VHDL использовал integer только для индексов, а собственно арифметику только на numeric_std.signed/unsigned, так что никаких проблем с длиной и 31-м битом не было. Правда, пришлось сделать свою библиотеку для удобных преобразований векторов и ещё всякой всячины. При этом арифметика на VHDL внезапно получается проще и надёжнее, чем на Верилог, но вот про чистую логику этого сказать нельзя.
  11. Если скорость позволяет, можно использовать трансляторы уровней с двойным питанием и "ручной" установкой направления, например SN74LVC8T245 и SN74LVC1T45.
  12. Вот тут достаточно распространённая ошибка - так как регистр SR содержит биты типа "w0", его категорически запрещено менять простыми операторами типа &= , надо гарантировать, что в те биты "w0", которые менять не планируется, будет записываться единица, иначе можно непреднамеренно сбросить любой бит, если он будет аппаратно установлен между чтением и записью регистра.
  13. Открою страшную тайну: при использовании <= будет та же самая проблема. Вот ещё код попроще: reg t=1'b0; always begin @(t); t <= 1'b1; t <= 1'b0; end То есть update flag регистру всегда устанавливается немедленно, если присваивается значение, отличное от текущего. А когда неблокирующим присваиваиванием присваивается значение, равное текущему видимому, update flag уже не сбрасывается :-). И это может внезапно привести к проблемам. Для решения пришлось завести локальный промежуточный регистр и присваивать его "глобальному" регистру в конце always блока. Я удивлён, что регистры Верилога вообще имеют update flag, это как-то VHDL-ем попахивает :-). К счастью, на практике ситуация крайне редкая, я вот первый раз столкнулся.
  14. Столкнулся со странной особенностью Верилога в 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. Попробовал почитать на эту тему стандарт, ясных разъяснений не нашёл. По-моему, это какая-то дичь.
  15. Всё так. Сигналы можно использовать, но только там, где нужно. В данном случае, например, для SCL и SDA. А вот MyByte должен быть переменной. Кстати, переменные занимают меньше памяти и быстрее симулируются. Я тоже иногда использовал wait for 0, не всё можно удобно сделать на переменных.