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

 
 
 
Reply to this topicStart new topic
> FIFO и SDRAM контроллер, Как заставить работать вместе на 80-100 МГц?
studert
сообщение Mar 19 2008, 06:07
Сообщение #1


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

Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121



Привет. Есть фифо буфер входных данных, есть альтеровский СДРАМ контроллер. Необходимо по мере заполнения первого сливать данные во внешнюю память, поскольку сдрам делят еще 2 модуля, то необходимо работать на частотах 80-100 МГц. СДРАМ контроллер в произвольный момент времени может выставить сигнал waitrequest, я так понял из описания шины авалон при получении этого сигнала нужно удерживать неизменными адрес данные и управляющие сигналы. Задержка с отправки запроса на чтение до получения данных около 27 нсек, значит первые 2 такта будут записаны не те данные, а при установке waitrequest данные еще дважды изменятся. Как можно решить эти расхождения? В описании шины avalon ничего подходящего не нашел, там только pipeline чтение. Была мысль поставить промежуточный регистровый буфер, но что-то пока не получилось, да и кажется это некрасивым решением, интересно узнать как вообще решаются такие задачи.
Go to the top of the page
 
+Quote Post
torik
сообщение Mar 19 2008, 06:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Например что-то типа этого?

Код
vfifo256x16 vfifo            (    .aclr(~CLR),
                            .data(Data16),
                            .rdclk(sdram_clk100),.rdreq(fifo_rdreq),
                            .wrclk(CLK25),.wrreq(WRITE_fifo),
                            .q(fifo_q),
                            .rdempty(fifo_rdempty)
                        );

assign            fifo_rdreq = (~fifo_rdempty) & (~waitrequest0);
always    @(posedge sdram_clk100) begin
    if (fifo_rdempty == 1'b0) begin
        write_n0 <= 1'b0;
    end else begin
        if ((waitrequest0 == 1'b0)) write_n0 <= 1'b1;
    end
end

always    @(sdram_clk100) begin
    address_0 <= (CLR == 1'b1) ?
        (((write_n0 == 1'b0)&&(waitrequest0 == 1'b0)) ? address_0 + 2'd2 : address_0 + 2'd0) :                 start_adr0;
end
wire            [23:0]    start_adr2 = 24'h0;


write_n0 - сигнал записи для SDRAM
address_0 - адрем
fifo_q - подключить к данным памяти
read_n0 - не забыть подключить к 1

Вобщем идея состоит в том, что сигнал записи генерируется из сигнала непустости) фифо и waitrequest
...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
studert
сообщение Mar 19 2008, 09:04
Сообщение #3


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

Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121



Цитата(torik @ Mar 19 2008, 12:41) *
Например что-то типа этого?

Код
vfifo256x16 vfifo            (    .aclr(~CLR),
                            .data(Data16),
                            .rdclk(sdram_clk100),.rdreq(fifo_rdreq),
                            .wrclk(CLK25),.wrreq(WRITE_fifo),
                            .q(fifo_q),
                            .rdempty(fifo_rdempty)
                        );

assign            fifo_rdreq = (~fifo_rdempty) & (~waitrequest0);
always    @(posedge sdram_clk100) begin
    if (fifo_rdempty == 1'b0) begin
        write_n0 <= 1'b0;
    end else begin
        if ((waitrequest0 == 1'b0)) write_n0 <= 1'b1;
    end
end

always    @(sdram_clk100) begin
    address_0 <= (CLR == 1'b1) ?
        (((write_n0 == 1'b0)&&(waitrequest0 == 1'b0)) ? address_0 + 2'd2 : address_0 + 2'd0) :                 start_adr0;
end
wire            [23:0]    start_adr2 = 24'h0;


write_n0 - сигнал записи для SDRAM
address_0 - адрем
fifo_q - подключить к данным памяти
read_n0 - не забыть подключить к 1

Вобщем идея состоит в том, что сигнал записи генерируется из сигнала непустости) фифо и waitrequest
...

Я себе все примерно так и представлял. Вот скомпилировал ваш пример (изменил только условие в always, той где адрес инкрементируется, на posedge sdram_clk100). Результаты симуляции в файле test, что-то они совсем не похожи на требования работы мастера шины (в файле avalon). В режиме когда данные пишутся все время пока буфер не пуст(времена после 940 ns в test), частота работы памяти ограничивается скоростью записи в буфер (в данном случае 25 МГц), тут все вроде как надо. Я же хочу накапливать в фифо пакет 256х32, дождаться освобождения шины, занять ее и передать весь пакет и не обращаться к памяти пока не накопится следующий пакет.
Мне уже посоветовали радикальный метод: написать свой контроллер памяти, но хотелось бы обойтись готовым.

Сообщение отредактировал studert - Mar 19 2008, 09:07
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
torik
сообщение Mar 19 2008, 13:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Не надо писать свой - берите SOPC, добавляйте в него свой мастер и память (для тестирования на симуляторе - on_chip).
Не надо запариваться с накапливанием, а потом передачей всего пакета. Авалон шина сама разрулит... Мастеров можно добавлять много, у меня, например при SDRAM 100МГц 16бит одновременно записывался поток 10Мгбайт и выводились 3 по 20Мбайт...

Если надо, могу потом примерчик поискать и выложить...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
studert
сообщение Mar 19 2008, 14:31
Сообщение #5


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

Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121



Цитата(torik @ Mar 19 2008, 19:49) *
Не надо писать свой - берите SOPC, добавляйте в него свой мастер и память (для тестирования на симуляторе - on_chip).
Не надо запариваться с накапливанием, а потом передачей всего пакета. Авалон шина сама разрулит... Мастеров можно добавлять много, у меня, например при SDRAM 100МГц 16бит одновременно записывался поток 10Мгбайт и выводились 3 по 20Мбайт...

Если надо, могу потом примерчик поискать и выложить...

Тот кусок, что промелькнул раньше, работоспособен? Я и пытаюсь нормальный мастер сделать, который будет входные данные буферизовать и кормить ими сдрам. Но ведь в память писать по последовательным адресам эффективней, чем разные мастера будут скакать по ней активируя/закрывая разные банки чтобы записать одно-два слова, не получится ситуации как в известной басне, тогда от 100 Мгц может мало остаться. Буду рад конкретному рабочему примеру.
Go to the top of the page
 
+Quote Post
torik
сообщение Mar 19 2008, 19:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



А попробовать имеется на чем? Может демоплата быть?
Пример работоспособен, если использовать шину авалон. Мастер делается элементарно: просто создаем компонент без HDL и с "типичным набором мастера" и все...
Прилагаю пример, который я делал под CycloneII Starter Kit. По кнопке записываем данные в память, по другой кнопке читаем. Все это наблюдаем в SignalTab.
Если вместо сдрама взять ончип память, то прекрасно все видно на симуляторе, где надо нарисовать "нажатия кнопок" (это вариант, если платы нет).
Там же можно поглядеть что из себя представляет самодельный мастер...
Прикрепленные файлы
Прикрепленный файл  nios.rar ( 399.25 килобайт ) Кол-во скачиваний: 89
 


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
studert
сообщение Mar 20 2008, 06:15
Сообщение #7


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

Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121



Цитата(torik @ Mar 20 2008, 01:29) *
А попробовать имеется на чем? Может демоплата быть?
Пример работоспособен, если использовать шину авалон. Мастер делается элементарно: просто создаем компонент без HDL и с "типичным набором мастера" и все...
Прилагаю пример, который я делал под CycloneII Starter Kit. По кнопке записываем данные в память, по другой кнопке читаем. Все это наблюдаем в SignalTab.
Если вместо сдрама взять ончип память, то прекрасно все видно на симуляторе, где надо нарисовать "нажатия кнопок" (это вариант, если платы нет).
Там же можно поглядеть что из себя представляет самодельный мастер...

Кита нет (хотя уже трижды пожалел что не уперся вовремя чтобы купили), а свою плату пока не собрал (циклоны где-то в пути). Спасибо за пример, попробую на симуляторе.
Go to the top of the page
 
+Quote Post
yura-w
сообщение Mar 24 2008, 19:18
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 22-06-07
Из: Санкт-Петербург
Пользователь №: 28 617



Цитата(torik @ Mar 19 2008, 22:29) *
А попробовать имеется на чем? Может демоплата быть?
Пример работоспособен, если использовать шину авалон. Мастер делается элементарно: просто создаем компонент без HDL и с "типичным набором мастера" и все...
Прилагаю пример

СПАСИБО
(очень наглядно, как раз возник подобный вопрос про передачу в сдрам)
Go to the top of the page
 
+Quote Post

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

 


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


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