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

Блоки А, В, С самописные, так в принципе все интерфейсы можно менять кроме входного. Проблем с ресурсами нет (пока sm.gif
Что скажете? Буду благодарен за любой совет.
Kirill_Good
я бы сделал счетчик , который выдавал clock enable с частотой 1 MHz, для блоков A B C. это первой что пришло в голову, но я тоже новичок в этом деле)
L_Konstantin
Цитата(akorud @ Feb 18 2011, 21:35) *
В голову приходят такие варианты:
1. В блоке два банка памяти. В один принимаем, из другого в том же темпе выпихиваем. Как только приходит достаточное количество данных быстро делаем необходимую обработку и переключаем банки.
2. Один банк. Как только приходит достаточное количество данных быстро делаем необходимую обработку и с системной частотой "активно" выпихиваем дальше. Важно успеть до прихода следующего байта.
3. Какой-нибудь дополнительный "контроллер" управляющий всем. Т.е. каждый из блоков выставляет сигнал "готово" и дальше контроллер "вытягивает" данные и передает дальше.


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

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

akorud
Цитата(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 будет в переходном состоянии?
sazh
Цитата(akorud @ Feb 21 2011, 20:54) *
if (counter == 15) begin
data_ready <= 1;
end


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

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


У Вас они будут сдвинуты на такт - сначала из data данные перебросятся в data_out, а на следующем такте data_in забросятся в data.
des00
Цитата(akorud @ Feb 18 2011, 09:35) *
Что скажете? Буду благодарен за любой совет.

для вашей системы, при ваших тактовых и вашем одноноправленном конвейере лучше всего самосинхронные схемы с handshake вида valid/ready
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.