|
|
  |
RS-232 + FPGA |
|
|
|
May 20 2006, 04:56
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326

|
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, всё зависит от стоимости, сроков и желания обучаться
|
|
|
|
|
May 20 2006, 10:07
|
Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-08-04
Из: Ленинград
Пользователь №: 562

|
Цитата(Alexandr @ May 20 2006, 00:01)  Да, частоту выборки можно брать любую, но большую бодовой скорости хотя бы раз в 8. Насчет того что "фронт частоты выборки совпадет с перепадом на линии" я вообще не понял как это может быть. Поясню, идея работы таже, по старт-биту запускаем генератор с частотой в N раз большей бодовой скорости и выборку производим на N/2-1, N/2, N/2+1 импульсах генератора. С метастабильностью полный порядок, ибо генератор получаем делением из частоты на которой работает ПЛИС. Про "фронт частоты выборки совпадет с перепадом на линии" это Я погорячился. Просто сначала в голову залезла тупая идея - хранить все отсчеты сигнала в линии, записываемые с частотой N*бодовая. В таком случае возможно, что очередной отчет попадет на момент переключения в линии. Отсюда и метастабильность. Но теперь, переварив все сообщения в купе с бутылочкой пива, исправил свои заблуждения.
--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
|
|
|
|
|
May 20 2006, 19:49
|

Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972

|
Цитата(Alexandr @ May 20 2006, 00:01)  Да, частоту выборки можно брать любую, но большую бодовой скорости хотя бы раз в 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) )
--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
|
|
|
|
|
May 22 2006, 10:26
|

Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972

|
Цитата(sazh @ May 21 2006, 14:56)  To NIOS Хороший подход. Можно пойти еще дальше. Отказаться от стопового бита. Ведь Вам он не нужен. Экономия на лицо. Рад, что поняли мой проект А хорошее замечание! Только кто придумывал стандарт в то время, это не предусмотрели. Видать тогда частоты работы были значительно меньше, поэтому нужно было переходное состояние для "отпускания" линии(стоповый бит) + определение, что дальше пошел новый стартовый (ИМХО).
--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
|
|
|
|
|
May 22 2006, 10:59
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 24-04-06
Пользователь №: 16 436

|
[quote name='NiOS' date='May 20 2006, 23:49' post='115298'] [quote name='Alexandr' post='115057' date='May 20 2006, 00:01'] При входе сигнала RX (UART’a) постоянно работающий входной МЖФ– для фильтрации коротких пичков на линии. Принцип работы МЖФ - из трех последовательных отсчетов он выбирает 2 совпадающих. [/quote]
2 совпадающих должны быть рядом?
|
|
|
|
|
May 22 2006, 12:22
|

Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972

|
Цитата(Motorhead @ May 22 2006, 14:59)  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]);
--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
|
|
|
|
|
May 22 2006, 12:43
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 24-04-06
Пользователь №: 16 436

|
Цитата(NiOS @ May 22 2006, 16:22)  Цитата(Motorhead @ May 22 2006, 14:59)  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 сигнал. Пусть всегда щелкает.
|
|
|
|
|
May 22 2006, 12:52
|

Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972

|
Цитата(Motorhead @ May 22 2006, 16:43)  Все понятно, непонятно зачем ena сигнал. Пусть всегда щелкает. Не хотел удалять  Привел универсальный модуль. По существу: во входном МЖФ можно без ena (или вставить как модул, и на него подать VCC), а вот во втором МЖФ он уже обязательно нужен (за период "бодовой" частоты должно быть только 3 входных воздействия)
--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
|
|
|
|
|
May 27 2006, 04:34
|
Группа: Новичок
Сообщений: 12
Регистрация: 23-05-06
Пользователь №: 17 367

|
Никогда не писал кода для RS, но когда потребовалось, сделал. Если не считать времени на отладку, то задача по моему разумению вообще тривиальная. Преобразователь уровня и... все остальное в FPGA. Вкалывает за милую душу. Делаю четырехкратную проверку бита, но думаю что можно и меньше, наверное это может обезопасить при высоких скоростях передачи. А так проблем не было!
|
|
|
|
|
May 30 2006, 18:00
|
Участник

Группа: Новичок
Сообщений: 21
Регистрация: 30-05-06
Пользователь №: 17 574

|
С метастабильностью полный порядок, ибо генератор получаем делением из частоты на которой работает ПЛИС. [/quote]
Внешний сигнал асинхронен, так что проблемы могут быть
|
|
|
|
|
Jul 3 2006, 10:58
|
Участник

Группа: Свой
Сообщений: 32
Регистрация: 8-01-05
Из: г. Воронеж
Пользователь №: 1 845

|
Цитата Вариант 2. Самому делать на FPGA. В этом случае Я вижу несколько проблем: - как мне осуществить "запуск" генератора приемника при обнаружении старт-бита? - т.к. мне требуется реализовать 3 передатчика и 3 приемника RS-232, и скорее всего эти каналы будут работать независимо друг от друга, то вроде как получается, чересчур большие затраты по количеству PLL-ресурсов. Как бы не вышло, что придется ставить несколько ПЛИС... Можно сделать, что генератор скорости бод будет работать всегда. При приходе фронта сигнала (т.е. начала старт- импульса) запускается конечный автомат приёмника. После приёма формируется импульс, фиксирующийся в контроллере прерываний. После обработки данного запроса микроконтроллер сбрасывает этот бит в контроллере. Таким образом промимо ядра RS-232 вам требуется ещё напмсить ядро контроллера прерываний. RS-232 у меня занял 3 экрана verilog- кода, приоритетный контроллер прерываний - тоже 3 экрана.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|