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

 
 
 
Reply to this topicStart new topic
> Передача данных внутри дизайна - как лучше?
akorud
сообщение Feb 18 2011, 15:35
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Приветствую, такой вот вопрос (от начинающего в ПЛИС):
Есть три блока А, В, С. Каждый из них принимает 32 байта, что-то с ними делает (например нормализует), после чего готов передавать их дальше. Блоки соединены цепочкой А->B->C. На вход блока А данные приходят извне (строб + 8 линий данных) с частотой сильно меньше системной (1MHz vs 50MHz).
Вопрос в том как лучше передавать данные между блоками. В голову приходят такие варианты:
1. В блоке два банка памяти. В один принимаем, из другого в том же темпе выпихиваем. Как только приходит достаточное количество данных быстро делаем необходимую обработку и переключаем банки.
2. Один банк. Как только приходит достаточное количество данных быстро делаем необходимую обработку и с системной частотой "активно" выпихиваем дальше. Важно успеть до прихода следующего байта.
3. Какой-нибудь дополнительный "контроллер" управляющий всем. Т.е. каждый из блоков выставляет сигнал "готово" и дальше контроллер "вытягивает" данные и передает дальше.

Блоки А, В, С самописные, так в принципе все интерфейсы можно менять кроме входного. Проблем с ресурсами нет (пока sm.gif
Что скажете? Буду благодарен за любой совет.
Go to the top of the page
 
+Quote Post
Kirill_Good
сообщение Feb 18 2011, 16:28
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 10-12-10
Из: Москва
Пользователь №: 61 528



я бы сделал счетчик , который выдавал clock enable с частотой 1 MHz, для блоков A B C. это первой что пришло в голову, но я тоже новичок в этом деле)
Go to the top of the page
 
+Quote Post
L_Konstantin
сообщение Feb 18 2011, 16:58
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 13-10-06
Из: Новосибирск
Пользователь №: 21 282



Цитата(akorud @ Feb 18 2011, 21:35) *
В голову приходят такие варианты:
1. В блоке два банка памяти. В один принимаем, из другого в том же темпе выпихиваем. Как только приходит достаточное количество данных быстро делаем необходимую обработку и переключаем банки.
2. Один банк. Как только приходит достаточное количество данных быстро делаем необходимую обработку и с системной частотой "активно" выпихиваем дальше. Важно успеть до прихода следующего байта.
3. Какой-нибудь дополнительный "контроллер" управляющий всем. Т.е. каждый из блоков выставляет сигнал "готово" и дальше контроллер "вытягивает" данные и передает дальше.


Попробую написать свои мысли:
1. Если все блоки делают части одной обработки, то все таки общий контроллер управления просто логичен
2. Не понятно все таки какая именно обработка предполагается... Если просто линейная - то все это всего лишь конвейеры, которые соединены последовательно. В этом случае никаких дополнительных сигналов между блоками можно избежать, переложив функцию слежения за появлением валидных данных на собственно управляющий внешний контроллер.
Go to the top of the page
 
+Quote Post
akorud
сообщение Feb 18 2011, 17:13
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата(L_Konstantin @ Feb 18 2011, 17:58) *
Попробую написать свои мысли:
1. Если все блоки делают части одной обработки, то все таки общий контроллер управления просто логичен
2. Не понятно все таки какая именно обработка предполагается... Если просто линейная - то все это всего лишь конвейеры, которые соединены последовательно. В этом случае никаких дополнительных сигналов между блоками можно избежать, переложив функцию слежения за появлением валидных данных на собственно управляющий внешний контроллер.

1. Обработка одна, просто поделена на блоки для упрощения разработки и симуляции.
2. Да, это просто конвейер, но "единица" этого конвеера - фрейм из 32-х байт. Просто меня как-то пугает соединять блоки 256-ю линиями, по этому есть мысли организовать последовательную передачу между блоками, время есть. И вопрос в том кто должен ею управлять - А, В или внешний контроллер. Или это тяжелое наследие программирования и так не надо делать?
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 21 2011, 08:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(akorud @ Feb 18 2011, 20:13) *
2. Да, это просто конвейер, но "единица" этого конвеера - фрейм из 32-х байт. Просто меня как-то пугает соединять блоки 256-ю линиями, по этому есть мысли организовать последовательную передачу между блоками, время есть.
Не пугайтесь. Если обработка данных внутри блока параллельная - то ведите 256 проводами. Если последовательная (по байту) - то так же последовательно и передавайте

Go to the top of the page
 
+Quote Post
akorud
сообщение Feb 21 2011, 17:54
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата(XVR @ Feb 21 2011, 09:56) *
Не пугайтесь. Если обработка данных внутри блока параллельная - то ведите 256 проводами. Если последовательная (по байту) - то так же последовательно и передавайте

Спасибо, буду комбинировать. И еще вопрос, может дилетанта, но как-то неясно - можно ли писать в одном модуле:
Код
always @(posedge clk) begin
    if (counter == 15) begin
        data_out <= data;
        data_ready <= 1;
    end
end

и в другом
Код
always @(posedge clk) begin
    if (data_ready == 1)
        data <= data_in;
end

clk один и тот же, data_out и data_in - соединены. Не будет ли проблем с таймингом, например в момент проверки data_ready, data_in будет в переходном состоянии?
Go to the top of the page
 
+Quote Post
sazh
сообщение Feb 21 2011, 18:46
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(akorud @ Feb 21 2011, 20:54) *
if (counter == 15) begin
data_ready <= 1;
end


без else не будет триггера data_ready, константу нарисует, а что дальше по цепочке..........
Go to the top of the page
 
+Quote Post
akorud
сообщение Feb 21 2011, 19:01
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата(sazh @ Feb 21 2011, 19:46) *
без else не будет триггера data_ready, константу нарисует, а что дальше по цепочке..........

Ну, это я уже научился, код условный, предельно упрощен чтоб передать идею.
Go to the top of the page
 
+Quote Post
Andr2I
сообщение Feb 22 2011, 18:55
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379



Цитата(akorud @ Feb 21 2011, 22:01) *
Ну, это я уже научился, код условный, предельно упрощен чтоб передать идею.


У Вас они будут сдвинуты на такт - сначала из data данные перебросятся в data_out, а на следующем такте data_in забросятся в data.
Go to the top of the page
 
+Quote Post
des00
сообщение Mar 7 2011, 15:28
Сообщение #10


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

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



Цитата(akorud @ Feb 18 2011, 09:35) *
Что скажете? Буду благодарен за любой совет.

для вашей системы, при ваших тактовых и вашем одноноправленном конвейере лучше всего самосинхронные схемы с handshake вида valid/ready


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

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 10:01
Рейтинг@Mail.ru


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