Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FIFO и SDRAM контроллер
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
studert
Привет. Есть фифо буфер входных данных, есть альтеровский СДРАМ контроллер. Необходимо по мере заполнения первого сливать данные во внешнюю память, поскольку сдрам делят еще 2 модуля, то необходимо работать на частотах 80-100 МГц. СДРАМ контроллер в произвольный момент времени может выставить сигнал waitrequest, я так понял из описания шины авалон при получении этого сигнала нужно удерживать неизменными адрес данные и управляющие сигналы. Задержка с отправки запроса на чтение до получения данных около 27 нсек, значит первые 2 такта будут записаны не те данные, а при установке waitrequest данные еще дважды изменятся. Как можно решить эти расхождения? В описании шины avalon ничего подходящего не нашел, там только pipeline чтение. Была мысль поставить промежуточный регистровый буфер, но что-то пока не получилось, да и кажется это некрасивым решением, интересно узнать как вообще решаются такие задачи.
torik
Например что-то типа этого?

Код
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
...
studert
Цитата(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, дождаться освобождения шины, занять ее и передать весь пакет и не обращаться к памяти пока не накопится следующий пакет.
Мне уже посоветовали радикальный метод: написать свой контроллер памяти, но хотелось бы обойтись готовым.
torik
Не надо писать свой - берите SOPC, добавляйте в него свой мастер и память (для тестирования на симуляторе - on_chip).
Не надо запариваться с накапливанием, а потом передачей всего пакета. Авалон шина сама разрулит... Мастеров можно добавлять много, у меня, например при SDRAM 100МГц 16бит одновременно записывался поток 10Мгбайт и выводились 3 по 20Мбайт...

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

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

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

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

СПАСИБО
(очень наглядно, как раз возник подобный вопрос про передачу в сдрам)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.