Jump to content

    
Sign in to follow this  
pavlovconst

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

Recommended Posts

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

 

Разбираюсь с написанием 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. Не очень удобно.

 

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

 

Share this post


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

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

FSM + FIFO + UART

или так:

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


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

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

Share this post


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

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

Share this post


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

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

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

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

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

Share this post


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

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

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

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

 

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

 

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

Share this post


Link to post
Share on other sites
Или вот у Ксайлинкса после установки ISE:

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

 

Здесь

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this