Последняя редакция схем/плат версии 2.0 - NS_V2_0_rev3_7
Прошивка для 2.0 - NS_V2_0_rev1_7E_Firmware Вкл./Отк. каналов А/В происходит по нажатию соотв. кнопок когда ни одно меню не выбрано, при выборе меню Sync эти кнопки перекл. источник синхронизации.
Для конфигурации DS1085 прошить соответствующей прошивкой МК, передернуть питание, подождать некоторое время пока на экране ЖК не выведется надпись об успешном завершении и выключить осцилл. Адрес DS1085 устанавливается равным 0x59 (89 по десятичной системе).
Данная прошивка просто делает автоматом то что можно сделать вручную из программы на ПК и если настраивать вручную из программы то она не нужна.
Внимание! При конфигурации к I2C не должно быть подключено ничего кроме DS1085.
Схема ревизия 3.2 - NS_3.0_rev_3.2.pdf Схема соединения ЖК с 16-ти битной шиной(только для ревизий ниже 3.2, в 3.2 HC573 уже есть на основной плате) - NS_3.0_HC573.pdf BOM(список компонентов) - BOM_NS3_rev3_2.htm
//---------------------------------------------------------------------------------------------------------- Прошивальщик МК (автор Ильдар) - NSFlashLoader2. Утилита для перепрошивки СР2102 VID/PID под NeilScope3 (автор Ильдар) - NSCP2102Utilite2.rar. Использование данных VID/PID для перепрошивки СР2102 под другие устройства категорически запрещено, они были получены по запросу у Silicon Laboratories Inc. и предназначены для использования только с NeilScope3 или другими версиями NeilScope.
Утилита для теста осциллографа - ns_test_util. Для запуска нужно скачать и установить Python 3.4 и PyQt5, при установке добавляем переменные окружения. Распаковать архив куда нибудь и набрать из этой папки в консоли - "python main.py"
Для последующих обновлений просто запускаем NSFlashLoader, и обновляемся. Джампер при этом трогать уже не нужно.
//---------------------------------------------------------------------------------------------------------- . . . Важные замечания по сборке
На плате не указана перемычка с 10-го вывода(INTRL) 74НС4052(U15) на вывод SWDIO МК, можно и просто подпаять пока на +3.3В в любое удобное переходное отверстие.
Хорошо, попробую как можно скорее отсимулировать, асинхронный сброс счетчика не хотелось бы использовать, quartus автоматом генерирует вот такую осциллограмму:
cout я думаю при асинхронном сбросе перейдет в ноль если был активный. Точнее смогу сказать позже.
------------------------------------------------------------------------------------------------------- Просимулировал, потеря отсчетов все равно есть, WE вроде вписывается в осциллограммы записи SRAM, но "впритык" хотя я может зря волнуюсь Не понравились иголки при переключении мультиплексора, они из-за того что пришлось убрать регистры из мультиплексоров так как иначе мин. вообще не записывается.
Да, забыл выкинуть ненужные буферные регистры на выходах АЦП
Их не нужно выбрасывать иначе не будет правильно работать разрешение записи макс./мин., они для синхронизации данных АЦП "под" клок который внутри ПЛИС. ---
Вот осциллограмма, компаратор сравнивает DATA_A с MAX_DATA_A/MIN_DATA_A, на WE пока не обращайте внимания, есть некоторые идеи , как додумаю выложу.
А вот без "буферного" регистра, вроде все нормально, но нужно учитывать что приход данных с АЦП не полностью соответствует реальности, лучше все же перестраховаться и оставить регистры не так много сэкономим если их выкинуть, всего 16 lut.
И еще присмотрелся к прошлым осциллограммам предложенного Вами варианта, увидел что WE "не вписывается", переход из 0 в 1 происходит уже после смены адреса памяти.
По таким осциллограммам вообще о чем-либо судить невозможно !!! Отсутствия буферного регистра на них не видно, т.к. ADC_DATA_A != DATA_A. А по-поводу работы всех триггеров и счетчиков в ПЛИСе я уже писал - они работают всегда неправильно(если на схеме заявлено срабатывание по фронту, то они срабатывают по спаду и наоборот). В чем причина такого поведения я не знаю и это очень мешает разработке !
P.S. Возвращаясь к прежней просьбе, очень бы хотелось увидеть реакцию вычитающего счетчика на синхронный и асинхронный сброс.
По таким осциллограммам вообще о чем-либо судить невозможно !!! Отсутствия буферного регистра на них не видно, т.к. ADC_DATA_A != DATA_A.
Вторая осциллограмма без буферного регистра, DATA_A "запаздывает" относительно ADC_DATA_A из-за задержки прохождения сигнала от "входа" ПЛИС(ADC_DATA_A) до "выхода"(DATA_A). Меня тоже удивило что регистры макс./мин. записывают значения по спаду клока когда clk_en = 1. Но это только так кажется, все же они срабатывают по фронту, но из-за задержки прохождения сигнала до вых. WR_MAX_A относительно clk_en на осциллограмме мы такую странность и видим. Обратите внимание данные на выходе регистров появляются чуть раньше чем спад клока, то есть они никак не могут срабатывать по спаду.
Quote (LazyCat)
Возвращаясь к прежней просьбе, очень бы хотелось увидеть реакцию вычитающего счетчика на синхронный и асинхронный сброс.
Что именно? Я ведь выкладывал с асинхронным сбросом, cout перейдет в 0 если был активен, тоже самое счетчик перейдет к изначальному состоянию, чуть позже создам отдельный проект со счетчиками и выложу результаты. ---
При любом коэффициенте теряется последний минимум(обвел красным), это конечно не так страшно, как и не страшны были потери при вычислениях последнего максимума при нечетных коэффициентах прореживания(при четных ничего не терялось) в моем варианте. Теперь о небольших изменениях записи в память, я предлагаю все же для сохранения полной синхронности(не только внутри ПЛИС) пускать клок на SRAM напрямую с генератора на вывод CE, а на WE только разрешение записи, Write Cycle No. 1 (CE Controlled) стр. 8 из - даташита. Клок в любом случае желательно отключать для экономии батареи, я уже упоминал про это.
По поводу вычитающего счетчика был не прав насчет cout, вот схема:
По аналогу, так как не нашли пока подходящего и доступного реле поставил просто фиксированный делитель. R-2R конечно хорошо тем что меньше номиналов и фиксирован импенданс по входу ОУ, но как быть с неточным коэффициентом деления? В даташите на AD603(Figure 1) это явно видно.
Странно, вроде у меня выходило все нормально, посмотрю внимательнее
Quote (LeftRadio)
я предлагаю все же для сохранения полной синхронности(не только внутри ПЛИС) пускать клок на SRAM напрямую с генератора на вывод CE, а на WE только разрешение записи
Но приводит к дополнительным извратам при чтении памяти На досуге обдумаю.
Quote (LeftRadio)
R-2R конечно хорошо тем что меньше номиналов и фиксирован импенданс по входу ОУ, но как быть с неточным коэффициентом деления
Почему неточным ? Строгая линейка коэффициентов деления: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 ! Или имелся ввиду нестандартный ряд ?
P.S. За осциллограммы сбросов большое спасибо, теперь нарисую законченный вариант.
Сообщение отредактировал LazyCat - Вторник, 05.07.2011, 11:19
Я имел ввиду в дБ , ну да неважно очень они уж нестандартны для осциллографа... Не очень хочется иметь пределы типа 5.7832 В/дел....
А на счет извратов с выключением генератора, так там всего 1 транзистор... Как вариант можно в качестве генератора поставить те же DS1077, DS1085 и никаких доп. транзисторов С чтением никаких проблем главное что бы CE был в 0, а RW в 1 и это легко реализуемо. ---
Нет войне!
Сообщение отредактировал LeftRadio - Вторник, 05.07.2011, 11:42
Сегодня думаю закончу в ПЛИС интерфейс к МК и всякие вспомогательные сигналы и можно разводить плату, потом не сложно будет внести изменения если чего в ПЛИС поменяется. ---
Так мы же даже не определились с количеством управляющих сигналов
Чем меньше, тем лучше С МК клок, сигнал запись/чтение, старт, ну и на МК сигнал окончания записи, это не считая 8-ми битной шины естественно. Все остальные режимы/настройки через регистры в ПЛИС. Может что еще нужно?
Quote (LazyCat)
P.S. В последнем варианте на выходах мультиплексоров разве нет регистров ?
Есть.
Quote (LazyCat)
Посмотрел прогу для PC. Теперь вроде все нормально, но удивили делители типа 0.02 mV/div Раньше ведь лучше было.
Это надо просто зайти в Hardware>Hardware settings и сохранить настройки для используемого аналога, забыл просто поправить чтобы по умолчанию вбирался один из вариантов. ---
Нет войне!
Сообщение отредактировал LeftRadio - Среда, 06.07.2011, 16:44
Ммм... Совсем не понял смысла в SEL_BANK на разрешение счета и вижу что Вы совсем не хотите использовать клок в обход ПЛИС, это приведет к ненужному потреблению при чтении из памяти, плюс к неправильным осциллограммам записи. Также не пойму почему Вы против входных регистров для синхронизации данных, как по мне лучше потратить 16lut и иметь гарантированный результат чем потом столкнутся с проблемным захватом макс./мин. И еще, зачем использовать счетчик triig_counter для подсчета семплов после срабатывания триггера? Ведь это лишит возможности синхронизироваться по длительности фронта. Я не думаю что будет сложно поставить еще один счетчик для этого. ---
Добрый день, господа! Будьте добры, скажите, сильно ли отличается HX8352 от ILI9320? Есть дисплей с этим контроллером "на шару" и хочется попробовать его в Вашем осциллографе!
День добрый, к сожалению отличается сильно по управлению да и разрешение у ILI9320 меньше - 320х240, а у HX8352 - 400х240.
------------------------------------------------------------------------------------------------------------ to LazyCat. Вот как я себе представляю дизайн в ПЛИС, Ваш вариант еще не рисовал, свой правда просимулировал только то что не касается триггера, триггер не успел. Немного опишу логику работы, для начала записи с предысторией переводим R_W в 1 ждем сколько надо времени и разрешаем триггер сигналом EN_TRG, память продолжает циклически записываться, при срабатывании триггера, который может срабатывать и на заданную длительность фронта/спада(обычный режим или на длительность выбирается битом SDATA1[4]), начинает считать счетчик lpm_counter5(который загружается асинхронно в период чтения из памяти), При окончании счета останавливается счетчик адреса SRAM и блокируется сигнал SRAM_WE предотвращая дальнейшую запись в память. Также генерируется сигнал WR_READY для того чтобы МК знал что запись окончена, загружается адрес на котором остановились в счетчик Read_counter. Затем МК отключает внешний генератор тактовой, выбирает какой канал считывать сигналом SEL_BANK(по умолчанию в нуле). В двухканальном режиме сначала вычитываем один канал, Read_counter при этом считает "вниз", а затем другой канал в обратную сторону. Двухканальный/одноканальный режимы выбираются битом SDATA1[5]. При одно канальном режиме, не важно А или В, Read_counter считает только вниз. Режимы без предыстории и однократный запуск реализуются элементарно, что бы запустить без предыстории достаточно установить EN_TRG одновременно с установкой в 0 R_W, в режиме однократного запуска тоже самое. Размер захватываемого окна в обеих случаях зависит от того что грузим в lpm_counter5.
Совсем не понял смысла в SEL_BANK на разрешение счета
Он выбирает читаемый канал, а заодно служит стробом для переключения адреса при чтении.
Quote (LeftRadio)
вижу что Вы совсем не хотите использовать клок в обход ПЛИС, это приведет к ненужному потреблению при чтении из памяти, плюс к неправильным осциллограммам записи.
Ненужное потребление незначительно и им можно пренебречь, а над осциллограммами я еще думаю
Quote (LeftRadio)
почему Вы против входных регистров для синхронизации данных
Буферные регистры тактируются совершенно аналогично регистрам max и min и поэтому выгоды никакой не дают. Получается масло масляное.
Quote (LeftRadio)
зачем использовать счетчик triig_counter для подсчета семплов после срабатывания триггера
Схема триггера делалась абсолютно автономной и не требует от МК дополнительных алгоритмических действий. Она отличается минимальным числом элементов и управляющих сигналов, а также работает в режиме с предысторией и без. А режим синхронизации по длительности фронта я не понимаю, за всю свою практику ни разу не использовал и даже не знаю в каких приборах он есть Если он так уж необходим, то можно над этим подумать. По поводу Вашего триггера могу сказать, что кроме чрезмерной сложности он имеет большой просчет: нельзя так подавать сигнал на тактовые входы inst27 и inst30, т.к. возможный мусор вызовет сбои в работе.
P.S. И еще неправильно используется MCU_CLK_REG.
Сообщение отредактировал LazyCat - Четверг, 07.07.2011, 21:15
Ненужное потребление незначительно и им можно пренебречь
Не согласен, особенно при однократном запуске, получается пока читаем, обсчитываем, выводим на экран, опрашиваем кнопки и т.д. клок исправно тикает вместе со всеми регистрами потребляя ненужную энергию. Скачал утилиту для расчета потребления, получается около 25-30мА, это не считая еще генератора ~20мА, итого около 50мА, достаточно много для продолжительной автономной работы, остальная схема ведь тоже потребляет, лучше этот ток "отдать" подсветке ЖК. Плюс моего предложения еще в том, что можно сделать экономный режим работы осцилла, когда выборки осциллограмм будут происходить не одна за другой, а через определенные промежутки времени и на этом реально можно экономить заряд батареи например когда она разряжена, и подзарядить негде.
Quote (LazyCat)
Буферные регистры тактируются совершенно аналогично регистрам max и min и поэтому выгоды никакой не дают.
Да, тактируются аналогично, но захватывают данные по другому, так как нет запрещения записи сигналом WR_MAX/WR_MIN, и компараторы после этих регистров сравнивают данные которые приходят к ним на входы одновременно чем гарантируется что сигналы WR_MAX/WR_MIN поступят на регистры макс./мин. до следующего фронта тактового сигнала. Без этих синхронизирующих регистров захват работает "на пределе", поплыви чего нибудь скажем из-за температуры и захват может не произойти.
Quote (LazyCat)
Схема триггера делалась абсолютно автономной и не требует от МК дополнительных алгоритмических действий.
А как происходит выбор размера предыстории? Или он фиксировано равен окну после?
Quote (LazyCat)
А режим синхронизации по длительности фронта я не понимаю, за всю свою практику ни разу не использовал и даже не знаю в каких приборах он есть :(
Ну вот например(нам конечно все эти режимы не реализовать, просто не влезут):
• Запуск по параметрам окна . Окно – это зона с верхней и нижней границами, между которыми находится значение уровня запуска. Схема запуска срабатывает, когда уровень сигнала пересекает границу в направлении выхода из зоны. Следующий запуск возможен после возврата сигнала в зону окна.
• Рантовая синхронизация . Рант – это импульс положительной или отрицательной полярности имеющий меньший уровень, чем все остальные импульсы в регулярной последовательности. Запуск развертки осуществляют только те импульсы, амплитуды которых попадают в заданный пользователем диапазон согласно условий когда импульс пересечет 1-й заданный порог уровня, но не пересечет 2-й заданный порог уровня и повторно пересечет 1-й порог. Это вид синхронизации позволяет производить запуск развертки по сигналу, отличающемуся только по уровню в последовательности периодического сигнала, когда частота и длительность для всего сигнала одинакова. В этом режиме можно так же задавать диапазон длительностей ранта и напряжений, в этом случае запуск развертки будет происходить в случае нахождения длительности и амплитуды ранта внутри либо за пределами заданного диапазона.
• Запуск по скорости нарастания (спада) сигнала . Скорость нарастания (спада) сигнала - это время, в течение которого происходит изменение (нарастание или спад) сигнала от заданного уровня 1 к заданному уровню 2. Запуск развертки осуществляют только те сигналы, у которых скорость нарастания попадает в заданные пределы. Скорость нарастания (спада) сигнала не следует трактовать только как время нарастания или спада сигнала, это более широкое понятие, включающее в себя общее времени измерения сигнала от уровня 1 до уровня 2, в течение которого сигнал может многократно изменять вектор, лишь бы он находился в пределах зоны образованной уровнями 1 и 2.
• Запуск по условиям длительности сигнала . Запуск происходит по положительным или отрицательным импульсам заданной длительности, имеющим амплитуду выше или ниже заданного уровня. Также задаются условия контроля длительности – больше, меньше, в пределах или за пределами заданных значений. Запуск будет происходить в случае выполнения заданных условий запуска.
• Запуск по глитчу; Запуск по ширине глитча – частный случай режима запуска по длительности. Запуск происходит по импульсам, имеющим заданную длительность или входящим в заданный диапазон длительностей. Напряжения и диапазоны напряжений в расчет не берутся.
• Запуск по интервалу . В отличие от режима синхронизации по глитчу, в режиме синхронизации по интервалу значение имеет не длительность импульса, а длительность интервала, разделяющего два последовательно идущих фронта одной и той же полярности — положительной или отрицательной. Этот режим синхронизации можно использовать для регистрации интервалов, длящихся меньше или больше заданного времени. Можно также определить диапазон длительностей, в котором или вне которого должен находиться интервал между двумя фронтами, чтобы вызвать запуск развертки.
• Логический запуск. Этот вид синхронизации позволяет организовать запуск по логической схеме, входами которой являются каналы осциллографа (канал1, 2,3 и 4 и вход внешней синхронизации). Для формирования логической функции имеется 4 логических оператора (И, НЕ-И, ИЛИ, НЕ-ИЛИ). По каждому из входов можно независимо установить высокий (уровень логической единицы) или низкий (уровень логического нуля) уровень.
• Отложенный запуск . Используется главным образом при регистрации однократных событий, и обычно с предпусковой задержкой. С его помощью можно фиксировать моменты пропадания сигнала. Запуск происходит по истечении времени ожидания, исчисляемого от последнего прохождения уровня запуска.
• По качеству. При этой синхронизации необходимо задействовать два канала осциллографа. Это режим синхронизации, при котором положительный или отрицательный фронт одного сигнала (канала) служит разрешением на запуск от другого сигнала (канала). В этом режиме задается интервал времени или количество событий после прихода разрешающего фронта, по истечении которого должен произойти запуск.
• По состоянию . При этой синхронизации необходимо задействовать два канала осциллографа. Запуск по квазистабильному уровню одного канала, согласно которому сигнал, определяющий условие запуска на втором канале, должен быть выше или ниже заданного уровня. Отличие от запуска по качеству состоит в том, что сигнал первого канала должен именно оставаться ниже или выше заданного уровня, а не временно переходить в области выше или ниже этого уровня.
• ТВ синхронизация. Обеспечивает устойчивый запуск от стандартного (или специального) композитного видеосигнала с возможностью выделения строк. Возможно исследование сигнала в системах PAL, SECAM, NTSC, HDTV и пр.
Но если не надо оно нам так не надо, можно просто выкинуть этот блок, а сложность блока синхронизации у меня не выше чем у вас, особенно если выкинуть счетчик синхронизации по длительности.
Quote (LazyCat)
нельзя так подавать сигнал на тактовые входы inst27 и inst30, т.к. возможный мусор вызовет сбои в работе.
Да, согласен нельзя, нужно поставить еще ИЛИ, на один вход клок, на другой вых. компаратора.
Quote (LazyCat)
И еще неправильно используется MCU_CLK_REG.
Почему не правильно? Вполне правильно В вашем варианте просто экономия одного вывода МК, но при этом клок уже не отключишь. ---
Нет войне!
Сообщение отредактировал LeftRadio - Пятница, 08.07.2011, 09:29
Плюс моего предложения еще в том, что можно сделать экономный режим работы осцилла
Мой вариант тоже работает при отключении клока(даже схема проще за счет исключения триггерного дифференциатора), но такое решение всеравно спорно. Решать Вам
Quote (LeftRadio)
Да, тактируются аналогично, но захватывают данные по другому
Так ведь захват и происходит по такту !!!
Quote (LeftRadio)
А как происходит выбор размера предыстории? Или он фиксировано равен окну после?
Этот вопрос мы обсуждали отдельно и Вы сказали, что окна предыстории и основной выборки могут быть одинаковыми(при этом даже нагляднее видно место срабатывания триггера).
Quote (LeftRadio)
Ну вот например(нам конечно все эти режимы не реализовать, просто не влезут)
Нечто подобное было на радиорадаре и мы с kison это обсуждали. Все виды синхронизации слишком специфичны и врядли нужны карманнику. Но можно добавить регистр mask, как у MisterDi, и малыми затратами получить запуск по параметрам окна.
Quote (LeftRadio)
Да, согласен нельзя, нужно поставить еще ИЛИ, на один вход клок, на другой вых. компаратора.
Без триггеров не обойтись
Quote (LeftRadio)
Почему не правильно?
Предположим Вы записали нужные данные в один регистр, а в другой уже записать не получится, т.к. запортятся данные в первом
Сообщение отредактировал LazyCat - Пятница, 08.07.2011, 10:46
Да, но при этом считывать память уже нельзя, то есть опять проблемы с сигналом WE, если клок пустить в обход ПЛИС то для чтения из памяти нужно отключить его, а этого сделать нельзя так как тогда не прочитаем память, выход - делать WE как у Вас, но тогда проблемы с осциллограммой записи из-за задержек... Хотя Ваш вариант конечно более простой и красивый.
Вот кстати еще данные по потреблению:
Только не совсем понял обведенное синим, это ток статики без внешней нагрузки или максимальный нагрузочный ток выводов.
Quote (LazyCat)
Так ведь захват и происходит по такту !!!
По такту, но у "синхронизирующих" регистров не запрещается запись сигналом clk_en и если у регистров записи макс./мин. этот сигнал не придет раньше фронта клока они ничего не запишут, а это очень просто может произойти задержись данные от АЦП еще на самую малость, что легко может произойти при повышении температуры, при изменении топологии печатной платы, разброса входных емкостей EPM570 от микросхемы к микросхеме и даже при не достаточно чисто отмытой платы что может повысить емкость шины.... Цена вопроса два 8-ми битных регистра, не вижу причин для спора
Quote (LazyCat)
Нечто подобное было на радиорадаре и мы с kison это обсуждали. Все виды синхронизации слишком специфичны и врядли нужны карманнику.
Согласен, действительно карманнику это может и не надо, значит нужно выкинуть этот блок. Не смотрел как у MisterDi сделано, в кратце принцип захвата по окну при помощи регистра mask не опишите?
Quote (LazyCat)
Без триггеров не обойтись :(
Ну можно и триггеры поставить.
Quote (LazyCat)
Предположим Вы записали нужные данные в один регистр, а в другой уже записать не получится, т.к. запортятся данные в первом
Цена вопроса два 8-ми битных регистра, не вижу причин для спора
Хорошо, убедили, оставляем буферные регистры.
Quote (LeftRadio)
принцип захвата по окну при помощи регистра mask не опишите?
Стал подробнее разбираться - бред получается, слишком уж специфичные требования должны быть у входного сигнала для праильного выделения нужной группы бит Лучше уж так. При этом, если занести в соответствующий регистр 0x00 или 0xFF, получим синхронизацию по фронту или по спаду. А если занести различные значения, то можно получить синхронизацию при выходе входного сигнала из заданного коридора или при входе его туда
Спасибо, вот еще чего не пойму откуда берутся сигналы start/stop и почему у start два входа, или это один start другой stop?
Не совсем понял почему используется именно aclr а не aload, ведь в первом случае счетчик будет считать до 0xFFFF и неважно что мы в него грузим. Вот осциллограмма:
------------------------------------------------------------------------------ Просимулировал с некоторыми изменениями, в любом случае может не правильно работать так как на выходе cout счетчика проскакивают иголки.
откуда берутся сигналы start/stop и почему у start два входа
Я же уже писал : коротким ноликом по одному входу запускается синхронизация с предысторией, а по второму входу - без предыстории. Короткий нолик по входу stop прерывает ожидание синхронизации(точнее насильно ее запускает) для случая, когда неправильно выставлен порог триггера и он никогда не сработает
Quote (LeftRadio)
Не совсем понял почему используется именно aclr а не aload
Вы правы, здесь нужен именно aload.
Quote (LeftRadio)
в любом случае может не правильно работать так как на выходе cout счетчика проскакивают иголки.
Не совсем понял, что Вы имели ввиду. Но если все же правильно понял, то элемент AND2 все исправит
P.S. на схеме компараторы должны быть включены в разные режимы (больше/меньше) !
Сообщение отредактировал LazyCat - Суббота, 09.07.2011, 18:08
Прошу прощения как то пропустил, теперь понятно, спасибо, но мне больше нравится вариант с просто 1/0 - start/stop.
Quote (LazyCat)
Но если все же правильно понял, то элемент AND2 все исправит :)
Это первое о чем я подумал, но иногда иголки совпадали с 1 такта и алгоритм нарушался
Quote (LazyCat)
P.S. на схеме компараторы должны быть включены в разные режимы (больше/меньше) !
Бесмыслица, Вы уж извините. Давайте представим, выставили уровень триггера в 128, на входе данные 64, выход комаратора a>b = 0, a<b =1, значит на выход XOR = 1, теперь данные пересекли порог и равны к примеру 130 и теперь a>b = 1, a<b =0, XOR = 1....
Прикрепил мой вариант на основе Вашего, полностью синхронный по "обнаружению и захвату" фронта/спада. Занимает он всего 43 макроячейки, 8% от EPM570. Ваш вариант к примеру занимает 49 макроячеек(с двумя компараторами), но вопрос естественно не в этом, просто из-за иголок алгоритм сбоил и заставить нормально работать схему я не смог.
В кратце алгоритм, Start изначально в нуле и загружает в lpm_counter0 размер окна, сбрасывает lpm_dff1 и сбрасывает/устанавливает lpm_dff0 в зависимости от сигнала H_OFF который отвечает за захват с предысторией( лог. 0) или без(лог. 1). Для начала захвата переводим Start в 1 чем снимается очистка/загрузка lpm_dff1/lpm_counter0. Теперь алгоритм разветвляется на два - с предысторией и без.
С предысторией вых. lpm_dff0 равен 1, так как H_OFF = 0, то триггер запрещен, а работа счетчика разрешена. Сигнал EN находится все время в 1 - случай макс. дискретизации. При достижении счетчиком нуля он автоматически повторно загружает в себя значение размера окна - WIN[15..0] и разрешается захват сигнала TRG_OUT триггером lpm_dff0, выход lpm_dff0 переходит из 1 в 0 чем запрещается работа счетчика и снимается блокировка захвата синхронизации. Все останавливается(запись в SRAM не запрещается, SRAM продолжает записываться) до срабатывания lpm_dff1 по фронту/спаду, после срабатывания опять разрешается работа счетчика и когда он опять досчитает до нуля выход lpm_dff0 переходит из 0 в 1, сигнал WR_READY переходит из 0 в 1 сигнализируя об окончании захвата и останавливая счетчик адреса SRAM(на схеме этих узлов нет, решил отладить отдельно).
Для примера я выбрал размер окна для обеих случаев всего 5 точек, иначе просто не смог бы "отскриншотить" осциллограммы так что бы весь алгоритм был виден.
Осциллограмма с предысторией:
В режиме без предыстории вых. lpm_dff0 равен 0, так как H_OFF = 1, то триггер разрешен, а работа счетчика запрещена. Все остановлено до срабатывания lpm_dff1 по фронту/спаду, после срабатывания разрешается работа счетчика и когда он досчитает до нуля выход lpm_dff0 переходит из 0 в 1, сигнал WR_READY аналогично с предыдущим режимом. Все, получаем после момента синхронизации фиксированное количество точек.
Осциллограмма без предыстории:
Осциллограмма с предысторией и перезапуском сигналом Start:
но мне больше нравится вариант с просто 1/0 - start/stop.
Кроме усложнения схемы, это не экономит даже количество управляющих сигналов Но как хотите... Принципиально одним логическим элементом можно перейти к Вашему варианту.
Quote (LeftRadio)
Это первое о чем я подумал, но иногда иголки совпадали с 1 такта и алгоритм нарушался
Ни на одной осциллограмме иголок я не видел, но в любом случае элемент AND2 можно заменить на триггер
Quote (LeftRadio)
Бесмыслица, Вы уж извините. Давайте представим, выставили уровень триггера в 128, на входе данные 64,
А для кого я это писал:
Quote (LazyCat)
если занести в соответствующий регистр 0x00 или 0xFF, получим синхронизацию по фронту или по спаду.
?
И второй компаратор я добавил по Вашей просьбе для добавления возможности захвата по окну. Но принцип его работы, я так понимаю, Вы не поняли ?
Сообщение отредактировал LazyCat - Суббота, 09.07.2011, 21:41
Кроме усложнения схемы, это не экономит даже количество управляющих сигналов Но как хотите...
Да какая разница Компилятор там может все оптимизировать что получится даже проще , зато уж точно не будет сбоев , а сигналов меньше, всего 2, один для запуска/перезапуска(при неправильно выставленном уровне триггера), второй из внутреннего регистра для выбора предыстория/без, так что к МК всего один провод Кстати с двумя компараторами мой вариант занимает всего на 3 макроячейки больше Вашего.
Quote (LazyCat)
Ни на одной осциллограмме иголок я не видел
Они то есть, то нет в зависимости от подключенных выводов для отслеживания сигналов и от компиляции к компиляции, я сам очень был удивлен , я же не из-за вредности , сначала у меня получился совсем монстроподобный вариант, он был откинут в пользу Вашего более простого, но из-за сбоев пришлось модифицировать
Quote (LazyCat)
А для кого я это писал:
Посыпаю голову пеплом, невнимателен, совсем замотался. ---
Нет войне!
Сообщение отредактировал LeftRadio - Суббота, 09.07.2011, 22:11
Короткий нолик по входу stop прерывает ожидание синхронизации(точнее насильно ее запускает) для случая, когда неправильно выставлен порог триггера и он никогда не сработает
Т.е. в моем случае захват будет всегда и истинные данные будут выведены на экран, что позволит правильно установить порог триггера. Для Вашего сигнала start/stop это невозможно и потребуется еще сигнал !!!
Ну так мой вариант на основе Вашего и отличается практически заменой "обычных" триггеров более "хитрыми"
Quote (LazyCat)
Для Вашего сигнала start/stop это невозможно и потребуется еще сигнал !!!
У Вас - один сигнал старт, другой форсированный старт(stop), два сигнала да еще один хитрый требующий доп. логики. В моей модификации если сигнал синхронизации так и не приходит память продолжает записываться, достаточно в МК поставить таймер на таймаут(в Вашем варианте он тоже нужен так что разницы нет) и по таймауту просто остановить запись переводом сигнала Start в 0 и вычитать память на сколько нужно... Единственный случай когда нужен еще один сигнал это когда нужна развертка с вообще выкл. синхронизацией. Насколько этот режим нужен? Правда этот сигнал можно формировать из внутреннего регистра, а не с внешней ноги. ---
Нет войне!
Сообщение отредактировал LeftRadio - Суббота, 09.07.2011, 23:02
неправильно организована логика работы с предысторией
Почему неправильно? Запрещаем триггер пишем нужное количество точек, разрешаем триггер, после срабатывания пишем еще такое же количество точек, останавливаем запись, именно так у меня и работает. И еще имейте ввиду если у регистра есть вход aset, то вых. у него будет по умолчанию в 1 и если даже сделать сброс, то после снятия сигнала сброса вых. все равно вернется в 1. Именно поэтому я и сделал две установки - aset и aload. ---
Я думал Вы из моей схемы поняли Тогда поясняю для предыстории. 1. разрешаем триггер(т.е. разблокируем триггер inst27, ловящий условие, регистр inst33 и запускаем счетчик inst17) 2. как только появится COUT, на выходе регистра inst33 возникнет 1, которая остановит счетчик(через элемент исключающего ИЛИ), если были пропущены условия(т.е. 1 на выходе inst27), или счетчик продолжит свою работу, если условий еще не было(т.е. 0 на выходе inst27). 3а. если счетчик стоял, то по первому же условию в триггер inst27 запишется 0, что запустит счетчик опять, и после возникновения COUT весь процесс остановится и запись в ОЗУ тоже (сигнал R_W перейдет в 0). 3б. если счетчик продолжал считать, то по первому же условию в триггер inst27 запишется 1 и весь процесс остановится и запись в ОЗУ тоже (сигнал R_W перейдет в 0). Подробнее объяснить уже не смогу.
Quote (LeftRadio)
Именно поэтому я и сделал две установки - aset и aload.
Это само собой разумеется, именно поэтому я и не ставил ничего лишнего
Не понимаю зачем нам разрешать триггер до записи окна предыстории! Алгоритм ведь простейший - триггер изначально запрещен, записываем необходимое количество отсчетов предыстории, сбрасываем и останавливаем счетчик записанных отсчетов, при этом память продолжает записываться циклически по кругу, разрешаем синхронизацию, (запись некоторого количества точек необходима только что бы гарантированно получить предысторию в единственном случае - если условие синхронизации произойдет сразу после разрешения синхронизации), ждем условия синхронизации и когда оно происходит записываем в память такое же количество точек что и перед разрешением синхронизации, и останавливаем запись в SRAM с сигнализацией что запись окончена. МК зная какое значение счетчика предыстории/послеистории просто вычитывает из SRAM в двое больше точек чем значение счетчика(предыстория + послеистория, а "посредине" момент синхронизации). Все, процесс можно повторять Это я не только к Вам пишу, может кому не до конца ясно как "оно" работать должно.
Я совсем не понял для чего у Вас два случая записи с предысторией, один когда триггер произошел во время записи предыстории, второй когда нет, ведь во время записи предыстории событие синхронизации не нужно вовсе!!!
Quote (LazyCat)
Это само собой разумеется, именно поэтому я и не ставил ничего лишнего :)
Да опять таки какая разница!!!! Компилятор может его так заоптимизировать что может быть проще в конечном итоге чем другой вариант который выглядит на схеме проще чем этот, главное правильный алгоритм, синхронность для исключения сбоев из-за задержек и т.д. и количество занимаемых макроячеек.
Бессмысленный спор до тех пор пока не будет ясно что доработанный мною вариант имеет правильный/неправильный алгоритм и остальные минусы/плюсы, пока мне он больше нравится простотой управления запуском/перезапуском, полной синхронностью алгоритма. ---
Нет войне!
Сообщение отредактировал LeftRadio - Воскресенье, 10.07.2011, 17:36
Совершенно согласен, особенно если Вы не читаете то что Вам пишут !!! И про компилятор я не согласен - он никогда не выкинет совершенно ненужный элемент demux1_2. Но это Ваше с ним личное дело. Я же приучен не ставить за ненадобностью даже лишний инвертор. Уж простите !
Quote (LeftRadio)
мне он больше нравится
В этом я как раз не сомневаюсь и очень рад за Вас Но мой вариант всеравно проще, понятнее, удобнее в управлении(кстати, лишнего сигнала управления R_W у меня тоже нет) и полностью синхронный. Но, повторяю, я его не навязываю ! Вы сделали свой выбор, на этом и остановимся !
Совершенно согласен, особенно если Вы не читаете то что Вам пишут !!!
Читаю, но из описания алгоритма работы схемы непонятно почему оказывается неверный алгоритм другой схемы без информации о алгоритме который надо получить Я описал алгоритм который нужно получить и схема полностью ему соответствует, если это не так то мало самого этого факта нужно еще и почему, и что будет не правильно работать. Можно ведь тоже сказать - вот тот мостовой кран не правильный и нарисовать свой, но это мало даст информации по технологии машиностроения! И только потратив уйму времени можно анализируя нарисованный кран хоть к чему то дойти.
Я тут же соглашусь что у меня ошибка/недоработка если это хоть как то подтвердится, пока подтверждений неправильного алгоритма моей модификации Вашего варианта я не вижу. Ваш усложненный алгоритм с разветвлением, извините, но пока мало о чем мне говорит кроме своей ненужности по причинам описанным мною выше.
Quote (LazyCat)
И про компилятор я не согласен - он никогда не выкинет совершенно ненужный элемент demux1_2.
Еще как выкинет возможно вместе с "ненужными" управляющими сигналами других блоков. Это же не "конечная" схема, это "алгоритм схемой", с таким же успехом можно было бы описать этот алгоритм на Verilog/VHDL/AHDL, а компилятор его реализует наиболее оптимальным образом доступным компилятору. Да и в любом случае demux1_2 это всего лишь два ИЛИ и один НЕТ, я просто объединил их в один блок. Все равно в EPM240 не влезем что нам ресурсы ПЛИС солить что ли и спорить только из-за пары макроячеек? Зато удобней, почему чуть ниже.
Quote (LazyCat)
В этом я как раз не сомневаюсь и очень рад за Вас :)
Вы берете фразу из контекста, я там написал почему нравится. Если было просто нравится потому что мой, то я бы сейчас настаивал на своем монструозном варианте и не брал бы Ваш за основу как более экономный по ресурсам. Я например не думаю что Вы отстаиваете свой вариант только потому что он Ваш, я отстаиваю схему исходя из параметров этой схемы - удобство, наименьшее количество доп. алгоритмический действий со стороны МК и т. д. И я очень Вам признателен за активное участие в практической разработке дизайна ПЛИС.
Quote (LazyCat)
Но мой вариант всеравно проще, понятнее, удобнее в управлении
Проще, понятней это только может так казаться. Проще описал выше, понятнее Вам, другому может нет. Это не главные аргументы. А удобнее, то как раз не удобней, захват с предысторией - короткий ноль по одному входу. Без предыстории короткий ноль по другому. Форсированный старт еще один управляющий сигнал. Сомневаюсь что это удобней одного запускающего/перезапускающего/останавливающего сигнала с фиксированным активным уровнем. Плюс если триггер был установлен неправильно, то никаких доп. алгоритмических действий от МК по сравнению с Вашим вариантом не требуется.
Quote (LazyCat)
кстати, лишнего сигнала управления R_W у меня тоже нет
Его можно легко совместить с сигналом Start, я тоже подумал что он не нужен.
Quote (LazyCat)
...и полностью синхронный.
Нет никакой синхронности в захвате данных триггером inst27, кстати компилятор ругается о неправильных задержках клока/данных для этого триггера:
Code
Warning: Circuit may not operate. Detected 1 non-operational path(s) clocked by clock "CLK" with clock skew larger than data delay. See Compilation Report for details. ..... Not operational: Clock Skew > Data Delay: From inst30: To inst6
inst30, inst6 это соответственно inst33(lpm_dff8), inst27(DFF) у Вас. Это может и ничего не значить, так как это относительно "основного" клока CLK, а может привести к сбоям, метастабильному состоянию триггера и т.д. Вы сами недавно мне указывали на подобные недостатки! Я попытался исправится и теперь стараюсь строго придерживаться синхронности.
Нда, буковок много, но осилил все и, надеюсь, правильно понял
Quote (LeftRadio)
А удобнее, то как раз не удобней
По мне так гораздо удобнее, к тому же парой элементов можно перейти к Вашему способу управления, но как я уже говорил, не люблю ставить лишних элементов !!!
Quote (LeftRadio)
Плюс если триггер был установлен неправильно, то никаких доп. алгоритмических действий от МК по сравнению с Вашим вариантом не требуется.
Неправда, действия совершенно одинаковые(те же самые, что были бы и при любом третьем варианте).
Quote (LeftRadio)
Нет никакой синхронности в захвате данных триггером inst27
Нет синхронности с чем ??? И Вы сами на него ответили, так что это не аргумент. Синхронность синхронности рознь. К тому же это главный элемент схемы. Его работу Вы не поняли и потому Ваш вариант полностью неработоспособен Но я предлагаю именно на нем остановиться !!! Просто дальше будет хуже
Да, я неправильно высказался, одинаковые, но на один вывод больше либо наворотить логики больше чем в моем варианте. Такая же картина и с запуском, для того что бы использовать один вывод МК для запуска синхронизации нужно поставить демультиплексор с битом управления(с предысторией/без), Выход МК>демультиплексор>"двойной" вход старта синхронизации. И в чем проще?
Quote (LazyCat)
Нет синхронности с чем ???
С любым тактовым сигналом, желательно с глобальным. Выход триггера тактовым сигналом считать нельзя если не дай бог в какой то момент изменение уровня на входе данных и на входе клока inst27 совпадут, то триггер может перейти в метастабильное состояние, к чему это приведет не знаю. Зачем все это?
Quote (LazyCat)
Его работу Вы не поняли
Его работу я понял, Вы ее расписали, спасибо, а вот зачем он именно так работает действительно не понял, я уже писал про это...
Quote (LazyCat)
и потому Ваш вариант полностью неработоспособен
Quote (LazyCat)
Просто дальше будет хуже
Извините, но это просто смешно, или мне опять приводить аналогии? ---
Да, я неправильно высказался, одинаковые, но на один вывод больше либо наворотить логики больше чем в моем варианте.
К чему Вы это сказали я не понял, и выводов, как мы сообща выяснили, у Вас больше
Quote (LeftRadio)
Его работу я понял, Вы ее расписали
Ничего Вы не поняли, и работу D-триггера я не расписывал, т.к. это ОСНОВА и расписана она в любой книге по цифровой технике !!! И про синхронность я устал повторять. ЗДЕСЬ СОВЕРШЕННО ДРУГОЙ СЛУЧАЙ. Все всему соответствует !!! Но если уж Вам хочется полного синхронизма с глобальным тактовым сигналом, то это все подробно изложено в проекте MisterDi. Но, на мой взгляд, это неоправданная сложность !!!