Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Хорошие/плохие идеи для ПЛИС.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Methane
Народ. Нужна книжка, или в общем хоть что-то про то как строить архитектуры. Как делать хорошо и как плохо. К примеру делать шины с Z состоянием - плохо. А как их делать? НУ вот к примеру как по проекту раскидать кучу регистров, висящих на общей ША/ШД? Квартус ругается на Z состояния, и глобальные wor делать не дает. У меня идеи закончились.
Stewart Little
А попробуйте использовать Avalon.
DmitryR
Цитата(Methane @ Dec 23 2010, 14:03) *
Народ. Нужна книжка, или в общем хоть что-то про то как строить архитектуры. Как делать хорошо и как плохо.

В закромах смотрели?

Цитата(Methane @ Dec 23 2010, 14:03) *
К примеру делать шины с Z состоянием - плохо. А как их делать?

Без Z-состояния. Всегда ваш, К.О. sm.gif

Цитата(Methane @ Dec 23 2010, 14:03) *
НУ вот к примеру как по проекту раскидать кучу регистров, висящих на общей ША/ШД? Квартус ругается на Z состояния, и глобальные wor делать не дает. У меня идеи закончились.

Мультиплексорами. Скачайте с Opencores Whishbone Conbus и Conmax и изучите их внутренности.
Methane
Что смотреть в закромах?
Что такое КО?
Вот у меня ощущения что мультиплексор у меня тормозит больше всего.

Код
always_comb begin
        //always @(sel_tx) begin
                case (sel_tx)
                        default: begin
                                tx_dv = 'h0;
                                tx_dfr  = 'h0;
                                tx_req  = 'h0;
                                tx_err = 'h0;
                                tx_desc_l = 'h0;
                                tx_data ={8{8'h8}};//'h0;
                        end
                        SEL_MEMIO: begin
                                tx_dv                 = pcie_memio.tx_dv;
                                tx_dfr          = pcie_memio.tx_dfr;
                                tx_req          = pcie_memio.tx_req;
                                tx_err                 = pcie_memio.tx_err;
                                tx_desc_l         = pcie_memio.tx_desc;
                                tx_data         = pcie_memio.tx_data;
                        end
                        SEL_INTS: begin
                                tx_dv = pcie_ints.tx_dv;
                                tx_dfr  = pcie_ints.tx_dfr;
                                tx_req  = pcie_ints.tx_req;
                                tx_err = pcie_ints.tx_err;
                                tx_desc_l = pcie_ints.tx_desc;
                                tx_data = pcie_ints.tx_data;
                        end
итд.

Так, нормально?
vitan
Цитата(DmitryR @ Dec 23 2010, 14:36) *
В закромах смотрели?

Без Z-состояния. Всегда ваш, К.О. sm.gif

Мультиплексорами. Скачайте с Opencores Whishbone Conbus и Conmax и изучите их внутренности.

+1. Уже с Вами это обсуждали. Похоже, Ваша цель - чтобы форум за Вас и всю работу делал...
Methane
Я глянул на опенкорах. Мне что-то простое. На уровне шины адресс/данные итд.
Serhiy_UA
Цитата(Methane @ Dec 23 2010, 15:03) *
Народ. Нужна книжка, или в общем хоть что-то про то как строить архитектуры...
По ключевым словам Вашего вопроса, не вникая в его суть, т.к. вопрос до конца не понят:
Книга Максфилд К. "Проектирование на ПЛИС. Архитектура, средства и методы. Курс молодого бойца", 2007,
DmitryR
Цитата(Methane @ Dec 23 2010, 14:47) *
Я глянул на опенкорах. Мне что-то простое. На уровне шины адресс/данные итд.

Этот пост говорит о том, что вы ничего не смотрели из того, что я вам сказал. Потому что Wishbone - это и есть шина адресс/данные.
Methane
Цитата(DmitryR @ Dec 23 2010, 14:00) *
Этот пост говорит о том, что вы ничего не смотрели из того, что я вам сказал. Потому что Wishbone - это и есть шина адресс/данные.

Тогда я что-то не то смотрел. То что я смотрел было с тегами какие-то фигнй, громадный проект короче. Зарегился на опенкорес. Жду апрувала.
vitan
Цитата(DmitryR @ Dec 23 2010, 15:00) *
Этот пост говорит о том, что вы ничего не смотрели из того, что я вам сказал. Потому что Wishbone - это и есть шина адресс/данные.

Потому что глянул. А надо было еще осмыслить.
zzzzzzzz
Так, на всякий случай, вставлю 5 копеек.
Прогр. логика да, не "любит" Z-состояние.
А при переводе проекта в ASIC это является неким минусом. Ибо реализация на мультиплексорах ГОРАЗДО более громоздкая и тормозная получается. В ASICах шины с третьим состоянием предпочтительнее.
Стоит это учитывать в проектах, если есть перспектива реализации не только в ПЛИС.
DmitryR
Цитата(zzzzzzzz @ Dec 23 2010, 15:28) *
Прогр. логика да, не "любит" Z-состояние.

Она его не то что не любит, а оно на внутренних буферах FPGA просто не реализовано.

Цитата(zzzzzzzz @ Dec 23 2010, 15:28) *
В ASICах шины с третьим состоянием предпочтительнее.

Я сколько видел библиотек - ни разу не встречал там внутреннего буфера с Z-состоянием. Поэтому думаю, что вы ошибаетесь.
Maverick
Цитата(zzzzzzzz @ Dec 23 2010, 14:28) *
Так, на всякий случай, вставлю 5 копеек.
Прогр. логика да, не "любит" Z-состояние.
А при переводе проекта в ASIC это является неким минусом. Ибо реализация на мультиплексорах ГОРАЗДО более громоздкая и тормозная получается. В ASICах шины с третьим состоянием предпочтительнее.
Стоит это учитывать в проектах, если есть перспектива реализации не только в ПЛИС.

В ПЛИС семейства Virtex II (стр. 28) были внутренние шины с третьим состоянием, а потом Xilinx почему то отказался.
Например синтезатор Xilinx автоматически переводит третье состояние в мултиплексоры...если логика размещается внутри кристала.
Methane
Цитата(vitan @ Dec 23 2010, 14:16) *
Потому что глянул. А надо было еще осмыслить.

Осмыслил. 8 портов. А если 50? Не подходит.
zzzzzzzz
Цитата(DmitryR @ Dec 23 2010, 15:44) *
Она его не то что не любит, а оно на внутренних буферах FPGA просто не реализовано.

Цитата(Maverick @ Dec 23 2010, 15:45) *
В ПЛИС семейства Virtex II (стр. 28) были внутренние шины с третьим состоянием, а потом Xilinx почему то отказался.
Например синтезатор Xilinx автоматически переводит третье состояние в мултиплексоры...

Да, не реализовано. Это и есть моё "не любит". Но, варианты "обхода" для последующего ASIC-строительства есть.
Отказался, скорее всего, из-за того, что есть зависимость между емкостью шины и мощностью требуемого буфера. Т.е. нет универсальности. А с мультиплексорами несколько более просто по нагрузкам, более просчитываемо.

Цитата
Я сколько видел библиотек - ни разу не встречал там внутреннего буфера с Z-состоянием. Поэтому думаю, что вы ошибаетесь.
А я встречал. И сам их "рисовал". Поэтому, ошибаться не могу, пардон.
А экономия получается весьма приличная. Отсюда и подход.
Правда, многих этот момент мало интересует. Работает как-то, да и ладно. Тоже политика.

Оффтопить не буду, завязываю.
vitan
Цитата(zzzzzzzz @ Dec 23 2010, 15:28) *
Стоит это учитывать в проектах, если есть перспектива реализации не только в ПЛИС.

Да тут перспектива скомпилить весьма туманна, а Вы!..

Цитата(Methane @ Dec 23 2010, 15:48) *
Осмыслил. 8 портов. А если 50? Не подходит.

Откуда цифры-то, елки-палки?
Serhiy_UA
Цитата(Methane @ Dec 23 2010, 16:48) *
Осмыслил. 8 портов. А если 50? Не подходит.
Если регистров много и их надо опросить все, например, последовательно, то хороший выход - сдвиговые регистры. То есть одновременная запись/опрос входов в регистры, а потом сдвиг между регистрами через цепочку типа "трамвай", таким образом удаляются ненавистные всем мультиплексоры. Как бы получается конвейер с очень большой итоговой скоростью.
Если память не изменяет, то подобный архитектурный принцип реализован на матрицах ПЗС в цифровых фотокамерах.
Methane
Цитата(vitan @ Dec 23 2010, 14:58) *
Откуда цифры-то, елки-палки?

Ну у меня из проекта. Ну вот хочу я кучу регистров, таймеров, каналов DMA. На каждый канал DMA нужен начало, конец, статус и контрол. Уже 4 штуки. На таймер - один. На одно прерывание (MSI-X) два. Вот и получается, что число 50, вполне реальное кол-во регистров на проект. Причем если DMA, то мне нужно чтобы какойнить сигнал говорил о том что произошла запись в определенный байт. А если чтение, то мне может понадобится чуть задержать чтение, выставив сигнал что данные не готовы. Плюс есть всякие внутренне сигналы которые хочется мониторить. Если делать так как в вишбоне написано, то ж-па получается гранзиозная. Решение красивое только с Z состоянием.

Цитата(Serhiy_UA @ Dec 23 2010, 15:06) *
Если регистров много и их надо опросить все, например, последовательно, то хороший выход - сдвиговые регистры.

Не опросить. Ктонить микроконтроллер видел? Там к примеру UART. В нем несколько регистров через которые его можно сконфигурировать. Есть таймер, у него тоже есть несколько регистров. итд. Я что-то похожее хочу.
vitan
Цитата(Methane @ Dec 23 2010, 16:11) *
Если делать так как в вишбоне написано, то ж-па получается гранзиозная. Решение красивое только с Z состоянием.

Ж-па - величина комплЕксная. У нее есть мнимая и действительная части.
В вашем случае она равна i.

А что, трудно поделить шину не между 50 регистрами, а между 5 блоками, в каждом из которых по 10 регистров???
mse
"может быть, я сейчас скажу какую-нибудь глупость..."(С)
Ну я, например, не парюсь, а пишу где ни попадя даже не считая сколько раз(но, однозначно больше 50)
Код
assign dataBus[7:0]=(addrBus[2]|decoder[0]|nrd|divSel)?8'hzz:result[7:0];

И не парюсь. Ну говорит мне Квартус, что мою шину он перекомпоновал через логическое "ор", а мне пофиг.
Methane
Цитата(vitan @ Dec 23 2010, 15:19) *
Ж-па - величина комплЕксная. У нее есть мнимая и действительная части.
В вашем случае она равна i.

А что, трудно поделить шину не между 50 регистрами, а между 5 блоками, в каждом из которых по 10 регистров???

Плодить сущности. И не красиво.

Цитата(mse @ Dec 23 2010, 15:56) *
"может быть, я сейчас скажу какую-нибудь глупость..."(С)
Ну я, например, не парюсь, а пишу где ни попадя даже не считая сколько раз(но, однозначно больше 50)
Код
assign dataBus[7:0]=(addrBus[2]|decoder[0]|nrd|divSel)?8'hzz:result[7:0];

И не парюсь. Ну говорит мне Квартус, что мою шину он перекомпоновал через логическое "ор", а мне пофиг.

Мне тоже пофиг. Но он недавно стал говорить еще и timing requirement not met, а это мне уже не пофиг.
vitan
Цитата(Methane @ Dec 23 2010, 17:29) *
Плодить сущности.

Давно я этим не занимался, конечно, но припоминаю, что это называется по другому, а именно буквами RTL. Со всей вытекающей теорией и практикой, в которой, кстати, все "timing constraints are met" почему-то...
ViKo
Цитата(Methane @ Dec 23 2010, 16:29) *
Но он недавно стал говорить еще и timing requirement not met, а это мне уже не пофиг.

Можно сделать мультиплексор с конвейером. В первом такте декодировать старшие разряды адреса, а во втором младшие. Будет задержка на такт. Читать данные с учетом этой задержки.
Аналогично при записи с шины. Нужно сформировать сигналы выбора и записи. Тоже можно конвейером.
Methane
Кое что проясняется. ПОчему-то он ругается, только на те сигналы, которые расположены возле "железной" корки. В ПЛИСине есть PCIe, квартус ругается что не успевает только на те сигналы, которые идут непосредственно от "последних" регистров расположенных в LCELL к "железной" PCIe. Кажется это нужно крутить настройки оптимизатора. Только я не могу понять какие.
DmitryR
Цитата(Methane @ Dec 23 2010, 17:29) *
И не красиво.

А вам что, шашечки надо или уже поехать наконец? Вы спрашивали, как архитекутрно правильно организовать дизайн. Вам ответили: надо создать шину, на нее повесить крупные блоки (DMA - блок, таймер - блок, etc.), у каждого блока его регистры внутри. Тот факт, что коммутаторы Wishbone c Opencores сделаны под 8 агентов тоже неиллюзорно намекает именно на такую реализацию. Таким образом вы во-первых получаете декомпозированный и внятный дизайн, а во-вторых разбиваете свой пятидесятивходовой мультиплексор (выбирающий, какой из пятидесяти регистров подать мастеру на вход) на два уровня: в шине и в каждом блоке. Это дает вам возможность внутри блоков поставить на входе триггеры, что даст возможность получить приемлемую частоту работы схемы.
А делать Z-состояния, надеясь на компилятор, или объединять все регистры разных блоков в один кирпич - вот это действительно некрасиво. И намекать, что авторы Wishbone Conbus сделали убожество какое-то на 8 блоков, когда вам хочется 50 регистров каждый отдельным агентом на шину сделать - тоже некрасиво. Ну откройте на Conbus тикет, скажите чтоб сделали срочно на 64 агента, смотришь - может проймет их ваша аргументация.
Methane
Цитата(DmitryR @ Dec 23 2010, 18:47) *
А вам что, шашечки надо или уже поехать наконец? Вы спрашивали, как архитекутрно правильно организовать дизайн. Вам ответили: надо создать шину, на нее повесить крупные блоки (DMA - блок, таймер - блок, etc.), у каждого блока его регистры внутри. Тот факт, что коммутаторы Wishbone c Opencores сделаны под 8 агентов тоже неиллюзорно намекает именно на такую реализацию. Таким образом вы во-первых получаете декомпозированный и внятный дизайн, а во-вторых разбиваете свой пятидесятивходовой мультиплексор (выбирающий, какой из пятидесяти регистров подать мастеру на вход) на два уровня: в шине и в каждом блоке. Это дает вам возможность внутри блоков поставить на входе триггеры, что даст возможность получить приемлемую частоту работы схемы.

И заодно длинный, запутаный pipeline.
Цитата
А делать Z-состояния, надеясь на компилятор, или объединять все регистры разных блоков в один кирпич - вот это действительно некрасиво. И намекать, что авторы Wishbone Conbus сделали убожество какое-то на 8 блоков, когда вам хочется 50 регистров каждый отдельным агентом на шину сделать - тоже некрасиво. Ну откройте на Conbus тикет, скажите чтоб сделали срочно на 64 агента, смотришь - может проймет их ваша аргументация.

А какая-то есть литература на по этому поводу? НУ там 8, нормально, а 64 уже перебор?

И у меня подозрение что не в моей писанине дело.
mse
Цитата(Methane @ Dec 23 2010, 17:29) *
Плодить сущности. И не красиво.


Мне тоже пофиг. Но он недавно стал говорить еще и timing requirement not met, а это мне уже не пофиг.

Т.е. вы хотите сказать, что в свои регистры вы укладываете данные по шине за время, ну например, 5-10нс? Имею в виду время между появлением данных и активным фронтом сигнала WR.
ИМХО, даже самые наворочаные ДСПшки не имеют цикл шины такого порядка.
vitan
Цитата(mse @ Dec 23 2010, 21:47) *
Т.е. вы хотите сказать, что в свои регистры вы укладываете данные по шине за время, ну например, 5-10нс? Имею в виду время между появлением данных и активным фронтом сигнала WR.
ИМХО, даже самые наворочаные ДСПшки не имеют цикл шины такого порядка.

Есть подозрение, что там желание прямо с PCI Express писать во все регистры в реальном времени...
mse
Цитата(vitan @ Dec 23 2010, 21:52) *
Есть подозрение, что там желание прямо с PCI Express писать во все регистры в реальном времени...

Ну, опять-же ИМХО, там всё равно не десятые нан. У меня в проекте под сотню регистров и на дохлом Cyclone2-8 частота проекта 65МГц. И ограничена совсем не шиной.
Shtirlits
QUOTE (vitan @ Dec 23 2010, 21:52) *
Есть подозрение, что там желание прямо с PCI Express писать во все регистры в реальном времени...

Подозреваю, что вы хотели написать "читать".
Methane
Цитата(mse @ Dec 23 2010, 20:47) *
Т.е. вы хотите сказать, что в свои регистры вы укладываете данные по шине за время, ну например, 5-10нс? Имею в виду время между появлением данных и активным фронтом сигнала WR.
ИМХО, даже самые наворочаные ДСПшки не имеют цикл шины такого порядка.

10нс это 100 мегагерц. 5 это 200. Куча DSP и быстрее будут. Вообще, где данные появились?

Цитата(mse @ Dec 23 2010, 21:19) *
Ну, опять-же ИМХО, там всё равно не десятые нан. У меня в проекте под сотню регистров и на дохлом Cyclone2-8 частота проекта 65МГц. И ограничена совсем не шиной.

И читать и писать, прямо из PC через PCIe.
Serhiy_UA
Как я понял , регистров много: к одним обращаться требуется чаще, к другим реже.
Тогда организуйте их в 2-3 группы, и в каждой используйте свой метод доступа. В одних группах будут большие аппаратурные затраты и выше скорость доступа, а в других наоборот. Это же очевидно… А методов доступа много, о них уже сказано, выбор есть...
DmitryR
Цитата(Serhiy_UA @ Dec 24 2010, 09:12) *
Тогда организуйте их в 2-3 группы, и в каждой используйте свой метод доступа.

Так нельзя - это породит длинный, запутанный pipeline. biggrin.gif
Methane
Цитата(DmitryR @ Dec 24 2010, 08:25) *
Так нельзя - это породит длинный, запутанный pipeline. biggrin.gif

Вам нравится плодить сущьности? Может вам плятят за кол-во строк в проге?
DmitryR
Вы сделали из себя посмешище: имеете статус Гуру, рассуждаете о PCI Express и не можете реализовать банальный мультиплексор, опираясь на три страницы советов.
Methane
Цитата(DmitryR @ Dec 24 2010, 09:09) *
Вы сделали из себя посмешище: имеете статус Гуру, рассуждаете о PCI Express и не можете реализовать банальный мультиплексор, опираясь на три страницы советов.

Могу. Но не хочу. Потому что придется перепахивать всю архитектуру, и все равно получится КРИВО. И не уверен что проблема именно в этом.
mse
Цитата(Methane @ Dec 24 2010, 07:10) *
10нс это 100 мегагерц. 5 это 200. Куча DSP и быстрее будут. Вообще, где данные появились?


И читать и писать, прямо из PC через PCIe.

То, что есть куча ДСП с тактовой, куда большей, чем 100-200МГц, я знаю. Только это не говорит о том, что у них цикл внешней шины хотя-бы 100-200МГц. У тех-же Блэкфинов, даже без готовности, обращение к внешним устройствам занимает несколько циклов периферийного клока и, в реальности, сильно не превышает 50МГц.
Methane
Цитата(mse @ Dec 24 2010, 09:55) *
То, что есть куча ДСП с тактовой, куда большей, чем 100-200МГц, я знаю. Только это не говорит о том, что у них цикл внешней шины хотя-бы 100-200МГц. У тех-же Блэкфинов, даже без готовности, обращение к внешним устройствам занимает несколько циклов периферийного клока и, в реальности, сильно не превышает 50МГц.

При чем тут внешняя шина? Я что-то писал про внешнюю?
DmitryR
Цитата(Methane @ Dec 24 2010, 10:12) *
Могу. Но не хочу.

Не думаю, что в этом разделе форума вам смогут дать дельный совет по мотивации.

Цитата(Methane @ Dec 24 2010, 10:12) *
... и все равно получится КРИВО.

А если вы не начнете что-то делать - у вас никак не получится. Вы находитесь в ситуации ложного выбора - думаете, что есть легкий и красивый способ решить вашу проблему. А такого способа похоже не существует, и выбор, который у вас есть - решить задачу некрасиво (с вашей точки зрения) или не решить ее никак.
XVR
Цитата(Methane @ Dec 24 2010, 07:10) *
И читать и писать, прямо из PC через PCIe.
Ну это не проблема. Писать из PCIe напрямую никто не запретит, для этого шина с Z состоянием не нужна (а нужна шина с повышенным fanout'ом, что синтезатор сделает и сам). А чтение через PCIe - это довольно длительный процесс (на физическом уровне), так что иерархический мультиплексор с пайплайном на всех стадиях должен успеть прочесть все, что нужно.

Methane
Цитата(DmitryR @ Dec 24 2010, 10:17) *
А если вы не начнете что-то делать - у вас никак не получится. Вы находитесь в ситуации ложного выбора - думаете, что есть легкий и красивый способ решить вашу проблему. А такого способа похоже не существует, и выбор, который у вас есть - решить задачу некрасиво (с вашей точки зрения) или не решить ее никак.


Я сейчас, не могу понять, почему квартус ругается на тайминги совсем в другом месте. К примеру из железной корки выходят сигналы, обрабатываются очень простенькой обработкой (которую писали в альтере, и которую я не трогал) и уходят сразу обратно в железную корку. Вот на эти тайминги квартус и ругается. А иногда на другие. Но в любом случае это сигналы между корокй и первыми регистрами за пределами "железной" корки.
vadimuzzz
отчет анализатора хоть покажите, а то в пятницу с телепатами совсем туго
DmitryR
Цитата(Methane @ Dec 24 2010, 11:29) *
Я сейчас, не могу понять, почему квартус ругается на тайминги совсем в другом месте.
...
Но в любом случае это сигналы между корокй и первыми регистрами за пределами "железной" корки.

Если там действительно немного логики - то скорее всего ее вместе c первыми регистрами надо подтянуть поближе к hard IP, применив LogicLock.
Methane
Цитата(vadimuzzz @ Dec 24 2010, 10:33) *
отчет анализатора хоть покажите, а то в пятницу с телепатами совсем туго

Какой? Там файлы по мегабайту. В fitter settings Seed поставил 10, и стало все замечательно.
vitan
Цитата(Methane @ Dec 24 2010, 12:16) *
В fitter settings Seed поставил 10, и стало все замечательно.

Отлично! Так и знал, что кончится чем-то подобным. Предлагаю этот способ распространить на все последующие проблемы. lol.gif
vadimuzzz
Цитата(Methane @ Dec 24 2010, 15:16) *
Какой? Там файлы по мегабайту.

ну, таймквеста. и да, они прекрасно сжимаются
Methane
Цитата(DmitryR @ Dec 24 2010, 10:51) *
Если там действительно немного логики - то скорее всего ее вместе c первыми регистрами надо подтянуть поближе к hard IP, применив LogicLock.

Большое спасибо!!! Основные блоки выделил в logic-lock регионы, они заняли средину ПЛИСины, место возле PCI корки рассосалось, и все стало просто замечательно!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.