реклама на сайте
подробности

 
 
> RS-232 + FPGA
maksya
сообщение May 18 2006, 20:52
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-08-04
Из: Ленинград
Пользователь №: 562



Доброго времени суток, уважаемые.

Есть задача: между платой и датчиками существует RS-232 канал, точнее 3 канала в направлении от платы к датчикам и 3 - противоположном. Цель - обеспечить работоспособность этой связки.

В качестве ядра системы предполагаю использовать FPGA (естественно не только для целей обмена с датчиками). Если Я правильно понимаю, то придется ставить внешние микросхемы (типа MAX220–MAX249) для преобразования уровней TTL <-> RS-232. Остается дело за малым - реализовать в системе приемопередатчики. С этого момента постараюсь раскрыть проблему более подробно.

С передатчиком более-менее понятно: типичный Serializer с двумя регистрами и одним PLL (старт_бит:байт_данных:контроль:стоп_бит и все это наружу). С приемником сложнее: только deserializer'ом, наверное, обойтись не получится sad.gif

В классическом представлнии (в соответствии с остаточными знаниями, полученными в ВУЗе) приемник должен запустить свой внутренний генератор (работающий с частотой, например, в 16 раз превышающей бодовую) после обнаружения на линии перехода сигнала с 1 в 0, т.е. обнаружения старт-бита. Через 8 импульсов после этого события еще раз проверяем состояние линии, и если там 0, то считаем что пришел старт-бит. Далее входной поток мереем через каждые 16 тактов (т.е. с бодовой скоростью), предположительно попадая на середину бита. Записав биты в регистр, проверяем четность, наличие стоп-бита и все по-новой.

Помимо попытки вычисления значения бита в середине интервала, Я встречал еще в литературе варианты когда в битовом интервале производится 3 выборки и по мажоритарному принципу определяется значение.

Теперь к вопросу реализации:

Вариант 1. Брать внешнюю миросхему с реализованным UART'ом. Вроде Intel 8251 для этих целей используется в качестве внешнего устрйоства процессора. Есть и встроенные в корпус МК UART'ы, но ставить МК на плату только ради этих целей как-то нелепо. Кстати, а существует ли вариант, объединяющий UART с драйвером RS-232?

Вариант 2. Самому делать на FPGA. В этом случае Я вижу несколько проблем:
- как мне осуществить "запуск" генератора приемника при обнаружении старт-бита?
- т.к. мне требуется реализовать 3 передатчика и 3 приемника RS-232, и скорее всего эти каналы будут работать независимо друг от друга, то вроде как получается, чересчур большие затраты по количеству PLL-ресурсов. Как бы не вышло, что придется ставить несколько ПЛИС...

Нашел в закромах VHDL код UART'а (прикладываю в тему). Бегло просмотрев код, выявил для себя одну интересную вещь - там используется CLK в 4 раза быстрее бодовой скорости, производится выборка значения бита 3 раза за интервал. Т.е. если вдвинутое из Rx-линии в трехразрядный регистр значение = 000, то считаем, что пришел старт-бит. Далее - по алгоритму. Насколько такой способ отражает реальные потребности реализации? Влиять на UART на стороне датчиков не представляется возможным. Всвязи с этим непонятно, будет ли всегда данные от датчика адекватно приниматься в FPGA'шный приемник.

И еще - встречал в каких-то статьях, что в FPGA встраиваются блоки SERDES. В hepl'е Quartus'а говорится что вроде как в Stratix'е есть такая возможность. Кто-нибудь работал с ними? И не слишком ли "жирно" будет использовать такие SERDES для 115 Кбит/с?

Быть может Я делаю из РПГ-18 (гранатомет "муха") слона, и задача решается современными средствами намного проще? Вообщем если у кого есть опыт общения с датчиками по RS-232, то просьба поделиться знаниями.

P.S.: Резюмируя вышесказанное, прошу по возможности ответить на следующие вопросы:
1. Применяются ли сейчас отдельные микросхемы UART'ов? Есть ли варианты UART+драйвер RS-232 в одном корпусе?
2. Обязательно ли использовать PLL для этой задачи?
3. Приложенный VHDL код UART'а (или аналогичный ему) может гарантировать правильный обмен информацией?
4. К месту ли применение аппаратных встроенных в ПЛИС блоков SERDES?
5. Есть ли у кого опыт решения похожей задачи?
Прикрепленные файлы
Прикрепленный файл  hUART.zip ( 2.07 килобайт ) Кол-во скачиваний: 303
 


--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kopart
сообщение Jul 6 2006, 08:13
Сообщение #2


Знающий
****

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



Цитата(Wild @ Jul 3 2006, 19:41) *
Позвольте с вами не согласиться. Стоповый бит необходим для того чтобы устанавливать синхронизацию приемника и передатчика, так как в общем случае два уарта работают на немного разных частотах необходимо более или менее точно определить момент начала передачи байта, чтобы даже после небольшой рассинхронизации можно было быть уверенным, что снимаемое с линии значение последнего бита, действительно соответствует последнему биту а не соседнему сним.

Если в схеме с делением битового интервала на 16 частей и выборке 3х средних значений, к моменту приема последнего бита такая выборка может "уплыть" от центра битового интервала к его краю, то есть на время, приблизительно равное половине битового интервала, то при предложенном NIOSом методе, искажение данных произойдет, если выборка "уплывет" хотя бы на треть.

Макс возможный случай - что к приему стопового бита генератор уплывет на треть длительности БИТА.
Прикинем какое должно быть рассогласование опорных генераторов, чтобы выборка уплыла на треть.
Макс скорость передачи 128000, максимально возможно бит = 1+8+1+2 = 12
Те за 93.75мкс частота должна уйти на 2.604мкс не более 2.7% (это для частоты 128кГц)
В вашем случае (1/2 бита) получается не более 4.1%
Стабильность генератора не хуже 10^-6 те 0.0001%.
А вот точность, сейчас программируемых генераторов, я на вскидку не скажу - это уже другой вопрос, который также актуален при рассогласовании в 1/2 бита.
Те жертвуя 1/2-1/3 ~= 0.16 бита Вы получает удобство по компактности реализации и простоте алгоритма приема.

Цитата(sazh @ Jul 4 2006, 20:56) *
Мне вообще непонятно для чего в приемнике эта мажоритарность. Это же не МК. По большому счету и подход при работе с собственным клоком, позволяющий нащупать середину стартового бита, отрицает необходимость мажоритарности. Если Вы досчитали до середины стартового бита, попали в энегетический центр сигнала, зачем анализировать, что слева или справа. Разве это улучшит надежность приемника. Да только ухудшит, если рассогласования частот приемника и передатчика значимы. У меня подход прост.

Логика проста: Первый МЖФ - простейщий фильтр на входе в ПЛИС (получще будет чем стробирование)
- к минимум задача фильтровать пички.
Второй МЖФ нужен по идее метода - определять значения бодовых битов (+не учитывать, если выборка попадет на перепад сигнала)

Если просто сравнивать с тем, что предлагает Вы - мне не требуется точно определять начала стартового бита, чтобы потом попасть на середину. Я работаю максимально с частотой в 3 раза больше бодовой, а Вам нужно довольно точно защелкивать, чтобы быть увереным, что попали в середину.
А определение начала и конца "посылки" в моем методы тоже присутствует - в КА, и не требует такой точности.


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
javalenok
сообщение Jul 10 2006, 08:57
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 18-02-06
Пользователь №: 14 469



Допустим один проголосовал против -- и что дальше? Правильные голоса появились -- мажоритарность можно реализовать проще -- выборкой 1-го бита в середине битового интервала. Какой смысл пропускать ряд пичков 1010101010 -- не понял. Это как-то повышает надёжность? Ещё не понял, как без стопового бита вы будете засекать появление стартового, ведь последний бит данных может быть нулём, т.е. неразличим от старта.

И ещё, когда считаете погрешности рассинхронизации, не забывайте, что передискретизация 16х сама по себе даёт задержку до 6,5% от настоящего старт-фронта. При эхо-тестировании приёмопередатчика длинными потоками у меня случались сбои. Чтобы ошибка не накапливалась, сбрасывать приёмник надо в середине стоп-бита.

Никто не сказал ничего вразумительного про метастабильность, но в примере который я брал за основу применялся синхронизатор. Видимо он нужен чтоб предотвратить "непонятки" когда Rx зависает между небом и землёй и вся логика, на нём завязанная, интерпретирует уровень на своё усмотрение, приводя автомат в полный беспорядок.

Но вообще идея использовать сдвиг вместо подсчёта бит заслуживает рассмотрения. Парадоксально, но декодер на N адресов в FPGA занимает вдвое больше ресурсов, чем цепочка из N FF-ов.
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jul 10 2006, 10:20
Сообщение #4


Знающий
****

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



Цитата(javalenok @ Jul 10 2006, 12:57) *
Вы хоть обозначайте кому пишите! А лучше ставьте цитаты, того на что отвечаете.
Про комментирую то, что покажется обращено ко мне.

Цитата
Допустим один проголосовал против -- и что дальше? Правильные голоса появились -- мажоритарность можно реализовать проще -- выборкой 1-го бита в середине битового интервала. Какой смысл пропускать ряд пичков 1010101010 -- не понял. Это как-то повышает надёжность? Ещё не понял, как без стопового бита вы будете засекать появление стартового, ведь последний бит данных может быть нулём, т.е. неразличим от старта.

Тут вопрос определения "середины битового интервала" (для этого "точно" надо знать начала стартового бита)
А с МЖФ не надо синхронизоватся - сам поймет "опосля" - вот уже стартовый "ноль" - надо бы начать вдвигать. Плюс фильтруются пологие фронты, спады.
Я изначально "вдвиговый" регистр инициализурую всеми "1", и как стартовый добрался до определенной ячейки (последней, предпоследней, i-ой) - понимаю сколько принял, и жду дальше/сравниваю (четность)/сбрасываю приемник(с задержкой) - в паралель (это же ПЛИС)
Цитата
И ещё, когда считаете погрешности рассинхронизации, не забывайте, что передискретизация 16х сама по себе даёт задержку до 6,5% от настоящего старт-фронта.

Поподробнее откуда такие циферки?
В моем способе синхронизация не требуется... (это паралельный процесс)
Цитата
Никто не сказал ничего вразумительного про метастабильность, но в примере который я брал за основу применялся синхронизатор. Видимо он нужен чтоб предотвратить "непонятки" когда Rx зависает между небом и землёй и вся логика, на нём завязанная, интерпретирует уровень на своё усмотрение, приводя автомат в полный беспорядок.
Но вообще идея использовать сдвиг вместо подсчёта бит заслуживает рассмотрения. Парадоксально, но декодер на N адресов в FPGA занимает вдвое больше ресурсов, чем цепочка из N FF-ов.

+ если я правильно понял - то нужен еще счетчик битов([3:0] макс до 12)

Из непонятного состояния всегда можно выйти по таймауту.


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- maksya   RS-232 + FPGA   May 18 2006, 20:52
- - ASN   maksya Я бы поставил простенький МК + драйвер. На ...   May 18 2006, 21:09
- - Chudik   Присоединяюсь к ASN: почему бы не поставить махонь...   May 19 2006, 00:03
- - prototype   Насколько мне известно, в классическом построении ...   May 19 2006, 04:48
- - vladec   Зачем чего то придумывать? У Xilinx-а есть готовые...   May 19 2006, 05:21
- - iosifk   Цитата(maksya @ May 19 2006, 00:52) В кач...   May 19 2006, 05:44
|- - NiOS   Цитата(iosifk @ May 19 2006, 09:44) Цитат...   May 19 2006, 07:42
- - sazh   А хорошо Вам преподавали в Вузе. Налицо подход нас...   May 19 2006, 06:35
- - Motorhead   Цитата(maksya @ May 19 2006, 00:52) P.S.:...   May 19 2006, 09:14
- - Alexandr   Однозначно за ПЛИС. PLL не нужна - у Вас на ПЛИС в...   May 19 2006, 12:04
|- - ASN   Alexandr На МК удобно реализовать протокол обмена ...   May 19 2006, 19:30
|- - Alexandr   Цитата(ASN @ May 19 2006, 23:30) Alexandr...   May 19 2006, 20:01
|- - ASN   Alexandr А вот если адаптировать систему под любой...   May 20 2006, 04:56
|- - maksya   Цитата(Alexandr @ May 20 2006, 00:01) Да,...   May 20 2006, 10:07
|- - NiOS   Цитата(Alexandr @ May 20 2006, 00:01) Да,...   May 20 2006, 19:49
||- - Motorhead   [quote name='NiOS' date='May 20 2006, ...   May 22 2006, 10:59
|||- - Gorby   [quote name='Motorhead' date='May 22 2...   May 22 2006, 12:20
|||- - NiOS   Цитата(Motorhead @ May 22 2006, 14:59) 2 ...   May 22 2006, 12:22
|||- - Motorhead   Цитата(NiOS @ May 22 2006, 16:22) Цитата(...   May 22 2006, 12:43
|||- - NiOS   Цитата(Motorhead @ May 22 2006, 16:43) Вс...   May 22 2006, 12:52
||- - sanek78   Цитата(NiOS @ May 20 2006, 21:49) Для чег...   Sep 26 2006, 09:15
||- - NiOS   Цитата(sanek78 @ Sep 26 2006, 13:15) Спас...   Sep 27 2006, 18:01
|- - Vital_100   Никогда не писал кода для RS, но когда потребовало...   May 27 2006, 04:34
|- - afsh   С метастабильностью полный порядок, ибо генератор ...   May 30 2006, 18:00
- - Iouri   http://www.quicklogic.com/images/appnote20.pdf по...   May 19 2006, 12:27
- - maksya   Прям мозговой штурм какой-то 7.5 : 2.5 в пользу ...   May 19 2006, 19:39
- - rezident   Микроконтроллер нужно выбирать в соответствии с пр...   May 19 2006, 19:39
- - prototype   ЦитатаНасчет мажоритара - если частота выборки зна...   May 20 2006, 04:44
- - DeadMoroz   Если Вам необходим микроконтроллер с 3мя UARTами, ...   May 20 2006, 08:56
- - sazh   To NIOS Хороший подход. Можно пойти еще дальше. От...   May 21 2006, 10:56
|- - NiOS   Цитата(sazh @ May 21 2006, 14:56) To NIOS...   May 22 2006, 10:26
|- - Wild   Цитата(sazh @ May 21 2006, 14:56) To NIOS...   Jul 3 2006, 15:41
- - grigorybold   ЦитатаВариант 2. Самому делать на FPGA. В этом слу...   Jul 3 2006, 10:58
- - sazh   Не надо вырывать эту фразу из контекста обсуждения...   Jul 3 2006, 18:38
|- - Wild   Цитата(sazh @ Jul 3 2006, 22:38) Не надо ...   Jul 4 2006, 10:10
- - vikk   круто! ну вы блин даете! этож можно чело...   Jul 4 2006, 11:27
- - sazh   To Wild. Вы все правильно говорили. А я не шутил. ...   Jul 4 2006, 16:56
|- - javalenok   Цитата(NiOS @ Jul 10 2006, 13:20) Цитата ...   Jul 10 2006, 11:18
|- - Wild   http://www.xilinx.com/xlnx/xweb/xil_tx_dis...hX_ID...   Jul 10 2006, 12:10
|- - NiOS   Цитата(javalenok @ Jul 10 2006, 15:18) Да...   Jul 11 2006, 08:35
|- - javalenok   Цитата(NiOS @ Jul 11 2006, 11:35) Я навер...   Jul 11 2006, 10:26
|- - NiOS   Цитата(javalenok @ Jul 11 2006, 14:26) Но...   Jul 12 2006, 07:03
|- - javalenok   Цитата(NiOS @ Jul 12 2006, 10:03) Цитата(...   Jul 12 2006, 14:18
- - NiOS   А есть ли смысл разговаривать с человеком, который...   Jul 12 2006, 15:05
|- - javalenok   Цитата(NiOS @ Jul 12 2006, 18:05) 1. Да с...   Jul 13 2006, 00:42
- - sazh   TO NIOS: А не могли бы Вы привести схему Вашего пр...   Jul 12 2006, 18:45
|- - NiOS   Цитата(sazh @ Jul 12 2006, 22:45) TO NIOS...   Jul 13 2006, 08:01
- - NiOS   //Как можно не считая биты узнать, что кадр окончи...   Jul 13 2006, 07:26
- - sazh   Сам текст понятен. А вот идея всегда будет вызыват...   Jul 13 2006, 09:46
|- - NiOS   Цитата(sazh @ Jul 13 2006, 13:46) Сам тек...   Jul 13 2006, 10:02
- - sazh   Reset не обязателен. Система сама должна переходит...   Jul 13 2006, 10:13
|- - javalenok   Теперь понял. Отслеживалка числа принятых битов со...   Jul 13 2006, 12:32
|- - NiOS   Цитата(sazh @ Jul 13 2006, 14:13) Reset н...   Jul 13 2006, 14:48
- - sazh   Этот ресет нужен обязательно при включении питания...   Jul 13 2006, 16:49
|- - NiOS   Цитата(sazh @ Jul 13 2006, 20:49) Этот ре...   Jul 18 2006, 09:08
- - sazh   Что-то вы не сразу догадались про определение не S...   Jul 18 2006, 18:57
|- - NiOS   Цитата(sazh @ Jul 18 2006, 22:57) Что-то ...   Jul 19 2006, 06:52
- - sanek78   Я диплом пишу, поэтому результат может быть только...   Sep 28 2006, 12:14
- - Леха   Товарищи, а если FPGA (ACEX) висит на PCI, то чем ...   Nov 22 2006, 10:58
|- - klop   Цитата(Леха @ Nov 22 2006, 10:58) Товарищ...   Nov 22 2006, 12:17
- - Леха   Посчитать не влом. Вопрос про корректность и надёж...   Nov 22 2006, 12:27
|- - klop   Цитата(Леха @ Nov 22 2006, 12:27) Посчита...   Nov 22 2006, 13:03
- - oval   Цитата(Леха @ Nov 22 2006, 10:58) Товарищ...   Nov 22 2006, 13:09
- - sazh   Проще Для Вас От PCI клок взять. А вообще все равн...   Nov 22 2006, 13:23
- - Леха   to sazh: Не совсем понял. Например, я рассчитаю с...   Nov 22 2006, 13:45
- - sazh   Не совсем понял. Например, я рассчитаю свой UART д...   Nov 22 2006, 14:12
|- - Леха   Цитата(sazh @ Nov 22 2006, 15:12) Если ве...   Nov 22 2006, 15:13
- - oval   Цитата(Леха @ Nov 22 2006, 13:45) to oval...   Nov 22 2006, 14:52
- - sazh   Вы правы. всегда найдутся любители журнала Upgrade...   Nov 22 2006, 15:32
|- - Oldring   Цитата(sazh @ Nov 22 2006, 15:32) Вы прав...   Nov 22 2006, 16:23
- - DeadMoroz   я использовал PCI клок для UART в двух проектах, ...   Nov 23 2006, 02:40
|- - rv3dll(lex)   насчёт того, что не должно быть сбросов полностью ...   Oct 22 2007, 11:11
|- - sazh   Цитата(rv3dll(lex) @ Oct 22 2007, 15...   Oct 22 2007, 13:07
|- - NiOS   Цитата(rv3dll(lex) @ Oct 22 2007, 15...   Oct 22 2007, 13:28
|- - rv3dll(lex)   Цитата(NiOS @ Oct 22 2007, 17:28) Стандар...   Oct 23 2007, 10:17
|- - NiOS   Цитата(rv3dll(lex) @ Oct 23 2007, 14...   Oct 23 2007, 10:38
||- - rv3dll(lex)   Цитата(NiOS @ Oct 23 2007, 14:38) На этом...   Oct 23 2007, 12:40
||- - NiOS   Цитата(rv3dll(lex) @ Oct 23 2007, 16...   Oct 23 2007, 12:51
||- - sazh   Цитата(rv3dll(lex) @ Oct 23 2007, 16...   Oct 23 2007, 14:04
||- - NiOS   Цитата(sazh @ Oct 23 2007, 18:04) А если ...   Oct 23 2007, 14:35
||- - rv3dll(lex)   Цитата(NiOS @ Oct 23 2007, 18:35) К слову...   Oct 24 2007, 06:28
|- - mse   Цитата(rv3dll(lex) @ Oct 23 2007, 14...   Oct 24 2007, 07:38
|- - rv3dll(lex)   Цитата(mse @ Oct 24 2007, 11:38) Это ерун...   Oct 24 2007, 11:09
|- - mse   Цитата(rv3dll(lex) @ Oct 24 2007, 14...   Oct 24 2007, 11:10
- - Stas   To NIOS: 1. Спору нет, вроде схема рабочая но для ...   Feb 16 2008, 06:44
- - NiOS   Цитата(Stas @ Feb 16 2008, 09:44) To NIOS...   Feb 16 2008, 19:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01504 секунд с 7
ELECTRONIX ©2004-2016