prototype 2 20 мая, 2006 Опубликовано 20 мая, 2006 · Жалоба Насчет мажоритара - если частота выборки значения линии в 16 раз выше бодовой, то для мажоритара выбирают 3 отчета примерно посередине битового интервала? Собственно я об этом и говорил. Именно так. Три и мажоритирование - для повышения помехоустойчивости. Я когда-то делал в ПЛИС именно со стартом по отрицательному фронту, поэтому так и написал. Хотя с точки зрения той же помехоустойчивости возможно искать несколько нулей подряд и более правильно. Просто меня в свое время результат устроил и я не стал заморачиваться. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 20 мая, 2006 Опубликовано 20 мая, 2006 · Жалоба Alexandr А вот если адаптировать систему под любой интерфейс, протокол, даже тот которого не было на момент создания, то лучше всё же МК (ISP, EEPROM, ADC, DAC, Flash (как FSM - равный памяти программ)) заложить (например, для токового интерфейса). Вообще, рекомендовать какое-то решение сложно. Могу предложить несколько на выбор (драйвер включаются во все решения): 1.PSOC (например, на основе PicoBlaze + UART ). Достоинство – всё в одном флаконе. Недостатки – надо обучиться работать с PicoBlaze. 2.Готовый UART Exar 16С554 + MK (типа PIC16,Mega16) для его управления. Достоинство – всё уже готово. Недостатки – жёсткое решение, место на плате, дорого. 3.Тоже Exar + FPGA для управления. Достоинства – простота реализации. Недостатки – избыточность. 4.Полностью софтовые UART в МК. Достоинство – всё в одном флаконе, очень дёшево. Недостатки – сложность реализации ПО, пониженная помехоустойчивость. 5. FPGA (XC3S400) для реализации UART + MK реализации высокоуровневых протокол обмена данными. Достоинства – гибкость + мощность. Недостатки – больше место на плате. IMHO, всё зависит от стоимости, сроков и желания обучаться :glare: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DeadMoroz 0 20 мая, 2006 Опубликовано 20 мая, 2006 · Жалоба Если Вам необходим микроконтроллер с 3мя UARTами, то могу посоветовать Cygnal C8051F130, у него 2 аппаратных + 1(или несколько) можно забабахать программных, я такое делал. Но всеже советую сделать на FPGA, это насамом деле несложно. Посмотрите мою реализацию, это простенький UART с фиксированной скоростью и режимом (опять же ненапряжно переделывается под настраиваемый). Использовал его в 2х поектах + FIFO на прием и передачу. UARTv1.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksya 0 20 мая, 2006 Опубликовано 20 мая, 2006 · Жалоба Да, частоту выборки можно брать любую, но большую бодовой скорости хотя бы раз в 8. Насчет того что "фронт частоты выборки совпадет с перепадом на линии" я вообще не понял как это может быть. Поясню, идея работы таже, по старт-биту запускаем генератор с частотой в N раз большей бодовой скорости и выборку производим на N/2-1, N/2, N/2+1 импульсах генератора. С метастабильностью полный порядок, ибо генератор получаем делением из частоты на которой работает ПЛИС.Про "фронт частоты выборки совпадет с перепадом на линии" это Я погорячился. Просто сначала в голову залезла тупая идея - хранить все отсчеты сигнала в линии, записываемые с частотой N*бодовая. В таком случае возможно, что очередной отчет попадет на момент переключения в линии. Отсюда и метастабильность. Но теперь, переварив все сообщения в купе с бутылочкой пива, исправил свои заблуждения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kopart 0 20 мая, 2006 Опубликовано 20 мая, 2006 · Жалоба Да, частоту выборки можно брать любую, но большую бодовой скорости хотя бы раз в 8. Насчет того что "фронт частоты выборки совпадет с перепадом на линии" я вообще не понял как это может быть. Поясню, идея работы таже, по старт-биту запускаем генератор с частотой в N раз большей бодовой скорости и выборку производим на N/2-1, N/2, N/2+1 импульсах генератора. С метастабильностью полный порядок, ибо генератор получаем делением из частоты на которой работает ПЛИС. Для чего брать частоту больше раз в 8, чем бодовая??? Я же писал, что нужна частота только в 3!!! раза больше, чем бодовая, один МЖФ, ну и второй МЖФ для фильтрации входа. Могу привести код работающего проекта на Verilog’e (хотя он только для скорости 115.200, без проверки паритета и с одним стоповым) Как это происходит (повторяюсь и уточняю). При входе сигнала RX (UART’a) постоянно работающий входной МЖФ– для фильтрации коротких пичков на линии. Принцип работы МЖФ - из трех последовательных отсчетов он выбирает 2 совпадающих. А дальше счетчик работающий от основной частоты 40 МГц считает до ‘d114 и сбрасывается – получается частота 3*бодовая (крутится постоянно без сброса по стартовому биту!) А теперь, как счетчик == 114 я на один такт разрешаю продвинуть данные во втором МЖФ. Мне без разнице, в какой части «бодового» бита, на МЖФ защелкнутся три значения (может даже одно значение попасть из другого «бодового» бита, а может попасть на перепад(в обычном RS-232 он пологий получается) – для такого подхода это «фиолетово») -> а второй счетчик считает, когда (первый счетчик==114) уже 3 раз и на выходе второго МЖФ получаю значение «бодового» бита, которой и вдвигаю. Когда автомат, находясь в «idle», получил значение «бодового» бита «0» -> это стартовый -> задвигаю в регистр [9:0] (в «idle» инициализированный всеми «1») -> как стартовый «0» добрался до конца регистра [9:0] -> всё посылка принята! И не нужна НИКАКАЯ синхронизация при стартовом бите, и внутри бита – просто по двум из трех значений определяется значение бита. Дописал - посмотрел – слов много, а объяснил ли? В общем, если что не понятно на буднях смогу привести код (это более универсальный язык =8) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 21 мая, 2006 Опубликовано 21 мая, 2006 · Жалоба To NIOS Хороший подход. Можно пойти еще дальше. Отказаться от стопового бита. Ведь Вам он не нужен. Экономия на лицо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kopart 0 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба To NIOS Хороший подход. Можно пойти еще дальше. Отказаться от стопового бита. Ведь Вам он не нужен. Экономия на лицо. Рад, что поняли мой проект :) А хорошее замечание! Только кто придумывал стандарт в то время, это не предусмотрели. Видать тогда частоты работы были значительно меньше, поэтому нужно было переходное состояние для "отпускания" линии(стоповый бит) + определение, что дальше пошел новый стартовый (ИМХО). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motorhead 0 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба При входе сигнала RX (UART’a) постоянно работающий входной МЖФ– для фильтрации коротких пичков на линии. Принцип работы МЖФ - из трех последовательных отсчетов он выбирает 2 совпадающих. 2 совпадающих должны быть рядом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба При входе сигнала RX (UART’a) постоянно работающий входной МЖФ– для фильтрации коротких пичков на линии. Принцип работы МЖФ - из трех последовательных отсчетов он выбирает 2 совпадающих. 2 совпадающих должны быть рядом? Нет. Просто должно быть МИНИМУМ два одинаковых из трех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kopart 0 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба 2 совпадающих должны быть рядом? выходное значение учитывает предысторию из трех последовательных входных. Если отвечать в лоб на Ваш вопрос, то они могут быть как подряд (1,2 и 2,3), так и через один(1,3) :) Привожу свой код МЖФ на Verilog'e wire ena; reg [2:0] dd; always @ (posedge rst or clk) if (rst) dd[2:0] <= #T 3'b111; else if (ena) dd[2:0] <= #T {dd[1:0], in}; reg out; always @ (posedge rst or clk) if (i_rst) out <= #T 1'b1; else if (ena) out <= #T (dd[0]&dd[1])|(dd[0]&dd[2])|(dd[1]&dd[2]); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motorhead 0 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба 2 совпадающих должны быть рядом? выходное значение учитывает предысторию из трех последовательных входных. Если отвечать в лоб на Ваш вопрос, то они могут быть как подряд (1,2 и 2,3), так и через один(1,3) :) Привожу свой код МЖФ на Verilog'e wire ena; reg [2:0] dd; always @ (posedge rst or clk) if (rst) dd[2:0] <= #T 3'b111; else if (ena) dd[2:0] <= #T {dd[1:0], in}; reg out; always @ (posedge rst or clk) if (i_rst) out <= #T 1'b1; else if (ena) out <= #T (dd[0]&dd[1])|(dd[0]&dd[2])|(dd[1]&dd[2]); Все понятно, непонятно зачем ena сигнал. Пусть всегда щелкает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kopart 0 22 мая, 2006 Опубликовано 22 мая, 2006 · Жалоба Все понятно, непонятно зачем ena сигнал. Пусть всегда щелкает. Не хотел удалять :) Привел универсальный модуль. По существу: во входном МЖФ можно без ena (или вставить как модул, и на него подать VCC), а вот во втором МЖФ он уже обязательно нужен (за период "бодовой" частоты должно быть только 3 входных воздействия) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalSPB 0 27 мая, 2006 Опубликовано 27 мая, 2006 · Жалоба Никогда не писал кода для RS, но когда потребовалось, сделал. Если не считать времени на отладку, то задача по моему разумению вообще тривиальная. Преобразователь уровня и... все остальное в FPGA. Вкалывает за милую душу. Делаю четырехкратную проверку бита, но думаю что можно и меньше, наверное это может обезопасить при высоких скоростях передачи. А так проблем не было! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
afsh 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба С метастабильностью полный порядок, ибо генератор получаем делением из частоты на которой работает ПЛИС. Внешний сигнал асинхронен, так что проблемы могут быть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grigorybold 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба Вариант 2. Самому делать на FPGA. В этом случае Я вижу несколько проблем: - как мне осуществить "запуск" генератора приемника при обнаружении старт-бита? - т.к. мне требуется реализовать 3 передатчика и 3 приемника RS-232, и скорее всего эти каналы будут работать независимо друг от друга, то вроде как получается, чересчур большие затраты по количеству PLL-ресурсов. Как бы не вышло, что придется ставить несколько ПЛИС... Можно сделать, что генератор скорости бод будет работать всегда. При приходе фронта сигнала (т.е. начала старт- импульса) запускается конечный автомат приёмника. После приёма формируется импульс, фиксирующийся в контроллере прерываний. После обработки данного запроса микроконтроллер сбрасывает этот бит в контроллере. Таким образом промимо ядра RS-232 вам требуется ещё напмсить ядро контроллера прерываний. RS-232 у меня занял 3 экрана verilog- кода, приоритетный контроллер прерываний - тоже 3 экрана. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться