реклама на сайте
подробности

 
 
> Интерфейс между МК и ПЛИС, Использование интерфейса внешней памяти
DENth
сообщение Aug 31 2013, 14:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 10-10-12
Из: Санкт-Петербург
Пользователь №: 73 890



Уважаемое сообщество! Есть следующий вопрос по взаимодействию ПЛИС и МК:
Имеем ARM7 LPC2468 и ПЛИС Cyclone 2. ПЛИС подключена к контроллеру внешней памяти ARMа. Данный интерфейс предназначен для работы с асинхронной памятью. Относительно ПЛИС сигналы Write, Read с МК асинхронны. На МК и ПЛИС поступает частота с единого генератора - 12Мгц, но в МК она перемножается до 72МГц - частота ядра. Длительность сигналов контроллера внешней памяти зависит от этой частоты. Частота 72МГц на ПЛИС не идет. Вопрос - как обеспечить максимальное быстродействие между МК и ПЛИС?

Read и Write пропускаю через два последовательных триггера для исключения метастабильного состояния. Но как поступать дальше? Использовать их для тактирования внутренних цепей ПЛИС для записи или чтения состояния регистров и памяти вроде как нельзя. Нужен явный клок. Но его нет с МК.

Сейчас получилось сделать так: стробирую эти сигналы внутренней частотой 72МГц, сформированной на PLL ПЛИС. Получаю сигнал длительностью один период частоты 72МГц. Этот сигнал подаю как сигнал разрешения на внутренние цепи. А клок 72МГц как клок на эти же цепи. Все работает. Но если в МК ускорять работу по этому интерфейсу, то всё перестает работать. Видимо пока я синхронизирую Read, Write внутри ПЛИС, МК уже захлопывает данные, а ПЛИС их еще не успела выставить. Стробировать большей частотой не получается, начинает ругаться временной анализатор.

Как сделать правильно?
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3  
Start new topic
Ответов (30 - 37)
olegras
сообщение Sep 2 2013, 15:59
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 113
Регистрация: 12-03-07
Пользователь №: 26 075



Для Вашего МК (по даташиту) я бы делал так (пока в общих чертах, завтра если будет время - постараюсь набросать):
на внешних портах ПЛИС имеем
- we, заводим на клоковый вход регистра записи (данные и адрес записи, МК -> ПЛИС);
- bls (один из них, скорей всего младший), заводим на клоковый вход регистра чтения (данные и адрес чтения, ПЛИС -> МК);
- oe заводим на управление двунаправленой шиной данных, и на вход разрешения регистра чтения (а может и записи);
- двунаправленную шину данных;
- шину адреса;
- cs (а вдруг Вы не к ПЛИС обращаетесь?).
Внутренним клоком стробируем выход регистра записи и вход регистра чтения (формируем "свои" регистры в клоковом домене);
на внутренних портах этого модуля имеем (выход - в логику ПЛИС, вход - от логики ПЛИС) сигналы в домене своего клока:
- собственно сам внутренний клок ПЛИС (вход);
- адрес записи (выход - адрес, по которому произошла запись);
- сигнал, говорящий о факте записи (выход, выставляется при записи);
- данные записи (выход);
- адрес чтения (выход - адрес по которому МК собирается прочитать из ПЛИС, может объединим с адресом записи);
- сигнал, говорящий о факте чтения (выход, выставляется при чтении);
- данные для чтения (вход, выставляется ПЛИС по адресу чтения).
Повторюсь - пока это в общих чертах. Вы тоже подумайте. Вам достаточно этих сигналов?
В любом случае таймингами EMC МК придется поиграться - обычная процедура при связках двух камней.
Go to the top of the page
 
+Quote Post
DENth
сообщение Sep 2 2013, 18:08
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 10-10-12
Из: Санкт-Петербург
Пользователь №: 73 890



Цитата(olegras @ Sep 2 2013, 19:59) *
Для Вашего МК (по даташиту) я бы делал так (пока в общих чертах, завтра если будет время - постараюсь набросать):
на внешних портах ПЛИС имеем
- we, заводим на клоковый вход регистра записи (данные и адрес записи, МК -> ПЛИС);
- bls (один из них, скорей всего младший), заводим на клоковый вход регистра чтения (данные и адрес чтения, ПЛИС -> МК);
- oe заводим на управление двунаправленой шиной данных, и на вход разрешения регистра чтения (а может и записи);
- двунаправленную шину данных;
- шину адреса;
- cs (а вдруг Вы не к ПЛИС обращаетесь?).
Внутренним клоком стробируем выход регистра записи и вход регистра чтения (формируем "свои" регистры в клоковом домене);
на внутренних портах этого модуля имеем (выход - в логику ПЛИС, вход - от логики ПЛИС) сигналы в домене своего клока:
- собственно сам внутренний клок ПЛИС (вход);
- адрес записи (выход - адрес, по которому произошла запись);
- сигнал, говорящий о факте записи (выход, выставляется при записи);
- данные записи (выход);
- адрес чтения (выход - адрес по которому МК собирается прочитать из ПЛИС, может объединим с адресом записи);
- сигнал, говорящий о факте чтения (выход, выставляется при чтении);
- данные для чтения (вход, выставляется ПЛИС по адресу чтения).
Повторюсь - пока это в общих чертах. Вы тоже подумайте. Вам достаточно этих сигналов?
В любом случае таймингами EMC МК придется поиграться - обычная процедура при связках двух камней.


Про we и bls согласен. Но заводить ли "oe" отдельно? Для выбора направления шины данных на выход из ПЛИС мне кажется можно использовать тот же bls. Задержка распросранения этого сигнала внутри ПЛИС позволит, думаю, выдержать требования по удержанию данных на шине для МК (перед переходом в третье состояние). К тому же из PDF на МК для себя сделал заключения, что сигналы bls и oe практически идентичны друг другу.
CS в данном случае не требуется. На шине сидят только МК и ПЛИС.
Дальше уже не совсем прозрачно - операция чтения/записи будет происходить за один цикл МК? И требуется ли подавать We и bls на клоковые пины ПЛИС?

Go to the top of the page
 
+Quote Post
olegras
сообщение Sep 3 2013, 06:14
Сообщение #33


Частый гость
**

Группа: Участник
Сообщений: 113
Регистрация: 12-03-07
Пользователь №: 26 075



Цитата(DENth @ Sep 2 2013, 22:08) *
... операция чтения/записи будет происходить за один цикл МК? И требуется ли подавать We и bls на клоковые пины ПЛИС?

Так как частота сигналов на шине EMC МК ниже чем системная частота МК (подозреваю, что минимум в два раза), а системная частота ПЛИС равна системной МК - то скорей всего да. То есть не за один цикл МК, а за один цикл ЕМС МК.
we подавать на клоковый вход для того, чтобы не ПЛИС защелкивала шину по своим клокам и по уровню we, а МК в ПЛИС защелкнул своим we.
Набросал часть записи (МК -> ПЛИС)
Прикрепленное изображение
.
Часть чтения позже, скорей всего завтра (завал на работе). Синхронизаторы на шинах данных и адреса скорей всего можно будет убрать - данные и адрес для ПЛИС уже гарантировано защелкнуты. Опыты покажут. ое и bls - не одно и тоже. oe устанавливается только при записичтении, а bls каждый раз - и при записи и при чтении.

Сообщение отредактировал olegras - Sep 3 2013, 11:08
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 3 2013, 07:00
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



--
Go to the top of the page
 
+Quote Post
olegras
сообщение Sep 3 2013, 07:54
Сообщение #35


Частый гость
**

Группа: Участник
Сообщений: 113
Регистрация: 12-03-07
Пользователь №: 26 075



Цитата(DASM @ Sep 3 2013, 11:00) *
А что такой схемке с метастабильностью ? У вас из тригерров с WR clock идет прямо на тригерры от ПЛИС клок. Или я невнимательно читал предыдущее ?

Я имел ввиду что СКОРЕЙ ВСЕГО можно будет оставить только синхронизатор для wrx. Потому что на момент синхронизации wrx по clk - адрес и данные (защелкнутые по we) уже не в метастабильном состоянии.

А еще можно подумать задействовать двухпортовое ОЗУ. В порт А МК будет записывать в домене we. Зная адрес записи, ПЛИС по порту B будет забирать в домене clk.
Go to the top of the page
 
+Quote Post
DENth
сообщение Sep 3 2013, 14:59
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 10-10-12
Из: Санкт-Петербург
Пользователь №: 73 890



Цитата(olegras @ Sep 3 2013, 10:14) *
Набросал часть записи (МК -> ПЛИС)


Действительно хорошее решение. Я проанализировал, набросал тестовый проектик. По редактору диаграмм все отлично работает. Если для wr использовать два последовательных триггера-синхронизатора, то полученный строб wrx как раз то что нужно для входов разрешения внутренней логики. Его период 2 клока внутренней частоты. Эту же частоту подаем на клоковые входы внутренней логики ПЛИС.
С сигналом rd думаю можно поступить аналогично. Тактируем входной регистр, далее на два синхронизатора. Так как основная задача читать внутренне ОЗУ ПЛИС, подаем его на вход разрешения чтения двухпортовой памяти. Клок при чтении опять же внутренний, тот же что и при записи. С регистрами для чтения вроде бы тоже не должно возникнуть сложностей. Сейчас регистры, которые необходимо читать, выбираются через CASE. Перебирается адрес. Адрес храним в регистре. В зависимости от адреса на шину данных выставляем данные соответствующего регистра. Шину на выход держим опять же сигналом rd.
Для данных и адреса при записи синхронизаторы думаю ни к чему. Согласен с Вашей мыслью, что метестабильного состояния здесь быть не должно. Данные при чтении с того же ОЗУ выставятся сами при условиях, описанных выше. Держим шину данных на выход в течениии длительности rd.
Остается лишь вопрос с регистром для хранения адреса чтения. Нельзя ли использовать один и на запись и на чтение, а тактировать его замешанными между собой wr и rd? !wr or !rd. В рекомендациях по правильному описанию проектов ведь допускается пропускать клок через комбинаторную логику, использующую два входа.

Завтра попробую откорректировать проект и посмотреть результат. Полученный код выложу.

Сообщение отредактировал DENth - Sep 3 2013, 15:06
Go to the top of the page
 
+Quote Post
olegras
сообщение Sep 4 2013, 05:26
Сообщение #37


Частый гость
**

Группа: Участник
Сообщений: 113
Регистрация: 12-03-07
Пользователь №: 26 075



С чтением всегда проблем больше. Приходится играться с таймингами МК. Часть чтения для начала такая:

Прикрепленное изображение


Последовательность при чтении: защелкивание адреса по bls -> выработка rdx -> выставление по адресу addr_rx данных на шину data_rd. На все это МК дает время не больше чем toeloeh, которое можно (и нужно) регулировать битами WAITOEN и WAITRD. Пробуйте.
Go to the top of the page
 
+Quote Post
kenning
сообщение Jul 8 2016, 14:02
Сообщение #38





Группа: Участник
Сообщений: 5
Регистрация: 12-01-16
Из: Санкт-Петербург
Пользователь №: 89 990



Цитата(Corner @ Sep 2 2013, 18:22) *
Решал подобную задачку на связке 5576ХС+1986ВЕ91. Быстрее чем на 6 МГц стабильно не работает в принципе. Благо шина 32 бит.

Можно подробнее о том, как была решена эта задача?
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016