Перейти к содержанию
    

Как поместить сообщение в очередь

Здравствуйте!

 

Разбираюсь с написанием UART-а на Kintex-7. Есть вопрос по архитектуре.

Допустим, есть модуль трансмиттера

module uart_tx (clk,rst,tx_data,tx_data_valid,tx_data_ack,txd);
  
output txd;
input clk, rst;
input [7:0] tx_data;
input tx_data_valid;
output tx_data_ack;

Он занимается выщелкиванием битов, с ним все понятно. Перед ним мне кажется правильным поставить очередь, которая занималась бы постепенной выдачей байтов, по одному. А на вход этой очереди хочется подавать сразу все сообщение. В идеале - переменной длины. Произошло некое событие - я сразу же в один такт помещаю в очередь, скажем, 18 байт, а дальше трансмиттер мееедленно их вычитывает. В FIFO генераторе можно сделать различную ширину входного и выходного портов, но только с отношением до 8:1. Не очень удобно.

 

Подскажите, я вообще в правильную сторону думаю? Как обычно решается эта задача?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, я вообще в правильную сторону думаю? Как обычно решается эта задача?

Обычно задача решается так:

FSM + FIFO + UART

или так:

RAM + Указатель адреса начала сообщения + DMA + FSM

 

подробнее могу завтра по скайпу рассказать.

 

Или вот у Ксайлинкса после установки ISE:

c:\Xilinx\14.7\ISE_DS\ISE\ISEexamples\wave_gen_ver_v6.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

iosifk, Спасибо. Если можно, давайте обсудим в рамках форума.

 

Что делает FSM? Подсовывает байты подряд на вход FIFO? Тогда зачем нужна FIFO? если мы ее руками фактически уже сделали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что делает FSM? Подсовывает байты подряд на вход FIFO? Тогда зачем нужна FIFO? если мы ее руками фактически уже сделали?

Время формирования нового сообщения может быть существенно меньше времени передачи этого сообщения через последовательный порт. И в этом случае FIFO позволяет записывать на одной скорости, а считывать на другой. Кроме того, если FIFO может выдавать текущее количество данных, хранящихся в нем, то можно обойтись без счетчика и считывать/передавать байты до тех пор, пока не опустошится буфер памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Время формирования нового сообщения может быть существенно меньше времени передачи этого сообщения через последовательный порт. И в этом случае FIFO позволяет записывать на одной скорости, а считывать на другой.

Я так и хочу. Где взять FIFO, в которую можно закинуть сразу все сообщение, и что делает FSM у FIFO на входе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так и хочу. Где взять FIFO, в которую можно закинуть сразу все сообщение, и что делает FSM у FIFO на входе?

FIFO формировал мегавизардом (для альтеры, у ксилых вроде есть аналог кодегенератор). Глубину буфера, обычно выбирает разработчик (я делаю как минимум с двойным запасом, предполагая что будут сообщения "вот такого размера").

FSM находится не на входе, а управляет работой FIFO и UART по их сигналам (буфер не пустой, передан байт).

Конечный автомат при работе на передачу ждет когда в буфер попадут данные (все или часть), затем начинает побайтно считывать из буфера и толкать в UART, после чего ожидает окончания передачи очередного символа (байта). И так молотит до тех пор, пока буфер не опустошится.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

FIFO формировал мегавизардом (для альтеры, у ксилых вроде есть аналог кодегенератор). Глубину буфера, обычно выбирает разработчик (я делаю как минимум с двойным запасом, предполагая что будут сообщения "вот такого размера").

FSM находится не на входе, а управляет работой FIFO и UART по их сигналам (буфер не пустой, передан байт).

Конечный автомат при работе на передачу ждет когда в буфер попадут данные (все или часть), затем начинает побайтно считывать из буфера и толкать в UART, после чего ожидает окончания передачи очередного символа (байта). И так молотит до тех пор, пока буфер не опустошится.

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

 

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

 

З.Ы. У Хилых эта штука называется IP Coregen.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или вот у Ксайлинкса после установки ISE:

c:\Xilinx\14.7\ISE_DS\ISE\ISEexamples\wave_gen_ver_v6.zip

 

Здесь

http://electronix.ru/forum/index.php?act=a...&tid=120322

 

А буквами, извините но долго... Тем более для Вас надо объяснять много...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...