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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Тактирование UART-передатчика (CYCLONE III)
mongol
сообщение Aug 22 2017, 15:24
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 22-08-17
Пользователь №: 98 917



Имеется проект небольшой, на Циклон поступают данные извне, а затем эти данные передаются по UART на микроконтроллер STM. Циклон тактируется от кварца на 100 MHz. На стороне микроконтроллера я примерно разобрался, почему там скорость тактирования должна быть в 16 раз выше битрейта, для лучшего сэмплирования. Но вот как тактировать передатчик, т.е. Циклон, я не могу понять. Во многих примерах тактирование ставят в 2 раза больше битрейта. Но почему так я и не выяснил. Как быть? Бодрейт для проекта выбран 9600. Делить с помощью PLL частоту кварца до 19200 и с такой же частотой обрабатывать приходящие на ПЛИС данные? Просветите пожалуйста новичка
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Aug 22 2017, 16:41
Сообщение #2


В поисках себя...
****

Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(mongol @ Aug 22 2017, 18:24) *
Имеется проект небольшой, на Циклон поступают данные извне, а затем эти данные передаются по UART на микроконтроллер STM. Циклон тактируется от кварца на 100 MHz. На стороне микроконтроллера я примерно разобрался, почему там скорость тактирования должна быть в 16 раз выше битрейта, для лучшего сэмплирования. Но вот как тактировать передатчик, т.е. Циклон, я не могу понять. Во многих примерах тактирование ставят в 2 раза больше битрейта. Но почему так я и не выяснил. Как быть? Бодрейт для проекта выбран 9600. Делить с помощью PLL частоту кварца до 19200 и с такой же частотой обрабатывать приходящие на ПЛИС данные? Просветите пожалуйста новичка

Тактируйте передатчик той частотой, какой вам удобно. Главное чтобы данные выводились наружу (в микроконтроллер) с частотой бодрейта.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Aug 22 2017, 17:46
Сообщение #3


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Передатчик UART это просто сдвиговый регистр. Соответственно, тактировать его надо с частотой битрейта. Т.е. в вашем случае 9600 Гц.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Александр77
сообщение Aug 22 2017, 20:11
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 608
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111



Цитата(dimka76 @ Aug 22 2017, 20:46) *
Передатчик UART это просто сдвиговый регистр. Соответственно, тактировать его надо с частотой битрейта. Т.е. в вашем случае 9600 Гц.

Более высокая частота позволяет точнее определять начало приема данных. А сдвиг данных на скорости передачи может обернуться неприятным сбоем.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 22 2017, 20:34
Сообщение #5


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



в 16 раз тактовая частота выше должна быть.
Причины Вам Александр77 Вам рассказал.
Для ПЛИС это не есть проблема.
Посмотрите xapp341 там реализация как раз есть

Для новичка может SPI лучше выбрать? Проще....


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
krux
сообщение Aug 23 2017, 07:45
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



все серийные UART используют на приеме 8х или 16х оверсемплинг с решением принятого бита по мажоритару.

обычно берут максимальную скорость, с которой должен работать UART, например 115200, умножают на коэф. оверсемплинга, например 8х, получают 921600 и используют это значение в качестве тактовой частоты.
Всё, что должно работать медленнее - делают стробированием, с определенными делителями.
Ну и поскольку работать со скоростью 115200 с использованием прерываний без FIFO невозможно - ставят FIFO внутрь этого UART, байт так на 64 как минимум.


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 23 2017, 08:45
Сообщение #7


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(mongol @ Aug 22 2017, 18:24) *
Циклон тактируется от кварца на 100 MHz.
Как быть? Бодрейт для проекта выбран 9600. Делить с помощью PLL частоту кварца до 19200 и с такой же частотой обрабатывать приходящие на ПЛИС данные? Просветите пожалуйста новичка

А зачем тут PLL? Элементарный делитель на 10417...
100*10^6 / 10417 = 9599,69280983 ~ 9600
Ошибка тысячные процента, считаем идеал, stm32 прекрасно такое скушает.
Вот каждый 10417-й цикл выдвигаем бит наружу.

P.S. Обратите внимание: из ПЛИС только передача в сторону STM32, приема нет, как я понял.


--------------------
Go to the top of the page
 
+Quote Post
mongol
сообщение Aug 23 2017, 13:04
Сообщение #8





Группа: Новичок
Сообщений: 4
Регистрация: 22-08-17
Пользователь №: 98 917



Нашёл пост
https://m.habrahabr.ru/post/278005/
Вот здесь по другому принципу высчитывается частота. Причем полученное значение непонятно как коррелирует с желаемым.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Aug 23 2017, 13:21
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(mongol @ Aug 23 2017, 16:04) *
Нашёл пост
https://m.habrahabr.ru/post/278005/
Вот здесь по другому принципу высчитывается частота. Причем полученное значение непонятно как коррелирует с желаемым.

Хороший пример того, как НЕ НАДО делать проекты...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Aug 23 2017, 13:26
Сообщение #10


В поисках себя...
****

Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(mongol @ Aug 23 2017, 16:04) *
Нашёл пост
https://m.habrahabr.ru/post/278005/
Вот здесь по другому принципу высчитывается частота. Причем полученное значение непонятно как коррелирует с желаемым.

Так а Вы сами в сути UART разберитесь. На форуме достаточно много тем про UART. Тем более Вы же не делаете полноценный приемо-передатчик 16С550. А на хабре действительно не самый лучший пример реализации UART.
Go to the top of the page
 
+Quote Post
mongol
сообщение Aug 23 2017, 14:09
Сообщение #11





Группа: Новичок
Сообщений: 4
Регистрация: 22-08-17
Пользователь №: 98 917



Цитата(iosifk @ Aug 23 2017, 14:21) *
Хороший пример того, как НЕ НАДО делать проекты...

Стало очень интересно, в чем минусы вышеприведенного проекта?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Aug 23 2017, 14:12
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(mongol @ Aug 23 2017, 17:09) *
Стало очень интересно, в чем минусы вышеприведенного проекта?

много есть о чем надо рассказать...
Если хотите, то голосом по скайпу. Мой адрес в личной карточке форума...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 23 2017, 17:59
Сообщение #13


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



понимаю, что делаю медвежью помощь...
см. вложение - altera
Цитата
For example, a basic UART implementing the 115200 baud N81 protocol costs only 62 ALUTs.
The example design uart_hw_test implements a simple demo for use with a terminal
app. It takes input characters on the receive side and sends the following character
(for example, ”a” –> ”b”) out the transmitter.



Прикрепленные файлы
Прикрепленный файл  uart.v ( 5.56 килобайт ) Кол-во скачиваний: 21
Прикрепленный файл  uart_tb.v ( 2.7 килобайт ) Кол-во скачиваний: 9
Прикрепленный файл  uart_hw_test.v ( 2.51 килобайт ) Кол-во скачиваний: 9
 


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Inanity
сообщение Aug 23 2017, 21:53
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 221
Регистрация: 6-07-12
Пользователь №: 72 653



Цитата(Maverick @ Aug 23 2017, 20:59) *
понимаю, что делаю медвежью помощь...
см. вложение - altera


Мне очень не нравится этот код.

Смеха ради посмотрел код приёмника и не увидел синхронизаторов там, где по моему мнению они обязаны быть.
Модуль uart_rx. Асинхронные данные приходят по проводу rxd. В этом процессе они защёлкиваются в триггер last_rxd:

Код
reg last_rxd;
always @(posedge clk) begin
    last_rxd <= rxd;
end


Триггер last_rxd может находиться в метастабильном состоянии, т.к. по rxd пакеты приходят асинхронно.
Провод slew тоже метастабилен, т.к. комбинационно зависит от last_rxd:

Код
wire slew = rxd ^ last_rxd;


Далее по коду и slew, и last_rxd используются в различных процессах, if-ах и в автомате состояний.

Код
WAITING : begin
    // wait for a start bit (0)
    if (!slew & sample_now && !last_rxd) begin   // тут ещё нравится использование & и && одновременно.
        state <= READING;
        held_bits <= 0;
    end
end


Оно, может и работает, но по-моему это жесть. Да ещё и копирайт от альтеры)

Сообщение отредактировал Inanity - Aug 23 2017, 21:55
Go to the top of the page
 
+Quote Post
x736C
сообщение Aug 24 2017, 00:19
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Inanity, правильные наблюдения.
Только добавлю то, к чему пришел не сразу и что использую во всех своих проектах.
Правилом хорошего тона является асинхронный сигнал пометить суффиксом.
Например, bus_16_or_68_async.
Обычно, это закладывается в стандарт кодирования. Если посмотреть стандарты известных производителей (из тех, что есть в открытом доступе), это правило или требование присутствует.
В Altera используют префикс a, который пишется слитно с наименованием сигнала. Например, adata.

То есть не очень понятно, с чего Вы взяли, что сигнал в данном примере (а это не более, чем пример от Altera) может быть асинхронным.
В тестбенче rxd = txd; То есть пример представлен в синхронном виде.
Ваше утверждение «Асинхронные данные приходят по проводу rxd» в данном случае все-таки неверно.

Сообщение отредактировал x736C - Aug 24 2017, 00:20
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 13th July 2025 - 04:27
Рейтинг@Mail.ru


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