|
Тактирование UART-передатчика (CYCLONE III) |
|
|
|
Aug 22 2017, 15:24
|
Группа: Новичок
Сообщений: 4
Регистрация: 22-08-17
Пользователь №: 98 917

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

фанат 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, приема нет, как я понял.
--------------------
|
|
|
|
|
Aug 23 2017, 13:04
|
Группа: Новичок
Сообщений: 4
Регистрация: 22-08-17
Пользователь №: 98 917

|
Нашёл пост https://m.habrahabr.ru/post/278005/Вот здесь по другому принципу высчитывается частота. Причем полученное значение непонятно как коррелирует с желаемым.
|
|
|
|
|
Aug 23 2017, 14:09
|
Группа: Новичок
Сообщений: 4
Регистрация: 22-08-17
Пользователь №: 98 917

|
Цитата(iosifk @ Aug 23 2017, 14:21)  Хороший пример того, как НЕ НАДО делать проекты... Стало очень интересно, в чем минусы вышеприведенного проекта?
|
|
|
|
|
Aug 23 2017, 17:59
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 23 2017, 21:53
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 24 2017, 00:19
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|