|
Работа с двухпортовой блочной памятью xilinx |
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 24)
|
Oct 17 2014, 06:43
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(gotcha @ Oct 13 2014, 10:21)  Подскажите, может чего-то не учел.
Использую true dual block memory сгенеренный из сoregen Xilinx под spartan3e, клок на кристалле 50МГц. В порт А пишется инфа внешним устройством (частота меньше 25мгц). Из порта В чтение и запись FSMкой на частоте 50мгц. Т.к память синхронная на порт A подан клок прямой, на блок B через инвертор. По идее setup\hold time выдержаны, коллизий не должно быть. Главное при работе, Вы должны следить чтобы не было одновременной записи и чтения из одной и той же ячейки. Циклограммы работы блочной памяти приведены в xapp463... Если хотите сделайте двойную буфферизацию на размер пакета (входных данных) например - в один пишите, в это время из другого читаете, затем наоборот , тогда колизий вообще никогда не возникнет... Только при этом нужно использовать 2 разных блока памяти и их мультиплексировать. Тем более размер пакета Цитата Надо реализовать 8 приемопередатчиков полудуплекс на 513 байт. не большой и памяти не много понадобиться... PS Совет не используйте инверсию частот - на данном этапе без этого можно обойтись и глюков в дальнейшем меньше будет...
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Oct 20 2014, 10:33
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389

|
Цитата(Bad0512 @ Oct 20 2014, 14:28)  В ПЛИС уже давно внутри не может быть двунаправленной шины. Только на входах-выходах, но это не имеет никакого отношения к блочной памяти. В моем случае внешнее устройство (арм) общается с плис как с памятью.
|
|
|
|
|
Oct 20 2014, 10:55
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(gotcha @ Oct 20 2014, 14:20)  Достаточно ли сигналы cs, we, oe, addr, data положить в один триггер по системному клоку в плисе? Нет, недостаточно. Глючить будет, особенно если клок ПЛИС не синхронен с клоком, тактирующим интерфейс памяти у процессора. наиболее простой вариант такой: Надо data защелкивать сигналом WE (использованным в качестве клока), с разрешением, сделанным логикой из CS, addr. этим же клоком и разрешением "взводить" флаг наличия данных. Затем, этот флаг через два триггера перегнать в домен клока ПЛИС, и по нему уже использовать данное дальше, и асинхронно сбросить этот флаг. Чтение, это уже посложнее. Можно реализовать по аналогии - по активному фронту OE и правильных данных на CS/ADDR взвести некий флаг, пропустить его через два триггера, и по этому синхронизированному флагу асинхронно сбросить исходный флаг, и выставить данные наружу. Почему удобно использовать OE и WE в качестве клоков на входныхх триггерах-флагах, это потому, что времянки WE/OE относитлеьно CS/ADDR/DATA всегда документированы и легко констрейнятся, и такой расклад позволяет сократить длительность цикла записи, за счет того, что проход данных в основной домен может идти уже после окончания чикла записи на самой шине (все уже защелкнуто по WE)
|
|
|
|
|
Oct 21 2014, 07:18
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389

|
Цитата(SM @ Oct 20 2014, 14:55)  Надо data защелкивать сигналом WE (использованным в качестве клока), с разрешением, сделанным логикой из CS, addr. этим же клоком и разрешением "взводить" флаг наличия данных. Затем, этот флаг через два триггера перегнать в домен клока ПЛИС, и по нему уже использовать данное дальше, и асинхронно сбросить этот флаг. Если использовать WE как клок и адрес меняется синхронно с WE (судя по осциллу), можем словить не тот адрес? Надо цепляться за фронт WE при переключении в неактивное состояние. Как "асинхронно сбросить этот флаг"? Или сформировать строб, что есть новые адрес и данные?
Сообщение отредактировал gotcha - Oct 21 2014, 08:09
|
|
|
|
|
Oct 21 2014, 09:29
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(gotcha @ Oct 20 2014, 13:33)  В моем случае внешнее устройство (арм) общается с плис как с памятью. так сделайте автомат эмулирущий память в плис - навскидку для примера общение через контролер памяти только наоборот посмотрите SSRAM - преимущество в синхронности какие виды памяти поддерживает арм процессор? может достаточно вывести выводы блочной памяти (один порт) наружу к процессору? скорость обмена какая должна быть? Цитата(gotcha @ Oct 21 2014, 10:18)  Или сформировать строб, что есть новые адрес и данные? формировать строб - есть новые данные - отдельный пин у плис и арм
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Oct 21 2014, 15:49
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(gotcha @ Oct 21 2014, 11:18)  Если использовать WE как клок и адрес меняется синхронно с WE (судя по осциллу), можем словить не тот адрес? Надо цепляться за фронт WE при переключении в неактивное состояние. Э. Я то думал, что у Вас асинхронный интерфейс к памяти. При этом фронт ~WE (задний, нарастающий ) соответствует моменту, когда CS/ADDR/DATA гарантировано стабильны. Цитата(gotcha @ Oct 21 2014, 11:18)  Как "асинхронно сбросить этот флаг"? Или сформировать строб, что есть новые адрес и данные? Ну да, три триггера последовательно - два первых - синхронизаторы, третий - запоминает состояние выхода синхронизатора. И когда на втором единица, а на третьем еще ноль - формируется импульс асинхронного сброса триггера, работающего на клоке "WE", и этот же импульс является сигналом "защелкнутые по WE данные можно использовать в этом тактовом домене".
|
|
|
|
|
Oct 24 2014, 06:44
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389

|
Сделал так io буфер управляется напрямую Код wire ArmReading = ~iCSn & ~iOEn; assign ioData = ArmReading ? dataOut : 8'hzz; далее сигналы cs, oe, we пропускаются через два триггера, после формируются стробы Код always @(posedge iClk) begin {rrCSn, rCSn} <= {rCSn, iCSn}; {rrWEn, rWEn} <= {rWEn, iWEn}; {rrOEn, rOEn} <= {rOEn, iOEn}; end wire wwArmWriting = ~rrCSn & ~rrWEn; wire wwArmReading = ~rrCSn & ~rrOEn;
always @(posedge iClk) begin syncArmWr <= wwArmWriting; syncArmWrStr <= wwArmWriting & ~syncArmWr; syncArmRd <= wwArmReading; syncArmRdStr <= wwArmReading & ~syncArmRd; end соответственно iAddr, ioData обрабатываются в fsmке по стробам, далее в 3 такта происходит работа (чтение\запись) с блочной памятью Maverick, напрямую с блочной работало как часы, но еще нужна конфигурация через регистры. Скорость обмена около 20ms на чтение\запись 8 каналов и конфигурацию.
Сообщение отредактировал gotcha - Oct 24 2014, 06:56
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|