Jump to content

    

EvgenyNik

Свой
  • Content Count

    597
  • Joined

  • Last visited

Community Reputation

0 Обычный

About EvgenyNik

  • Rank
    Знающий
  • Birthday 05/28/1979

Контакты

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

Информация

  • Город
    г. Чебоксары

Recent Profile Visitors

2586 profile views
  1. Цитата(zombi @ Dec 21 2015, 23:50) и как с этим бороться?Как выше подсказали - попробовать подгрузить выход драйвера. Встретился мне как-то (давно ещё) такой случай, когда вместо обычного шинного формирователя (АП5, АП6, 244, 245) поставили какой-то очень быстрый и на шине данных стали возникать ошибки. Оказалось всё просто - сигналы RD и WR приобрели излишнюю колебательность и как бы поступали дважды на управляющие входы.
  2. Слишком мощный выход драйвера может приводить к генерации колебаний на верхних гармониках.
  3. Цитата(Gun_931 @ Dec 18 2015, 17:19) внутренней памяти fpga для обработки данных не хватает, поэтому было решено задействовать оставшуюся память флешки (сейчас стоит epcs16)А Вы её для хранения и считывания констант хотите использовать? А то из текста можно подумать, что в качестве ОЗУ.
  4. Можно поинтересоваться - а с какой целью сие надобно? Если для того, чтобы поставить более мощную пин-ту-пин совместимую ПЛИС, то можно и новую плату собрать...
  5. Если допустить, что аналоги имеют иное значение конфигурационных ячеек, нежели исходные чипы, то логично запросить у производителя. Но компилятор то чей? Если забугорный, то он просто не сможет генерировать "дополнительные биты" и тогда всё стандартно. А гадать по начинке кристалла бессмысленно. В комнате 2 светильника по 5 плафонов - сколько клавиш у выключателя? К тому же, если не включать компрессию, то возможно, файл всегда создаётся максимального размера. Это надо проверить. Загрузочный автомат же может быть очень тупым - перекидал n бит и остановился.
  6. Цитата(ViKo @ Oct 23 2015, 16:00) Можно и RC фильтром преобразовать в аналоговый сигнал и подать на АЦП.Можно. Но сначала надо решить вопрос с требуемой точностью. Результат на выходе фильтра будет зависеть не только от заполнения ШИМ, но и от амплитуды генератора, а та, в свою очередь, может зависеть не только от стабильности источника питания, но и от напряжения на конденсаторе фильтра (если выход слабый). Опять же, автор не указал - насколько быстро меняется заполнение во времени. Фильтр даст усреднённое значение, фактически, за несколько периодов. А вдруг, у него ШИМ генерирует сложный процесс и ему нужен каждый период.
  7. Приходится угадывать, конечно... Шина, случаем, не 5В? Сталкивался с похожей ситуацией, когда в результате ошибного подключения через пин попадало повышенной напряжение на локальное питание ПЛИС, отчего это питание задиралось и часть логических сигналов просто "проваливались" ниже уровня единицы, т.к. недотягивали. Есть ещё вариант - всплески напряжения в шине при коммутациях, которые теоретически могут приводить ко всякого рода защёлкиваниям.
  8. Цитата(Golikov A. @ Oct 20 2015, 23:07) а у вас недурная подпись в сообщениях так почему?Ага. Потому что, имея ТЗ на коловорот и подключив всё своё представление о том как бывает плохо, когда что-то не учтено, изобретают дрель с вентильным движком ЦитатаRobFPGA слушать надо , дело говорит А я с тем, что он говорит и не спорю. В конечном счёте все тонкости задачи известны только самому ТС. Не в полной мере ясно - что же, всё-таки, требуется: иметь максимально линейный перенос шкалы времени (тогда это больше отводит в сторону счётчиков, интерполяций, цифровых PLL и т.п., реализующих интегральные подстройки) или же чёткое квитирование прохождения определённых этапов (это ближе к фифо и около того). MegaVolt, а Вы можете написать - в каких пределах могут быть clk1 и clk2?
  9. Надеюсь, что будет понятно в продолжение о двух счётчиках, сама идея: Простой пример (clk1 < clk2) У нас бегущий секундомер натикивает за 5 секунд значение 7. Но мы то знаем (по синхросигналу), что должно быть 5. Делим 7/5=1.4. Происходит 1ый тик нашего неточного генератора, суммируем 0+1 = 1, это меньше чем 1.4, поэтому счёт вычисленных тиков пока 0. Происходит 2ой тик, суммируем: 1+1 = 2, что более, чем 1.4, поэтому вычитаем 2-1.4=0.6 и увеличиваем счётчик вычисленных тик 0+1 = 1 3ий: 0.6+1=1.6, 1.6-1.4=0.2, вычисленный 1+1=2 4ый: 0.2+1=1.2, вычисленный сохраняем 2 5ый: 1.2+1=2.2, 2.2-1.4=0.8, вычисленный 2+1=3 6ой: 0.8+1=1.8, 1.8-1.4=0.4, вычисленный 3+1=4 7ой: 0.4+1=1.4, 1.4-1.4=0 (сошлось!), вычисленный 4+1=5 (тоже получили что надо) Таким образом, мы на 7 тиках вычислили 5 требуемых с каким-то более-менее равномерным распределением. Другой случай (clk1 > clk2) Тоже самое, но сейчас наш секундомер отстаёт и за 5 секунд натикивает всего 3. Делим 3/5 = 0.6 1ый тик: 0+1 = 1, что больше чем 0.6, поэтому считаем 1, разница 1-0.6=0.4 2ой тик: 0.4+1 = 1.4, что более, чем 0.6, поэтому 1+1 = 2, разница 1.4-0.6=0.8, что снова больше, чем 0.6, значит считаем 2+1=3, остаток 0.8-0.6=0.2 3ий тик: 0.2+1 = 1.2, 3+1=4, 1.2-0.6=0.6, 4+1=5, 0.6-0.6=0. Снова сошлось: за 3 тика насчитали 5. --- Разница в том, что на ПЛИСке один из счётчиков (тот, на чьё значение надо делить) удобно сделать с фиксированным порогом счёта до числа равно двум в некой целой степени, чтобы делить простым сдвигом.
  10. Цитата(MegaVolt @ Oct 20 2015, 17:15) Пропуски и повторы допустимы если они вызываны разностью частот. И не допустимы если они вызваны тормозами синхронизатора. Интересует решение и для второго случая когда clk1 > clk2А если так: 1. В домене clk2 создаём счётчик cnt2 (пусть от 0 до 127) 2. В домене clk1 создаём счётчик cnt1, разрядность которого позволяет с некоторым запасом не "кувыркнуться" через ноль, пока счетчик (cnt2) досчитает до 127 3. При достижении счётчиком cnt2 значения 127, сбрасываемся в 0 и формируем запрос в домен clk1 о передаче значения cnt1. 4. Получив запрос, счётчик cnt1 пересылает своё значение и сбрасывается в 0. 5. Таким образом, мы получаем какое количество тактов clk1 накапливается в счётчике cnt1 за время, пока счётчик cnt2 считает интервал в 128 тактов clk2. 6. Представив это значение в формате с фиксированной точкой мы получаем масштабный коэффициент, позволяющий вести эквивалентный счёт от тактов clk2 с представлением времени в домене clk1 в течении следующего интервала, пока не произойдёт обновление информации. Пример: cnt2 пробежал интервал в 128 тактов clk2, присланное значение cnt1 = 2309 clk1 Считаем 7 младших бит - дробной частью, тогда в десятичных получаем cnt1/cnt2 = 18,0390625. Теперь на каждый такт clk2 мы прибавляем к образе cnt1 значение 18,0390625: 18,0390625, 36,078125 и т.д. На следующем интервале cnt1 покажет число 2314, к примеру, и мы скорректируем наш масштабный коэффициент.
  11. Цитата(MegaVolt @ Oct 20 2015, 15:16) Это я так понял запрос ответ с синхронизацией. Многовато кодов пропускает Да, это запрос-ответ. Но и ЦитатаДля однобитного счётчика это позволяет реализовать обычный синхронизатор правда при условии что первая частота меньше второй.работало бы на такой же "скорости обмена". Чтобы пропускало меньше кода надо для счёта использовать не саму частоту тактирования, а поделенную на 2..4.
  12. FIFO не подойдёт, т.к. подразумевается разница частот, а значит буфер или переполнится или будет пустым. Кодmodule cnt_copy (    input    clk1,      input    clk2,                  output reg    [7:0]    cnt1,      output reg    [7:0]    copy2 ); reg    ready1 = 0; reg    ready2 = 0; reg    ready1_l1, ready1_l2; reg    ready2_l1, ready2_l2; reg    [7:0]    cnt1_l; always @ (posedge clk1)      begin      ready2_l1 <= ready2; ready2_l2 <= ready2_l1;      cnt1 <= cnt1 + 1;      if (ready2_l2)          begin          if (~ready1)              begin              cnt1_l <= cnt1;    ready1 <= 1'b1;              end          end      else          begin          ready1 <= 1'b0;          end      end     always @ (posedge clk2)      begin      ready1_l1 <= ready1;    ready1_l2 <= ready1_l1;          if (ready1_l2)          begin          if (ready2)              begin              copy2 <= cnt1_l; ready2 <= 1'b0;              end          end      else          begin          ready2 <= 1'b1;          end      end endmodule Результат [attachment=96189:osc.gif] Указать таймбара стоит, как раз, на моменте, начиная с которого происходит передача значения "3". Далее тоже видно как передаются значения. С пропусками из-за синхронизации, но без искажения передаваемого значения.
  13. У MAX 10 есть на борту PLL. У него есть выход Locked. Даже если Вам "услуги" PLL не нужны, то можно завести клок на него только ради этого сигнала, чтобы обеспечить начальный сброс регистров в исходное положение стандартными средствами (подобие ресета). Не факт, что в дальнейшей поддержке не придётся в угоду фиттеру играться с настройками компилятора. Обнаружите, к примеру, что с галочкой Ignore initial проект весит меньше, обрадуетесь. И только когда-нибудь где-нибудь вылезет некорретная работа.
  14. Цитата(sonycman @ Oct 16 2015, 17:19) Ток всего 2 миллиампера - но почему так мало? LVTTL не многим лучше - даже до 16 ма не дотягивает Насколько я понимаю - это не ошибка, и 3.3 вольтовые драйвера очень слабые?Первая мысль, которая возникла - ограничивают мощность на выходе (потому и на более низком TTL ток можно развить выше). Но величина 16мА уже на 3.0В указывает, что дело не просто в ограничении мощности. Вероятно, дело в том, что последние поколения ПЛИС всё хуже и хуже справляются с перенапряжением (пусть и кратковременным) на выводах. И чтобы не создавать перенапряжения при коммутациях в области уровней, близких к критическим, ток там ограничивается. Как-то убил Циклон, вогнав в резонанс RLC-нагрузку на выходе 24МГц. На живом другом глянул - примерно 6В в амлитуде от выхода 3.3! Снизил ток в порядке эксперимента - помогло. А вообще, от силового применения выходных каскадов ПЛИС надо уходить. ЦитатаВстроенный осциллятор тоже расстроил - генерирует частоту в диапазоне 55-116 МГц, без возможности выбрать более точное значение.У MAXII/V тоже разброс был неслабый 3.33-5.66МГц. Для простых вещей хватает. Кстати, если есть некий внешний периодический низкочастотный сигнал, то при расположенности к искусственным трудностям , можно заделать цифровую подстройку, потратив десятков 5-7 логических ячеек.
  15. Цитата(zombi @ Sep 29 2015, 19:01) Код    always    @ (negedge clk)          begin          if (stage_r == 0)    wramag_r <= 1; // это нужно, чтобы избавиться от глитча при возврате из режима записи (см. формирование wram_o)          else    wramag_r <= 0;          end Подскажите вот это как в граф редакторе на триггере реализовать? Фактически, здесь написано: всегда при отрицательном фронте clk присваивать wramag=1, если stage равен 0 и, если иначе, то обнулять этот wramag. Так и делаем: 1. инвертируем clk (надо же по отрицательному фронту защёлкивать) и подаём на тактовый вход DFF 2. биты stage заводим на ИЛИ-НЕ и подаём на вход данных D 3. защёлкивам в DFF 4. снимаем результат с Q [attachment=95736:dff.jpg] p.s. А зачем Вам манипуляции с OE и CS? Если используется один чип памяти и его порты работают через ПЛИС, то пусть по умолчанию всегда будет выбран и всегда в режиме выдачи данных с текущего адреса. Ему (чипу ОЗУ) всё равно, а Вам - экономия ресурсов на ПЛИСке.