|
|
  |
Передача данных внутри дизайна - как лучше? |
|
|
|
Feb 18 2011, 15:35
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

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

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

|
Цитата(akorud @ Feb 18 2011, 21:35)  В голову приходят такие варианты: 1. В блоке два банка памяти. В один принимаем, из другого в том же темпе выпихиваем. Как только приходит достаточное количество данных быстро делаем необходимую обработку и переключаем банки. 2. Один банк. Как только приходит достаточное количество данных быстро делаем необходимую обработку и с системной частотой "активно" выпихиваем дальше. Важно успеть до прихода следующего байта. 3. Какой-нибудь дополнительный "контроллер" управляющий всем. Т.е. каждый из блоков выставляет сигнал "готово" и дальше контроллер "вытягивает" данные и передает дальше. Попробую написать свои мысли: 1. Если все блоки делают части одной обработки, то все таки общий контроллер управления просто логичен 2. Не понятно все таки какая именно обработка предполагается... Если просто линейная - то все это всего лишь конвейеры, которые соединены последовательно. В этом случае никаких дополнительных сигналов между блоками можно избежать, переложив функцию слежения за появлением валидных данных на собственно управляющий внешний контроллер.
|
|
|
|
|
Feb 18 2011, 17:13
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(L_Konstantin @ Feb 18 2011, 17:58)  Попробую написать свои мысли: 1. Если все блоки делают части одной обработки, то все таки общий контроллер управления просто логичен 2. Не понятно все таки какая именно обработка предполагается... Если просто линейная - то все это всего лишь конвейеры, которые соединены последовательно. В этом случае никаких дополнительных сигналов между блоками можно избежать, переложив функцию слежения за появлением валидных данных на собственно управляющий внешний контроллер. 1. Обработка одна, просто поделена на блоки для упрощения разработки и симуляции. 2. Да, это просто конвейер, но "единица" этого конвеера - фрейм из 32-х байт. Просто меня как-то пугает соединять блоки 256-ю линиями, по этому есть мысли организовать последовательную передачу между блоками, время есть. И вопрос в том кто должен ею управлять - А, В или внешний контроллер. Или это тяжелое наследие программирования и так не надо делать?
|
|
|
|
|
Feb 21 2011, 17:54
|
Местный
  
Группа: Свой
Сообщений: 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 будет в переходном состоянии?
|
|
|
|
|
Feb 21 2011, 19:01
|
Местный
  
Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842

|
Цитата(sazh @ Feb 21 2011, 19:46)  без else не будет триггера data_ready, константу нарисует, а что дальше по цепочке.......... Ну, это я уже научился, код условный, предельно упрощен чтоб передать идею.
|
|
|
|
|
Feb 22 2011, 18:55
|
Местный
  
Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379

|
Цитата(akorud @ Feb 21 2011, 22:01)  Ну, это я уже научился, код условный, предельно упрощен чтоб передать идею. У Вас они будут сдвинуты на такт - сначала из data данные перебросятся в data_out, а на следующем такте data_in забросятся в data.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|