Последняя редакция схем/плат версии 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В в любое удобное переходное отверстие.
Спешил, поставил как пример, по корпусам вроде совместимы с 24LC.
Я так и понял, просто уточнил. Да, корпуса один в один
Добавлено (02.03.2012, 18:27) --------------------------------------------- В новой схеме, входной делитель, при номиналах, показанных на схеме, обеспечивает коэфициент деления 1:100, для 1:10 верхний должен быть 900к, нижний 100к... Или надо 1:100? Обозначено как 1:10...
quote Информация к размышлению : серия AD8330_AD833(0-3) некоторые на форуме знают о них , но молчок. AD8330ARQZ-R7 AD 78,53 UAH FEATURES: Fully differential signal path, also used with single-sided signals Inputs from 0.3 mV to 1 V rms, rail-to-rail outputs Differential RIN = 1 kOhm; ROUT (each output) 75 Ohm; Automatic offset compensation (optional) Linear-in-dB and linear-in-magnitude gain modes 0 dB to 50 dB, for 0 V < VDBS < 1.5 V (30 mV/dB) Inverted gain mode: 50 dB to 0 dB at -30 mV/dB x0.03 to x10 nominal gain for 15 mV < VMAG < 5 V Constant bandwidth: 150 MHz at all gains Low noise: 5 nV/sqrHz typical at maximum gain Low distortion: < - 62 dBc typical Low power: 20 mA typical at VS of 2.7 V to 6 V
APPLICATIONS Pre-ADC signal conditioning 75 Ohm cable driving adjust
Информация к размышлению : серия AD8330_AD833(0-3) некоторые на форуме знают о них , но молчок.
Да наверно все знают. Но такие штуки для более серьезных приборов. Где нужна полоса 50 мегагерц и выше. Чтоб использовать AD8330 нужно сдвинуть уровень на входе с помощью AD8129/30/31/32/38, потом собственно VGA. Итого две микры вместо одного усилителя. Кроме того это лишнее потребление и приличная, опять таки -лишняя, цена. А параметры в общем то и не улучшатся. ИМХО AD8330 для карманного прибора - это гаубица для стрельбы в воробья.
Да, так и надо, с делителями 1:1 и 1:100 получаем коэффициенты 1:1(10х,5х,2х,1х,1/2х,1/5х), 1:100(1/10х, 1/20х,1/50х, 1/100х, 1/200х, 1/500х). Единственное это 1/200х и 1/500х будут практически бесполезными.
---------------------------------------------------------------------------------------------- Обновил схему/плату в шапке. ---
to volk0203, ну можно такие, какая разница За программку спасибо.
Quote (Dante_strelok)
Переменные конденсаторы
Спасибо, но пускай уже будут такие какие есть, они есть наверно у всех и найти их вроде несложно.
Промелькнула еще одна шальная мысль А может поставим вместо генератора DS1086? Стоит не намного дороже, даст возможность, просто и энерго-эффективно, понижать тактовую для самописца. ---
Нет войне!
Сообщение отредактировал LeftRadio - Суббота, 03.03.2012, 21:24
Там же по ссылке DS1086LU: Описание : IC ECONOSILL 3.3V SS 8-USOP
----------------------------------------------------------------------------------- Это я предлагаю так сказать последний "штрих" , сейчас заканчиваю тестировать и "допиливать" дизайн в ПЛИС, можно сказать что на этом с изменениями все Остается только ЛА, но это ни схемы, ни платы не затронет. ---
Нет войне!
Сообщение отредактировал LeftRadio - Суббота, 03.03.2012, 22:10
Остается только ЛА, но это ни схемы, ни платы не затронет.
Вот, как и обещал, эскиз ЛА. Извините за задержку, совсем не было времени, да и пришлось все вспоминать, т.к. ранние наброски уничтожились форматированием винта Квартуса у меня нет, поэтому в симуляторе не прогонял. Но есть нерешенная проблема - чтение буфера накопленных данных ЛА в ОЗУ. Т.к. обычно буфер большой и данные лежат в сжатом виде, то читать нужно в том же порядке, в каком они записывались, а это полностью отличается от режима осциллографа Я не придумал как это сделать простыми средствами Тем более, что нужно знать оставшиеся ресурсы ПЛИС.
P.S. Для задания режимов цифровой синхронизации используются те же регистры, что и для осциллографа, хотя можно использовать и отдельные регистры, если позволят ресурсы.
P.P.S. Если мы окончательно отказываемся от интерлива, то можно смело ставить DS1086LU.
Стоит не намного дороже, даст возможность, просто и энерго-эффективно, понижать тактовую для самописца.
Не даст. Самописец это очень низкая дискретизация. А у АЦП имеется минимальная дискретизация, куда более высокая. Для 9288 - 1 мегасэмпл. Ниже начнут емкости в УВХ успевать разряжаться.
Quote (LazyCat)
Поэтому прекратим наше общение до полного Вашего выздоровления.
Прекратим. Пока Вы хотя бы школьный курс математики не освоите. И не научитесь аргументировать свое мнение - фактами, цифрами. А не своими ощущениями.
Добавлено (04.03.2012, 10:18) --------------------------------------------- И вообще - DS1086 это хрень какая то. Для использования в измерительных приборах она принципиально непригодна. Точность частоты +-0,5%, от температуры -2/+0,75%, от питания +-0,75%. В общем вместо 50 мегагерц он может выдать 48. Как верить прибору, у которого опорный параметр, относительно которого он все измеряет гуляет как хочет?
хотя в NS2 я не смог от DS-ки "добиться" большей временной погрешности чем в 1%, а это какой класс точности?
Фиг знает. У дешевых китайских мультиметров напряжение измеряется с погрешностью 0,25%. 1% это "всего лишь" в 200 раз хуже, чем у генератора. Причем
Quote (LeftRadio)
я не смог от DS-ки "добиться" большей временной погрешности
как я понимаю стрессов типа охладить до 0С не проводилось? Или подогреть до 40С. Генератор же обещает +-50ppm в диапазоне от -20С до +70С. В комнатных условиях будет раза в два-три меньше.
Quote (LeftRadio)
Ну так и не предполагал ниже 1Msps использовать
На 50 такт можно легко поделить прямо в плис. Вообще забесплатно. Думаю 6LE на счетчик найдется? Кстати - чем отличается SRAM_CLK от SRAM_CE? И как вообще должна читаться ОЗУ? Я что то в логику не въезжаю. Про анализатор - надо не забывать про метастабильность. Это в чистом виде асинхронные сигналы. И анализатор это не просто пишем изменения. Во первых для медленных сигналов растяжки памяти в 256 раз не хватит. А такие сигналы тоже надо иногда писать. Пример UART на скорости 9600. На каждый битовый интервал придется 40 одинаковых записей в ОЗУ. А если скорость 4800? 80 записей. Дальше - синхронизация. Нельзя просто тупо писать поток по изменениям. Надо знать когда начать это делать. Как ни странно, но в анализаторе тоже есть триггер. И он не больше-меньше как в осциллографе. Он работает с битами по отдельности. Например бывает режим по значению. Типа стартуем если 3, 5 и 7 биты = 1, а 2-ой = 0. Кроме того не вся шина бывает интересна. Например только младшие 4 бита интересуют. А на старшем значение непрерывно меняется. Если делать тупо в лоб, как тут предложено, то будет только зря расходоваться память. Любое изменение в любом разряде может как быть условием триггера, так и не быть. Вообще ЛА надо сначала продумать. Дважды или трижды - что же хочется получить. Чисто хотелками, без деталей реализации. А иначе получится малофункциональный примитив, да еще и нерабочий, ну как выше предложено. Ну там простительно - его автор думать не умеет, увы.
На 50 такт можно легко поделить прямо в плис. Вообще забесплатно. Думаю 6LE на счетчик найдется?
А генератор разве денег не стоит? Как будто генератор за "бесплатно" а DS-ка за "платно"
Quote (kison)
Кстати - чем отличается SRAM_CLK от SRAM_CE? И как вообще должна читаться ОЗУ? Я что то в логику не въезжаю.
SRAM_CLK теперь идет на BLE и BHE - Write Cycle No. 2
Quote (kison)
Про анализатор - надо не забывать про метастабильность. Это в чистом виде асинхронные сигналы.
Я пока не вникал, сказать ничего не могу.
Quote (kison)
Ну там простительно - его автор думать не умеет, увы. :D
Люди ну хватит вам ругаться
------------------------------------------------------------------------------------------- У мну вопрос по верилогу почему не работает вот эта извращенная конструкция? Причем в sync_state еденица загружается, а вот условие (Sync_OUT_WIN ^ sync_state) == 1 ни под каким соусом не хочет, почему не пойму... И как мне сделать DATA_SYNC не регистром а просто "проводом"?
Code
always @(posedge clk) begin
if(ACLR == 0) begin first_event <= 0; last_event <= 0; end
if(Start_RW == 0) begin sync_state <= 0; end else begin
Как будто генератор за "бесплатно" а DS-ка за "платно"
Ну значит вместо бесплатно - за меньшие деньги. Причем с куда лучшей стабильностью и точностью.
Quote (LeftRadio)
SRAM_CLK теперь идет на BLE и BHE - Write Cycle No. 2
Какой то чересчур мудрый способ. Эти два сигнала и в цикле чтения используются. Хотя на диаграммах их и нет, но в примечании написано, что они должны быть = 0. А тут во всех режимах на них 50МГц будет. И в чем смысл? Что изменилось по сравнению с предыдущим вариантом? В чем улучшения? Вот ухудшения я вижу. А плюсы - нет.
Quote (LeftRadio)
Я пока не вникал, сказать ничего не могу.
Тут и не надо вникать. Сигналы на анализатор приходят с внешней схемы и к внутреннему такту никак не привязаны. Это тот самый случай, когда надо прогонять через цепочку из двух триггеров.
Quote (LeftRadio)
Люди ну хватит вам ругаться
Я только начал
Quote (LeftRadio)
Причем в sync_state еденица загружается, а вот условие (Sync_OUT_WIN ^ sync_state) == 1 ни под каким соусом не хочет, почему не пойму...
Я понятия не имею. Sync_OUT_WIN задается где то в другом месте. Видимо синтезатор считает, что это невозможно. Вообще так на верилоге не пишут. Это не Си. Не связанные между собой части можно разносить по разным always блокам. Например обработку ACLR. Это кстати уже не асинхронный сброс. Правильно примерно так, если сброс нужен асинхронный:
Code
always @(posedge clk or negedge ACLR) begin
if(ACLR == 0) begin first_event <= 0; last_event <= 0; end else begin // тут все остальное
Quote (LeftRadio)
И как мне сделать DATA_SYNC не регистром а просто "проводом"?
Добавлено (04.03.2012, 14:04) --------------------------------------------- А так как сейчас - собирается? Просто в начале блока в last_event пишется 0, а потом еще что то. Присваивания неблокирующие, т.е. выполняются все разом при выходе из блока. Может оказаться, что не смотря на ACLR в last_event что нибудь запишется.
А тут во всех режимах на них 50МГц будет. И в чем смысл? Что изменилось по сравнению с предыдущим вариантом? В чем улучшения?
50 не будет, после окончания записи будет 0, так как было с CS, только теперь после окончания чтения или записи СS автоматом установится в 1, тот самый энергосберегающий режим, отсутсвие которого критиковалось
Quote (kison)
Sync_OUT_WIN задается где то в другом месте.
Внешний сигнал.
Quote (kison)
Правильно примерно так, если сброс нужен асинхронный:
Спасибо, а не будет ли "все остальное" изменять свое состояние из-за negedge ACLR?
Quote (kison)
Вынести из always в любое место модуля.
Ух ты , не знал что так можно, но я вообще по нему мало что знаю , то тут то там подчерпну, у Вас ветку про верилог прочитал почти до конца, но таких примеров к сожалению не видел. ---
50 не будет, после окончания записи будет 0, так как было с CS
А почему? Там вообще то такт просто выведен.
Quote (LeftRadio)
Внешний сигнал.
Ну а в симуляции если на график вытащить Sync_OUT_WIN и sync_state? Должно быть видно кто из них не такой как нужно. И нужно очень внимательно имена цепей набирать. Опечатка в букве и создастся новая цепь! Ее состояние будет неизвестным и синтезатор может выкинуть все выражения, где она участвует.
Quote (LeftRadio)
Спасибо, а не будет ли "все остальное" изменять свое состояние из-за negedge ACLR?
Нет, там же условный блок. По перепаду или по низкому ACLR уровню он выполняется. А если не выполняется - выполняется то, что под else. Можно убрать negedge ACLR из условия и тогда сброс станет синхронным. Это лучше. Вообще как считают опытные люди от всей асинхронщины надо бежать как от чумы. Сейчас в схеме ее очень много.
Quote (LeftRadio)
у Вас ветку про верилог прочитал почти до конца, но таких примеров к сожалению не видел.
Будут, чтение ассинхронно к записи :D, да и зачем между ними синхронность не понимаю...
А при чем тут синхронность чтения и записи? Синхронность должна быть одна - с тактом. Сейчас адрес идет с буфера, на который приходит адрес записи или чтения через мультиплексор. Буфер тактируется тактом. Нет такта - нет адреса.
Quote (LeftRadio)
ибо тормоза за...ли
Тормоза это фигня. Вот формы входных сигналов рисовать это жесть.
И правда прошляпил, придется убирать буфер и возвращать как было.
Quote (kison)
Тормоза это фигня. Вот формы входных сигналов рисовать это жесть.
Ну как там у Вас в подписи, что программист сделает за два часа... Так вот тут я как пользователь, все лень сделать как программист и разобраться с тестбенчами, вот и приходится каждый раз по пол часа
------------------------------------------------------------------- Вроде заставил верилог слушатся , вот что получилось:
разобраться с тестбенчами, вот и приходится каждый раз по пол часа
Мне чтоб оттестировать начинку в разных режимах нужно было бы несколько сотен изменений на временной диаграмме набивать. А режимов - несколько. Причем я тестирую все оптом - задаю режимы, имитирую АЦП, даже ОЗУ-шку и ту имитирую. Т.е. пишу туда и читаю. И все в икарусе. Очень удобный инструмент.
Я бы побоялся. Глитчи на адресе во время записи - страшная вещь. А счетчики у альтеры кривые.
Ну вроде в прошлом дизайне проблем не было, этим я не утверждаю что глитчи это не зло.
Quote (kison)
Причем я тестирую все оптом - задаю режимы, имитирую АЦП, даже ОЗУ-шку и ту имитирую. Т.е. пишу туда и читаю.
Я то же все это делал, сначала помодульно потом "оптом", конфигурирую регистры в ПЛИС, пишу, читаю, проверяю не будет ли сбоев при записи если МК поведет себя "не так", долго, нудно, но можно Не все же биты вручную, там и копипаста работает и последовательность задавать можно. ---
Нет войне!
Сообщение отредактировал LeftRadio - Воскресенье, 04.03.2012, 15:26
А как сделать в нем по другому что бы условие сравнения (Trg_Lv_UP > DATA_IN_A) & (Trg_Lv_DOWN < DATA_IN_A) происходило для разных каналов по выбору внешнего сигнала DATA_SYNC? И в чем ошибка? ---
Я так понимаю сначала идет выбор канала. Т.е. мультиплексор. Получаем DATA_SYNC - сигнал по которому должен работать триггер. А потом зачем то работаем с каналом А. Я выделил места, где вместо DATA_IN_A по логике должно быть уже DATA_SYNC. Так как сейчас - триггер будет независимо от SYNC_A_B работать всегда с каналом А.
Был, но перед мультиплексором и мультиплексор мог переключить выхода адреса на счетчик чтения, то есть все работало без "основного" такта, плюс в этом есть - генератор все время вычитки и обработки/вывода спит и "ничего" не потребляет start_WR кстати нужно дергать только для начала следующего цикла записи. ---
Ну там по разному было, в конце оставил так как Вы привели на картинке, там же асинхронная загрузка есть, удерживаем start_WR на время чтения и все неудобства, а все преимущества остаются Точнее и "удерживать" не надо, для запуска записи переводим start_WR в 1, мультиплексор переключается, асинхронная загрузка отключается, после окончания записи переводим start_WR в 0, это то в любом случае делать надо что бы следующий цикл записи запустить, ну и все собственно ---
Нет войне!
Сообщение отредактировал LeftRadio - Воскресенье, 04.03.2012, 16:38
там же асинхронная загрузка есть, удерживаем start_WR на время чтения и все неудобства, а все преимущества остаются
Ну возможно. Если читать не быстро, то глитчи не повлияют. Преимущества то все же не все. Я себе сделал чтение самой плисиной. Меняю адрес дергая ножкой и автоматом читается ОЗУ. ОЗУ выходит в активный режим на 1 период такта и потом опять в спящий. Все само, ничего дергать кроме такта адреса не надо.
Влад, вот внес небольшие изменения, чтобы лучше были понятны проблемы, о которых я писал(см. работу счетчика чтения). Предлагаю читать не взад, а вперед, во всех режимах, но нужно доработать защелку адреса так, как Вам будет удобно, если согласитесь на этот вариант.
Помочь поразбираться? Я люблю в бредовых схемах копаться. Начнем помаленьку. Типа сам ЛА Что мы тут видим? Например регистр и компаратор. Компаратор сравнивает данные на входе регистра и то, что записано в регистре. И если они равны - разрешает запись. Это мощный подход, тут как ни старайся, но содержимое регистра величина постоянная. Да, именно она и будет дальше писаться в память. 128 тысяч одинаковых значений - это отличный анализатор! Теперь о типа "триггере". В правом верхнем углу красным цветом нарисована пародия на триггер. Сначала о верхней части, где 8*2И и потом ИЛИ с результатами. Эта хрень позволяет задать интересующий бит ( шиной Trigger_Level_B) и получить на выходе 1 если хоть один из заданных найдется. К примеру если по Trigger_Level_B приходит 0xFF, то единицу на выходе получим при любом значении на выходе регистра отличном от нуля. Если приходит 0x0F - при значении в регистре 0x01-0x0F. Очень полезный режим? Нижняя половина еще интересней. Это где 8*2ИЛИ и потом И результатам. Эта часть уже ищет единицы оптом. Т.е. в тех разрядах, в которых Trigger_Level_B содержит 0. Это, в отличии от первого варианта уже даже на практике применить можно, но это частный случай триггера по значению. Т.е. всего один из нескольких вариантов. Но тут он единственный. В общем весь этот узел ( что на картинке) - неработоспособная хрень. Сейчас еще одну "доработку" опишу. Она куда веселее! Мне вот интересно - на хрена бредовые картинки рисовать? Желание помочь - похвально. Остается один шаг - скачать таки квартус и проверять свои идеи перед тем, как их выкладывать. Ладно сейчас - траблы в схеме очевидны и без симуляций. А иногда ошибку найти сложнее, чем с нуля все нарисовать. to be continue...