ViKo 1 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Есть внешняя шина, подключенная к микроконтроллеру. Внутри ПЛИС к шине подключено несколько устройств. В ПЛИС они объединяются по "или", не смотря, что сигналы описаны с z-состоянием. Потому что внутри ПЛИС таких буферов нет (экзотику обсуждать не предлагаю). Представим 8 16-битовых устройств, и все по "или" объединить. Много логики отъедается. Кстати, я хочу так и описать эту шину, как она реально создается. Если проще не станет, так хотя бы, понятнее. Нет ли иного способа прочитать устройства? Например, медленные читать последовательно? Точно, сковать всех одной цепью! :rolleyes: И по SPI выбросить. А еще как...? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Есть внешняя шина, подключенная к микроконтроллеру. Внутри ПЛИС к шине подключено несколько устройств. В ПЛИС они объединяются по "или", не смотря, что сигналы описаны с z-состоянием. Потому что внутри ПЛИС таких буферов нет (экзотику обсуждать не предлагаю). Представим 8 16-битовых устройств, и все по "или" объединить. Много логики отъедается. Кстати, я хочу так и описать эту шину, как она реально создается. Если проще не станет, так хотя бы, понятнее. Нет ли иного способа прочитать устройства? Например, медленные читать последовательно? Точно, сковать всех одной цепью! :rolleyes: И по SPI выбросить. А еще как...? Да, шина в ПЛИС разделится на две. Одна - шина на запись пройдет ко всем абонентам в ПЛИС параллельно. А от этих абонентов соберется куча шин и пройдет через мультиплексор и далее на выход через трехстабильные буфера... Но, поскольку клоки в ПЛИС на порядок быстрее, то дело можно упростить... Сначала надо написать за сколько времени происходит обмен по шине "снаружи" ПЛИС и какова тактовая внутри ПЛИС? Возможно удастся сделать на "входе" в ПЛИС преобразователь из паралл. в послед (например хотя бы в тетрады или в байты). и внутри далее разрядность шины уменьшить... И, кстати, при чтении из ПЛИС надо давать 1 такт задержки на открытие шинников из ПЛИС, иначе они греются сильно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Сначала надо написать за сколько времени происходит обмен по шине "снаружи" ПЛИС и какова тактовая внутри ПЛИС? Возможно удастся сделать на "входе" в ПЛИС преобразователь из паралл. в послед (например хотя бы в тетрады или в байты). и внутри далее разрядность шины уменьшить... В микроконтроллере использую аппаратную мультиплексированную адрес-данные 16-битовую шину, там можно задать длительности в тактах (120 МГц) достаточно свободно. Сейчас у меня 11 тактов. Внутри ПЛИС есть 250 МГц, 125 МГц, 25 МГц. Сколько захочу. :rolleyes: Для шины использую 125 МГц. Как ни преобразовывай, при чтении биты придется объединять. И мне представляется, чем шире шина, тем проще это сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Нет ли иного способа прочитать устройства? Например, медленные читать последовательно? Точно, сковать всех одной цепью! :rolleyes: И по SPI выбросить. А еще как...? Xilinx -> шина DCR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Xilinx -> шина DCR Спасибо! Направление задано, совпадает с желаемым. Буду мыслить для Altera сделать нечто такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Xilinx -> шина DCR daisy chain конечно здорово, но вот если устройств сильно много, частота работы не упрётся во время прохождения через всех подряд? точнее вопрос даже: как именно это обычно делается в каких-нибудь процессорах когда есть куча memory maped регистров на шине памяти и без z состояния. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба daisy chain конечно здорово, но вот если устройств сильно много, частота работы не упрётся во время прохождения через всех подряд? точнее вопрос даже: как именно это обычно делается в каких-нибудь процессорах когда есть куча memory maped регистров на шине памяти и без z состояния. В ПЛИС для этой цели есть "регистровый файл", который делается из "памяти"... Берем память с раздельными шинами на чтение и запись или двухпортовку, со стороны логики пишем (читаем), со стороны процессора - читаем (пишем)... Дешифрация памяти - встроенная, объем довольно большой... Или скажем берем "двухпортовку", по одной стороне используем небольшую часть как регистры, по другой - используем как остальную память... Или вот так... У Ксайлинкса есть блоки памяти 16х1 из одной ячейки SRL... 16 таких блочков дадут поле 16х16... У более новых - это 64х1... Думаю что 16 регистров - вполне хватит для начала... И это всего 16 логических ячеек... И к ним FSM, который из "регистров модулей" переносит информацию в "регистровый файл". Возможно что при записи потребуется несколько тактов. Но уж зато чтение - быстрое... PS... Просто в этом случае "голову" надо перестроить с ASIC на FPGA... В ASIC там в одном блоке и обработка и регистры... И шин накрутить не проблема... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба В ПЛИС для этой цели есть "регистровый файл", который делается из "памяти"... Берем память с раздельными шинами на чтение и запись или двухпортовку, со стороны логики пишем (читаем), со стороны процессора - читаем (пишем)... Дешифрация памяти - встроенная, объем довольно большой... Чтобы прочитать из памяти во внешний процессор, нужно в нее записать из логики. А шина данных для записи в память одна. Все равно нужен мультиплексор или по "или" объединять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Чтобы прочитать из памяти во внешний процессор, нужно в нее записать из логики. А шина данных для записи в память одна. Все равно нужен мультиплексор или по "или" объединять. Вопрос в том, что либо быстро в память пишем и быстро читаем, либо медленно в память пишем, но быстро читаем... А оно надо писать быстро? И что, неужели внешний процессор пишет по шине на 120 МГц? LVTTL или LVCMOS? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Вопрос в том, что либо быстро в память пишем и быстро читаем, либо медленно в память пишем, но быстро читаем... А оно надо писать быстро? И что, неужели внешний процессор пишет по шине на 120 МГц? LVTTL или LVCMOS? Нет, за 11 тактов. По несколько тактов выдать адрес, сигнал защелки адреса, данные, запись / чтение. Я выбрал времена с гарантией, что не потеряю ничего. Мне не время экономить надо, хотя его тоже терять не желательно. Не хочу тратить логику на мультиплексор данных при чтении. Чисто теоретически. :rolleyes: Всякие RAM и не на такой частоте молотят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Приветствую! Мне не время экономить надо, хотя его тоже терять не желательно. Не хочу тратить логику на мультиплексор данных при чтении. Чисто теоретически. :rolleyes: Чисто теоретически (а также и практически) все равно придется терять ее родимую - в смысле логику. Так как при любой схеме придется выводит N выходов регистов на 1 выход. Как не крути. Можно только оптимизировать сам мультиплексор - по простоте написания RTL, по универсальности подключения кучи модулей, по времянке и простоте разводки в кристалле. Если у Вас 16-64 регистров - то тут и заморачивается не стоит. Вот если 200 - 1000. то тогда можно начинать экономить. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба В ПЛИС для этой цели есть "регистровый файл", который делается из "памяти"... Берем память с раздельными шинами на чтение и запись или двухпортовку, со стороны логики пишем (читаем), со стороны процессора - читаем (пишем)... Дешифрация памяти - встроенная, объем довольно большой... Или скажем берем "двухпортовку", по одной стороне используем небольшую часть как регистры, по другой - используем как остальную память... Или вот так... У Ксайлинкса есть блоки памяти 16х1 из одной ячейки SRL... 16 таких блочков дадут поле 16х16... У более новых - это 64х1... Думаю что 16 регистров - вполне хватит для начала... И это всего 16 логических ячеек... я про, например, регистры различной периферии, которой может быть довольно много, килобайты, то есть наружу оно должно торчать как регистры, а процессору - как область памяти на общей шине с остальной нормальной памятью. как тут поможет двух портовая память? не будут же например два различных порта IO, или какой-нибудь уарт чтобы данные из своего регистра прочитать/записать драться за доступ к второму порту шине памяти которая к ним смотрит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Если у Вас 16-64 регистров - то тут и заморачивается не стоит. Вот если 200 - 1000. то тогда можно начинать экономить. Вот кусок софт-процессора... Это как раз шина данных "внутри"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба В FLEX10 были цепи Cascade, позволяющие объединять по И / ИЛИ сигналы после LUT. А в Cyclone III нет подобного. :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 25 июля, 2016 Опубликовано 25 июля, 2016 · Жалоба Приветствую! В FLEX10 были цепи Cascade, позволяющие объединять по И / ИЛИ сигналы после LUT. А в Cyclone III нет подобного. :crying: Ну с это и надо начинать - с того чего нет :) Древовидный mux прост в написании и минимален в latency но при большом количестве входов возникают проблемы с трассировкой. Цепочечный mux больше размером, имеет большой latency но просто трассируется особенно на большом кристалле. Универсального решения нет. Я у себя оптимизирую регистры на чтение так - если возможно без потери функциональности то в FPGA регистры параметров/ управления WriteOnly + soft зеркало в CPU. Если программист капризничает и не хочет (а говорит что не может) возится с зеркалами а хочет читать текущее значение из FPGA то ставлю память для ReadBаck + регистр. То есть пишу и в память и в регистр а читаю только из памяти. Естественно это работает когда нет изменений состояния регистра из логики FPGA. Ну и комбинация этих способов с обычными регистрами. Гемор с переносом состояния регистров в память выгоден в очень редких случаях. Опят же все это для Xilinx где локальная память для LUT просто прелесть какая для такого использования. Вот кусок софт-процессора... Это как раз шина данных "внутри"... Спасибо! теперь я буду знать как выглядит шина данных Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться