Перейти к содержанию
    

Параллельная шина внутри ПЛИС

Есть внешняя шина, подключенная к микроконтроллеру. Внутри ПЛИС к шине подключено несколько устройств. В ПЛИС они объединяются по "или", не смотря, что сигналы описаны с z-состоянием. Потому что внутри ПЛИС таких буферов нет (экзотику обсуждать не предлагаю). Представим 8 16-битовых устройств, и все по "или" объединить. Много логики отъедается. Кстати, я хочу так и описать эту шину, как она реально создается. Если проще не станет, так хотя бы, понятнее.

Нет ли иного способа прочитать устройства? Например, медленные читать последовательно? Точно, сковать всех одной цепью! :rolleyes: И по SPI выбросить. А еще как...?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть внешняя шина, подключенная к микроконтроллеру. Внутри ПЛИС к шине подключено несколько устройств. В ПЛИС они объединяются по "или", не смотря, что сигналы описаны с z-состоянием. Потому что внутри ПЛИС таких буферов нет (экзотику обсуждать не предлагаю). Представим 8 16-битовых устройств, и все по "или" объединить. Много логики отъедается. Кстати, я хочу так и описать эту шину, как она реально создается. Если проще не станет, так хотя бы, понятнее.

Нет ли иного способа прочитать устройства? Например, медленные читать последовательно? Точно, сковать всех одной цепью! :rolleyes: И по SPI выбросить. А еще как...?

Да, шина в ПЛИС разделится на две. Одна - шина на запись пройдет ко всем абонентам в ПЛИС параллельно. А от этих абонентов соберется куча шин и пройдет через мультиплексор и далее на выход через трехстабильные буфера...

Но, поскольку клоки в ПЛИС на порядок быстрее, то дело можно упростить...

Сначала надо написать за сколько времени происходит обмен по шине "снаружи" ПЛИС и какова тактовая внутри ПЛИС? Возможно удастся сделать на "входе" в ПЛИС преобразователь из паралл. в послед (например хотя бы в тетрады или в байты). и внутри далее разрядность шины уменьшить...

И, кстати, при чтении из ПЛИС надо давать 1 такт задержки на открытие шинников из ПЛИС, иначе они греются сильно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сначала надо написать за сколько времени происходит обмен по шине "снаружи" ПЛИС и какова тактовая внутри ПЛИС? Возможно удастся сделать на "входе" в ПЛИС преобразователь из паралл. в послед (например хотя бы в тетрады или в байты). и внутри далее разрядность шины уменьшить...

В микроконтроллере использую аппаратную мультиплексированную адрес-данные 16-битовую шину, там можно задать длительности в тактах (120 МГц) достаточно свободно. Сейчас у меня 11 тактов. Внутри ПЛИС есть 250 МГц, 125 МГц, 25 МГц. Сколько захочу. :rolleyes: Для шины использую 125 МГц.

Как ни преобразовывай, при чтении биты придется объединять. И мне представляется, чем шире шина, тем проще это сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет ли иного способа прочитать устройства? Например, медленные читать последовательно? Точно, сковать всех одной цепью! :rolleyes: И по SPI выбросить. А еще как...?

Xilinx -> шина DCR

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Xilinx -> шина DCR

Спасибо! Направление задано, совпадает с желаемым. Буду мыслить для Altera сделать нечто такое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Xilinx -> шина DCR

daisy chain конечно здорово, но вот если устройств сильно много, частота работы не упрётся во время прохождения через всех подряд?

 

точнее вопрос даже: как именно это обычно делается в каких-нибудь процессорах когда есть куча memory maped регистров на шине памяти и без z состояния.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

daisy chain конечно здорово, но вот если устройств сильно много, частота работы не упрётся во время прохождения через всех подряд?

 

точнее вопрос даже: как именно это обычно делается в каких-нибудь процессорах когда есть куча memory maped регистров на шине памяти и без z состояния.

В ПЛИС для этой цели есть "регистровый файл", который делается из "памяти"... Берем память с раздельными шинами на чтение и запись или двухпортовку, со стороны логики пишем (читаем), со стороны процессора - читаем (пишем)... Дешифрация памяти - встроенная, объем довольно большой...

Или скажем берем "двухпортовку", по одной стороне используем небольшую часть как регистры, по другой - используем как остальную память...

Или вот так...

У Ксайлинкса есть блоки памяти 16х1 из одной ячейки SRL... 16 таких блочков дадут поле 16х16... У более новых - это 64х1... Думаю что 16 регистров - вполне хватит для начала... И это всего 16 логических ячеек...

И к ним FSM, который из "регистров модулей" переносит информацию в "регистровый файл". Возможно что при записи потребуется несколько тактов. Но уж зато чтение - быстрое...

 

PS... Просто в этом случае "голову" надо перестроить с ASIC на FPGA... В ASIC там в одном блоке и обработка и регистры... И шин накрутить не проблема...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ПЛИС для этой цели есть "регистровый файл", который делается из "памяти"... Берем память с раздельными шинами на чтение и запись или двухпортовку, со стороны логики пишем (читаем), со стороны процессора - читаем (пишем)... Дешифрация памяти - встроенная, объем довольно большой...

Чтобы прочитать из памяти во внешний процессор, нужно в нее записать из логики. А шина данных для записи в память одна. Все равно нужен мультиплексор или по "или" объединять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы прочитать из памяти во внешний процессор, нужно в нее записать из логики. А шина данных для записи в память одна. Все равно нужен мультиплексор или по "или" объединять.

Вопрос в том, что либо быстро в память пишем и быстро читаем, либо медленно в память пишем, но быстро читаем... А оно надо писать быстро?

И что, неужели внешний процессор пишет по шине на 120 МГц? LVTTL или LVCMOS?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос в том, что либо быстро в память пишем и быстро читаем, либо медленно в память пишем, но быстро читаем... А оно надо писать быстро?

И что, неужели внешний процессор пишет по шине на 120 МГц? LVTTL или LVCMOS?

Нет, за 11 тактов. По несколько тактов выдать адрес, сигнал защелки адреса, данные, запись / чтение. Я выбрал времена с гарантией, что не потеряю ничего.

Мне не время экономить надо, хотя его тоже терять не желательно. Не хочу тратить логику на мультиплексор данных при чтении. Чисто теоретически. :rolleyes:

 

Всякие RAM и не на такой частоте молотят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Мне не время экономить надо, хотя его тоже терять не желательно. Не хочу тратить логику на мультиплексор данных при чтении. Чисто теоретически. :rolleyes:

Чисто теоретически (а также и практически) все равно придется терять ее родимую - в смысле логику. Так как при любой схеме придется выводит N выходов регистов на 1 выход. Как не крути. Можно только оптимизировать сам мультиплексор - по простоте написания RTL, по универсальности подключения кучи модулей, по времянке и простоте разводки в кристалле.

 

Если у Вас 16-64 регистров - то тут и заморачивается не стоит.

Вот если 200 - 1000. то тогда можно начинать экономить.

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ПЛИС для этой цели есть "регистровый файл", который делается из "памяти"... Берем память с раздельными шинами на чтение и запись или двухпортовку, со стороны логики пишем (читаем), со стороны процессора - читаем (пишем)... Дешифрация памяти - встроенная, объем довольно большой...

Или скажем берем "двухпортовку", по одной стороне используем небольшую часть как регистры, по другой - используем как остальную память...

Или вот так...

У Ксайлинкса есть блоки памяти 16х1 из одной ячейки SRL... 16 таких блочков дадут поле 16х16... У более новых - это 64х1... Думаю что 16 регистров - вполне хватит для начала... И это всего 16 логических ячеек...

я про, например, регистры различной периферии, которой может быть довольно много, килобайты,

то есть наружу оно должно торчать как регистры, а процессору - как область памяти на общей шине с остальной нормальной памятью.

как тут поможет двух портовая память?

не будут же например два различных порта IO, или какой-нибудь уарт чтобы данные из своего регистра прочитать/записать драться за доступ к второму порту шине памяти которая к ним смотрит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у Вас 16-64 регистров - то тут и заморачивается не стоит.

Вот если 200 - 1000. то тогда можно начинать экономить.

Вот кусок софт-процессора... Это как раз шина данных "внутри"...

post-8369-1469461554_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В FLEX10 были цепи Cascade, позволяющие объединять по И / ИЛИ сигналы после LUT. А в Cyclone III нет подобного. :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

В FLEX10 были цепи Cascade, позволяющие объединять по И / ИЛИ сигналы после LUT. А в Cyclone III нет подобного. :crying:

Ну с это и надо начинать - с того чего нет :)

Древовидный mux прост в написании и минимален в latency но при большом количестве входов возникают проблемы с трассировкой. Цепочечный mux больше размером, имеет большой latency но просто трассируется особенно на большом кристалле. Универсального решения нет.

 

Я у себя оптимизирую регистры на чтение так - если возможно без потери функциональности то в FPGA регистры параметров/ управления WriteOnly + soft зеркало в CPU. Если программист капризничает и не хочет (а говорит что не может) возится с зеркалами а хочет читать текущее значение из FPGA то ставлю память для ReadBаck + регистр. То есть пишу и в память и в регистр а читаю только из памяти. Естественно это работает когда нет изменений состояния регистра из логики FPGA. Ну и комбинация этих способов с обычными регистрами. Гемор с переносом состояния регистров в память выгоден в очень редких случаях. Опят же все это для Xilinx где локальная память для LUT просто прелесть какая для такого использования.

 

Вот кусок софт-процессора... Это как раз шина данных "внутри"...

Спасибо! теперь я буду знать как выглядит шина данных :biggrin:

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...