Jump to content

    

Recommended Posts

Здравствуйте.

Делается на ПЛИС периферийное устройство для микроконтроллера. Микроконтроллер видит ПЛИС как некую внешнюю SARM. Также формирует для нее тактовый сигнал. Т.е. не совсем формирует, внутри ПЛИС этот тактовый сигнал

умножается на PLL и, соответственно, перестает быть синхронным по отношению к тактовой частоте микроконтроллера. 

ПЛИС внутри себя содержит несколько модулей. Каждый модуль это реверсивный счетчик внешних импульсов с регистром захвата и счетчиков импульсов захвата. Т.е. на каждый модуль приходится три регистра, которые по шине SRAM могут читаться-записываться.

Сейчас тактовая внутри ПЛИС составляет 125 МГц. Все внешние импульсы, поступающие на счетчики проходят через триггеры для устранения метастабильности. Также через триггеры для устранения метастабильности проходят сигналы RD и WR, приходящие с 

микроконтроллера. 

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

На самом деле для подсчета внешних импульсов частота в 125 МГц не нужна, можно и медленней. Такая частота выбрана для более быстрого общения с микроконтроллером.

Что если подавать с микроконтроллера тактовую на ПЛИС скажем 40 МГц, не использовать PLL в ПЛИС и тогда наверное можно исключить триггеры для устранения метастабильности для сигналов RD и WR от микроконтроллера. Ведь в таком случае тактовые 

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

Share this post


Link to post
Share on other sites

Если подать на PLL частоту и умножить на 3, то входящая и выходящая не будут синхронны? В смысли фронт не будет совпадать?

Edited by new123

Share this post


Link to post
Share on other sites
13 minutes ago, new123 said:

Если подать на PLL частоту и умножить на 3, то входящая и выходящая не будут синхронны? В смысли фронт не будет совпадать?

При условии, что фаза будет совпадать, то да. 

Share this post


Link to post
Share on other sites
51 minutes ago, dimka76 said:

Что если подавать с микроконтроллера тактовую на ПЛИС скажем 40 МГц, не использовать PLL в ПЛИС и тогда наверное можно исключить триггеры для устранения метастабильности для сигналов RD и WR от микроконтроллера. Ведь в таком случае тактовые 

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

Даже с применением PLL частоты будут синхронными (внешняя, приходящая на вход PLL, и выходящая из него). Можно двигать фазу для учета задержек распространения сигналов. Т.е. лишние триггеры не нужны.

Не нужно бояться близости к  "расчетной предельной". Компилятор рассчитывает ее, исходя их наихудших условий, в реальности такое маловероятно, и даже почти наверняка будет работать и выше предельной (но понятно, что заказчику такое не стоит отдавать).

А как получили "предельную расчетную"? Создавали sdc файл? Или просто скормили компилятору проект, а он сам посчитал частоту, какая получилась, без попытки подогнать под требуемое значение?

Share this post


Link to post
Share on other sites
1 hour ago, dimka76 said:

умножается на PLL и, соответственно, перестает быть синхронным по отношению к тактовой частоте микроконтроллера.

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

А по поводу проекта, как я понял проблема - основной выходной мультиплексор шины, куда сводится вся информация из регистровых файлов, выполненных на DFF? Если верно, ну так уберите такую кучку регистровых файлов) сделайте пакетную обработку на сдвиговом регистре, сделайте зеркало на блочной/распределенной памяти)

Share this post


Link to post
Share on other sites
26 minutes ago, Yuri124 said:

Даже с применением PLL частоты будут синхронными (внешняя, приходящая на вход PLL, и выходящая из него).

А как получили "предельную расчетную"? Создавали sdc файл? Или просто скормили компилятору проект, а он сам посчитал частоту, какая получилась, без попытки подогнать под требуемое значение?

1.Проверил на плате. Сейчас с микроконтроллера подается 25 МГц, в ПЛИС умножается с помощью PLL на 5, получаем 125 МГц. Далее в ПЛИС счетчиком дели на число кратное степени двойки и выводим на ножку. Смотрю осциллографом одним каналом на то, что идет с микроконтроллера, а вторым - то, что выдает ПЛИС. Сигналы не стоят относительно друг друга, а один скачет относительно другого туда-сюда.

2.В настройках проекта задал частоту.

28 minutes ago, des00 said:

А по поводу проекта, как я понял проблема - основной выходной мультиплексор шины, куда сводится вся информация из регистровых файлов, выполненных на DFF? Если верно, ну так уберите такую кучку регистровых файлов) сделайте пакетную обработку на сдвиговом регистре, сделайте зеркало на блочной/распределенной памяти)

Про пакетную обработку не понял. Или вы предлагается от параллельного интерфейса уйти к последовательному ?

Зеркало - это FIFO или двухпортовая память ?

Share this post


Link to post
Share on other sites
5 minutes ago, dimka76 said:

в ПЛИС умножается с помощью PLL на 5, получаем 125 МГц. Далее в ПЛИС счетчиком дели на число кратное степени двойки

Попробуйте в ПЛИС поделить на 5. Или в PLL умножьте на 4. Чтобы убедиться в синхронности частот. И галку поставьте в PLL, что вых частота должна сохранять фазовую привязку к опорной.

 

Share this post


Link to post
Share on other sites
14 minutes ago, Yuri124 said:

Попробуйте в ПЛИС поделить на 5. Или в PLL умножьте на 4. Чтобы убедиться в синхронности частот. И галку поставьте в PLL, что вых частота должна сохранять фазовую привязку к опорной.

Да, моя ошибка. 

Умножаю на 5, делю на 16 получается дробное деление.

Переделал PLL на х4 и все стало синхронно.

Т.е. получается мне триггеры для устранения метастабильности для сигналов RD и WR вовсе не нужны ?

Share this post


Link to post
Share on other sites
11 minutes ago, dimka76 said:

триггеры для устранения метастабильности для сигналов RD и WR вовсе не нужны ?

Не нужны. Но обязательно нужно учесть - как с микроконтроллера это выходит - временнЫе соотношения - (вых частота и сигналы интерфейса) и  входит (данные) , с учетом задержек распространения на плате, и прописать это в  sdc.

Как вариант - можно асинхронно записывать/считывать в ПЛИС, по сигналам с микроконтроллера, и добавить сигнал готовности данных с ПЛИС. Т.е. в регистры ПЛИС данные от микроконтроллера записываются, например, по его сигналу WR. Но нужен будет синхронизатор готовности данных далее в ПЛИС.

Share this post


Link to post
Share on other sites
24 minutes ago, Yuri124 said:

Не нужны. Но обязательно нужно учесть - как с микроконтроллера это выходит - временнЫе соотношения - (вых частота и сигналы интерфейса) и  входит (данные) , с учетом задержек распространения на плате, и прописать это в  sdc.

Как вариант - можно асинхронно записывать/считывать в ПЛИС, по сигналам с микроконтроллера, и добавить сигнал готовности данных с ПЛИС. Т.е. в регистры ПЛИС данные от микроконтроллера записываются, например, по его сигналу WR. Но нужен будет синхронизатор готовности данных далее в ПЛИС.

ОК. Спасибо.

Share this post


Link to post
Share on other sites
3 hours ago, dimka76 said:

При условии, что фаза будет совпадать, то да.

если фазы соблюдать, судя по комментам, нужно сделать 120Mhz (40*3), то альтера рекомедует ввести clock_enable сигнал, если это позволяет логика и все что попадает под clock_en в sdc завести set_multicycle_path. Тогда запаса прибавится заметно.

Share this post


Link to post
Share on other sites
6 часов назад, dimka76 сказал:

Также через триггеры для устранения метастабильности проходят сигналы RD и WR, приходящие с 

микроконтроллера. 

Я сделал по другому, не знаю правильно или нет. Сигналы WR, RD, CS и выход дешифратора адреса объединил по И и завёл на тактовый вход регистра. Когда микроконтроллер пишет в ПЛИС на элементе И образуется импульс и по нарастающему фронту этого импульса регистр принимает данные с шины данных. Микроконтроллер сигнал WR выставляет когда на шинах адреса и данных значения уже стабилизировались. Пока, вроде, всё работает, но у меня и частота, правда, 50 МГц.

Share this post


Link to post
Share on other sites

У меня проблем не было пока в ПЛИС было три модуля со счетчиками. В другом проекте их стало четыре. И тогда при чтении этих счетчиком начали проявляться ошибочные значения при чтении. Редкие, но периодические. Сейчас пока "закостылил" повторным чтением.

Share this post


Link to post
Share on other sites
20 hours ago, dimka76 said:

Про пакетную обработку не понял. Или вы предлагается от параллельного интерфейса уйти к последовательному ?

на вопрос вы не ответили, задержка у вас в выходном мультиплексоре или нет? Если ваш ответ "Да", то я вам предлагаю избавиться от этого мультиплексора.

Один из вариантов сделать просто аналог "индексной адресации" и вычитывать данные о всей вашей системе пакетом. Реализуется через сдвиговый регистр, который загружает данные всей вашей системы (4-х счетчиков), при чтении базового адреса, после этого каждая следующая транзакция чтения по адресу в окне читает следующие данные.

20 hours ago, dimka76 said:

Зеркало - это FIFO или двухпортовая память ?

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

Share this post


Link to post
Share on other sites
6 hours ago, des00 said:

на вопрос вы не ответили, задержка у вас в выходном мультиплексоре или нет?

Судя по отчету временного анализатора - нет.

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

Но проблем не было пока в ПЛИС было три модуля со счетчиками. В другом проекте их стало четыре. И тогда при чтении этих счетчиком начали проявляться ошибочные значения при чтении. Редкие, но периодические. 

При этом в обоих проектах и микроконтроллер и ПЛИС одни и те же. Разводка печатной платы между микроконтроллером и ПЛИС та же. Настройки и тактовые частоты микроконтроллера и ПЛИС те же.

ПЛИС работает на частоте 126 МГц. В первом проекте, где три модуля счетчиков в ПЛИС временной анализатор говорит, что предельная частота 160 МГц, в том проекте, где четыре модуля в ПЛИС - предельная 131 МГц.

Вот и подумал, что может что-то в архитектуре поменять, упростить.

Я конечно еще не успел попробовать удлинить время обращения микроконтроллера к ПЛИС.

ПЛИС - LatticeXP2, среда Diamond 3.12.

image.thumb.png.2cb1eea77cbef696da82f6b1bd3595f7.png

image.thumb.png.ca034ec7edfd557d9f667b05b411826f.png

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.