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

 
 
> Работа с двухпортовой блочной памятью xilinx
gotcha
сообщение Oct 13 2014, 07:21
Сообщение #1


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

Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389



Подскажите, может чего-то не учел.

Использую true dual block memory сгенеренный из сoregen Xilinx под spartan3e, клок на кристалле 50МГц.
В порт А пишется инфа внешним устройством (частота меньше 25мгц).
Из порта В чтение и запись FSMкой на частоте 50мгц.
Т.к память синхронная на порт A подан клок прямой, на блок B через инвертор.
По идее setup\hold time выдержаны, коллизий не должно быть.

Сообщение отредактировал des00 - Oct 21 2014, 07:34
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 24)
Maverick
сообщение Oct 17 2014, 06:43
Сообщение #16


я только учусь...
******

Группа: Модераторы
Сообщений: 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.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
gotcha
сообщение Oct 20 2014, 10:20
Сообщение #17


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

Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389



Есть ли рекомендации по синхронизации с двунаправленной шиной?
Достаточно ли сигналы cs, we, oe, addr, data положить в один триггер по системному клоку в плисе?
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Oct 20 2014, 10:28
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(gotcha @ Oct 20 2014, 17:20) *
Есть ли рекомендации по синхронизации с двунаправленной шиной?
Достаточно ли сигналы cs, we, oe, addr, data положить в один триггер по системному клоку в плисе?

В ПЛИС уже давно внутри не может быть двунаправленной шины. Только на входах-выходах, но это не имеет никакого отношения к блочной памяти.
Go to the top of the page
 
+Quote Post
gotcha
сообщение Oct 20 2014, 10:33
Сообщение #19


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

Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389



Цитата(Bad0512 @ Oct 20 2014, 14:28) *
В ПЛИС уже давно внутри не может быть двунаправленной шины. Только на входах-выходах, но это не имеет никакого отношения к блочной памяти.

В моем случае внешнее устройство (арм) общается с плис как с памятью.

Go to the top of the page
 
+Quote Post
SM
сообщение Oct 20 2014, 10:55
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post
gotcha
сообщение Oct 21 2014, 07:18
Сообщение #21


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Maverick
сообщение Oct 21 2014, 09:29
Сообщение #22


я только учусь...
******

Группа: Модераторы
Сообщений: 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.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
SM
сообщение Oct 21 2014, 15:49
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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 данные можно использовать в этом тактовом домене".
Go to the top of the page
 
+Quote Post
gotcha
сообщение Oct 24 2014, 06:44
Сообщение #24


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
SM
сообщение Oct 25 2014, 06:10
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(gotcha @ Oct 24 2014, 10:44) *
Сделал так

Если нет цели максимально поднять быстродействие по записи (конвейеризировать, чтобы работать около предела скорости асинхронной шины для Вашей тактовой), то такая схема вполне нормальная.
Go to the top of the page
 
+Quote Post

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

 


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


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