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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Автомат передачи данных по SPI slave, Фифо на много слов, оптимизация
Golikov A.
сообщение Feb 25 2015, 16:07
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Всем привет!

задача такая, надо по SPI slave передать данные размером 32+64+6*32 бита и контрольная сумма (итого 37-38 байт)

SPI - slave, на частоте сравнимой с основным клоком, потому асинхронный, синхронизация по CS

Данные рождаются спонтанно, по каким-либо событиям, а забираются мастером как у того будет настроение, потому решил воткнуть фифо.

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

В результате у меня получается такая схема:

SPI - передатчик, которому надо на вход выставить 8 битное данные, а он их выдавит асинхронно на выход. Он сигналом отмечает как забрал данные, и внешняя схема может выставлять следующие данные.

FIFO сделал параллельное, которое засасывает сразу всю посылку. Сделал его не одним фифо на (32+64+6*32) бит, а поставил 1+2+6 32 битных отдельных FIFO.

И вот теперь самое интересное. Надо как -то данные с выхода FIFO перепихать на вход SPI передатчика. И что-то у меня ничего умнее чем огромный мультиплексор на 9 8-битных слов в одно не получается. А еще по ходу перещелкивания он будет подсчитывать контрольную сумму, и добавить ее в конце, то есть мультиплексор 10-11 в 1. Ресурсы не жмут, но как-то не красиво выходит, может кто предложит какое-то более изящное решение?


Может 90 битный SPI будет более правильным решением?


Go to the top of the page
 
+Quote Post
blackfin
сообщение Feb 25 2015, 16:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Golikov A. @ Feb 25 2015, 19:07) *
.. поставил 1+2+6 32 битных отдельных FIFO.

А зачем такой изврат? Нужно сделать один отдельный FIFO на 18 слов, причем, 32-х битных. biggrin.gif
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 25 2015, 17:03
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Если там 37-38 байт, то сделать FIFO на байт, так, 128-256, и обычный 8-битный SPI... Ну или 64-128 16-битных слов... Или... Что-то там очень много проблем придумано из ниоткуда.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 25 2015, 17:17
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
А зачем такой изврат? Нужно сделать один отдельный FIFO на 18 слов, причем, 32-х битных.

возможность параметризовать, сейчас 32+64+6*32, а завтра 8*32, или 2*32+64+6*32, каждый раз генерить новое фифо - муторно. Ноэто не главное, конечно можно было бы просто сразу сделать FIFO 90 бит. Это не решает основной задачи, как эти 90 бит оптимально перепихать в 8 выход SPI

Цитата
Если там 37-38 байт, то сделать FIFO на байт, так, 128-256, и обычный 8-битный SPI... Ну или 64-128 16-битных слов... Или... Что-то там очень много проблем придумано из ниоткуда.

как отсекать целую посылку, если мастер решил в середине утомиться и бросить принимать ее, надо ее всю целиком выкинуть, и быть готовым отдавать следующую. Если всю посылку 9 байт, повернуть в последовательную, то надо будет определять когда конец, и делать дополнительно вычитывалку оставшихся байт
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 25 2015, 17:27
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Golikov A. @ Feb 26 2015, 01:17) *
как отсекать целую посылку, если мастер решил в середине утомиться и бросить принимать ее, надо ее всю целиком выкинуть, и быть готовым отдавать следующую. Если всю посылку 9 байт, повернуть в последовательную, то надо будет определять когда конец, и делать дополнительно вычитывалку оставшихся байт

выкинуть фифо и сделать многобуферный регистровый файл (например 4/8D) с памятью тегов и шириной слова данных 8 бит.


--------------------
Go to the top of the page
 
+Quote Post
blackfin
сообщение Feb 25 2015, 17:30
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Golikov A. @ Feb 25 2015, 20:17) *
Это не решает основной задачи, как эти 90 бит оптимально перепихать в 8 выход SPI..

Вам не знакомо такое явление, как регистр сдвига с параллельной загрузкой?
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 25 2015, 17:35
Сообщение #7


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(blackfin @ Feb 26 2015, 00:30) *
Вам не знакомо такое явление, как регистр сдвига с параллельной загрузкой?

если новый пакет не формируется, пока не была попытка считать старый, то это будет лучший вариант, по простоте и реализации (и црц посчитать и пакет из "фифо" сбросить)

ЗЫ. многобуферный регистровый файл, позволит просто добавить перезапрос пакета если вдруг потребуется wink.gif


--------------------
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 25 2015, 17:48
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Golikov A. @ Feb 25 2015, 20:17) *
как отсекать целую посылку, если мастер решил в середине утомиться и бросить принимать ее,

А как это вообще по SPI можно отследить? По тому, что он поднял CS? Так сделайте FIFO не 8(16,32)-битное, а 9 (17, 33) битное, где старший бит показывает конец посылки - чтобы автомат мог пропустить ненужные данные до конца.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 25 2015, 18:58
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Вам не знакомо такое явление, как регистр сдвига с параллельной загрузкой?

я иногда задаю "детские" вопросы, но сейчас не этот случай

Цитата
выкинуть фифо и сделать многобуферный регистровый файл (например 4/8D) с памятью тегов и шириной слова данных 8 бит.

а теги зачем?
Фактически вы предлагает заменить FIFO на память, такой некий кеш, правильно я понимаю, сохранять строчками и вычитывать словами. И самому следить за последовательностью.

Цитата
если новый пакет не формируется, пока не была попытка считать старый, то это будет лучший вариант, по простоте и реализации (и црц посчитать и пакет из "фифо" сбросить)

то есть все сходятся на том что надо делать 90 битный сдвиговый регистр и не придумывать? Если так то его можно и наружу выдавливать побитово, вместо того чтобы по 8 бит сдвигать и в SPI пихать.


Цитата
А как это вообще по SPI можно отследить? По тому, что он поднял CS? Так сделайте FIFO не 8(16,32)-битное, а 9 (17, 33) битное, где старший бит показывает конец посылки - чтобы автомат мог пропустить ненужные данные до конца.

да CS - синхронизатор, упал в 0 - готовим новый пакет, не важно забрали или нет, если 1 выкидываем что осталось. Расширить фифо на 1 и использовать этот бит как флаг? Ну может быть...


в 90 битном сдвиговом регистре смущает времянка. Ведь чем больше бит, тем больше времени надо чтобы они все разом присвоились. А если он еще и сдвигаться будет по 8 бит...
Go to the top of the page
 
+Quote Post
blackfin
сообщение Feb 25 2015, 19:11
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Golikov A. @ Feb 25 2015, 21:58) *
то есть все сходятся на том что надо делать 90 битный сдвиговый регистр и не придумывать?

Не все, конечно. Я бы сделал на трех счетчиках (два - 7-ми разрядных и один - 3-х разрядный), двух регистровых файлах (на 38 байт каждый) и на регистре сдвига на 8 бит.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 25 2015, 19:14
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Golikov A. @ Feb 25 2015, 21:58) *
Ведь чем больше бит, тем больше времени надо чтобы они все разом присвоились. А если он еще и сдвигаться будет по 8 бит...

Бред какой то... Чем больше бит, тем все они за один такт и присвоятся - тем времени меньше, но ресурсов больше. Чем меньше бит, тем больше тактов надо, чтобы их обработать, пропуская их по очереди.

Цитата(Golikov A. @ Feb 25 2015, 21:58) *
Расширить фифо на 1 и использовать этот бит как флаг? Ну может быть...

Да, если времени достаточно, чтобы, пока мастер заново не активирует CS, пропустить старые данные.
Можно сделать FIFO шириной 9*4=36 бит, где каждый из байтов может быть помечен как крайний в пакете. Можно сделать два FIFO - в одном данные, во втором - длины пакетов. И пропускать сразу весь пакет, зная длину. Но, уже, придется делать свое описание FIFO, а не пользоваться готовыми IP, чтобы уметь пропускать сразу N данных, а не считывать их по одному.

То есть, если надо принимать решение за 1 такт, я бы применил ОЗУ, шириной кратное тому, чему кратны пакеты - то есть, если они всегда имеют целое число 8-битных байт - то 8-битное, если целое число 16-битных - то 16-битное, и т.д., и второе ОЗУ, работающее в режиме FIFO, передающее длины пакетов. И предусмотрел бы в первом FIFO возможность пропустить N (недосланных) слов за раз. Или, если можно долго пропускать байты - то лишний бит-флаг конца пакета, и автомат, пропускающий ненужные байты.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 25 2015, 20:39
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Не все, конечно. Я бы сделал на трех счетчиках (два - 7-ми разрядных и один - 3-х разрядный), двух регистровых файлах (на 38 байт каждый) и на регистре сдвига на 8 бит.


можно поподробнее, что-то я не очень понимаю


Цитата
Бред какой то... Чем больше бит, тем все они за один такт и присвоятся - тем времени меньше, но ресурсов больше. Чем меньше бит, тем больше тактов надо, чтобы их обработать, пропуская их по очереди.


имелось ввиду что если присваивается 90 битный регистр, то это можно делать с меньше частотой, чем 2 45 битных регистра. Достаточное время на установку больше становиться. Ячейки дальше друг от друга, больше проводов, длиннее пути... то есть таская 90 битный регистр боюсь в частоте потерять


Про ОЗУ подумаю, но все равно как-то не складно все выходит...
Go to the top of the page
 
+Quote Post
blackfin
сообщение Feb 26 2015, 04:40
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Golikov A. @ Feb 25 2015, 23:39) *
можно поподробнее, что-то я не очень понимаю

Чтобы ответить "поподробнее", нужно знать:

1. Надо ли использовать два клоковых домена, один - для записи в FIFO, второй - для чтения из FIFO по SPI?
2. Может ли мастер SPI работать в 32-х битном режиме?
3. Всегда ли в FIFO записывается одинаковое количество байт?
4. Нужно ли иметь возможность записывать в FIFO новые данные и читать (по SPI) данные ранее записанные в FIFO одновременно?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 26 2015, 05:46
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



1. не обязательно, можно, но с учетом что клок SPI есть вообще только на время передачи, а также есть разрешающий сигнал который показывает что данные на входе SPI можно менять
2. это не важно с точки зрения мастера, он вычитывает всю посылку. Паузы между словами быть не должно, мастер не будет ждать. 32 битный режим плох только тем что неудобно на лету считать контрольную сумму, изначально данные рождаются без нее, а задерживать их на подсчет не хочется, канал надежный, потому сумма примитивная 16 бит от суммы байт по всему сообщению.
3. длинна посылки фиксирована
4. естественно да, иначе зачем городить фифо. Более того нужно если вычитывание посылки по SPI прервалось со стороны мастера, отбросить ее целиком, и в следующих заход выдать новую целиковую посылку. Досылать хвост старой недопустимо.
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 26 2015, 06:17
Сообщение #15


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Golikov A. @ Feb 26 2015, 02:58) *
а теги зачем?

а без тегов как вы узнаете заполненность буфера и его очередность ? sm.gif


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:51
Рейтинг@Mail.ru


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