Jump to content

    

Timmy

Участник
  • Content Count

    842
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Timmy

  • Rank
    Знающий
  • Birthday 02/01/1971

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Санкт-Петербург

Recent Profile Visitors

7910 profile views
  1. Насчёт всегда не могу гарантировать, а на stm32 успешно пользуюсь этим приёмом при оцифровке сигналов с высоким импедансом. К сожалению, там нет внутренней коммутации на землю, которую лучше всего использовать в качестве источника постоянного напряжения, обычно приходится одну внешнюю ногу для этого выделять.
  2. Вот ещё простой пример с арифметикой, где VHDL удобнее: надо умножить две переменных произвольной разрядности, записав результат в другую переменную произвольной разрядности, с выравниванием по старшим битам, при необходимости обрезав лишние младшие биты, либо дополнив недостающие младшие биты нулями. Для этой достаточно типичной операции я написал универсальную функцию align_left, которую можно вызвать: c := align_left(a * b, c'length); А вот с Верилогом, кажется, придётся мудрить.
  3. На примере задачи из топика: 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; И попробуйте сделать такую же удобную в использовании функцию общего вида на Верилоге.
  4. Я в VHDL использовал integer только для индексов, а собственно арифметику только на numeric_std.signed/unsigned, так что никаких проблем с длиной и 31-м битом не было. Правда, пришлось сделать свою библиотеку для удобных преобразований векторов и ещё всякой всячины. При этом арифметика на VHDL внезапно получается проще и надёжнее, чем на Верилог, но вот про чистую логику этого сказать нельзя.
  5. Если скорость позволяет, можно использовать трансляторы уровней с двойным питанием и "ручной" установкой направления, например SN74LVC8T245 и SN74LVC1T45.
  6. Вот тут достаточно распространённая ошибка - так как регистр SR содержит биты типа "w0", его категорически запрещено менять простыми операторами типа &= , надо гарантировать, что в те биты "w0", которые менять не планируется, будет записываться единица, иначе можно непреднамеренно сбросить любой бит, если он будет аппаратно установлен между чтением и записью регистра.
  7. Открою страшную тайну: при использовании <= будет та же самая проблема. Вот ещё код попроще: reg t=1'b0; always begin @(t); t <= 1'b1; t <= 1'b0; end То есть update flag регистру всегда устанавливается немедленно, если присваивается значение, отличное от текущего. А когда неблокирующим присваиваиванием присваивается значение, равное текущему видимому, update flag уже не сбрасывается :-). И это может внезапно привести к проблемам. Для решения пришлось завести локальный промежуточный регистр и присваивать его "глобальному" регистру в конце always блока. Я удивлён, что регистры Верилога вообще имеют update flag, это как-то VHDL-ем попахивает :-). К счастью, на практике ситуация крайне редкая, я вот первый раз столкнулся.
  8. Столкнулся со странной особенностью Верилога в 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. Попробовал почитать на эту тему стандарт, ясных разъяснений не нашёл. По-моему, это какая-то дичь.
  9. Всё так. Сигналы можно использовать, но только там, где нужно. В данном случае, например, для SCL и SDA. А вот MyByte должен быть переменной. Кстати, переменные занимают меньше памяти и быстрее симулируются. Я тоже иногда использовал wait for 0, не всё можно удобно сделать на переменных.
  10. В качестве параметров вы используете сигналы, в которые перед вызовом процедуры выполнено отложенное присваивание. Первый по времени(старший) бит уходит ещё до того, как теневое значение сигнала синхронизировалось с видимым. Это можно пофиксить с помощью wait for 0s, тогда на временной диаграмме не будет видимых отличий, а лучше стараться вообще не использовать сигналы в тестбенчах без особой надобности, а если использовать, то без отложенных присваиваний.
  11. Для косвенной передачи списков параметров в произвольную команду нужно использовать стандартную команду tcl eval: set arg "-2008 version.vhd" eval vcom $arg И никаких извращений:).
  12. Интересно, зачем тут ПЛИС, если можно использовать простой микроконтроллер с генерацией импульсов таймером?
  13. Можно попробовать атрибут KEEP поставить на A_Mux.
  14. Например, тактировать конфигурирование по SPI внешнего генератора частоты, который потом выдаст на FPGA основной тактовый сигнал.
  15. А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь.