|
|
  |
FIFO и SDRAM контроллер, Как заставить работать вместе на 80-100 МГц? |
|
|
|
Mar 19 2008, 06:07
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

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

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 19 2008, 09:04
|
Частый гость
 
Группа: Свой
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 19 2008, 14:31
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

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

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

|
А попробовать имеется на чем? Может демоплата быть? Пример работоспособен, если использовать шину авалон. Мастер делается элементарно: просто создаем компонент без HDL и с "типичным набором мастера" и все... Прилагаю пример, который я делал под CycloneII Starter Kit. По кнопке записываем данные в память, по другой кнопке читаем. Все это наблюдаем в SignalTab. Если вместо сдрама взять ончип память, то прекрасно все видно на симуляторе, где надо нарисовать "нажатия кнопок" (это вариант, если платы нет). Там же можно поглядеть что из себя представляет самодельный мастер...
Прикрепленные файлы
nios.rar ( 399.25 килобайт )
Кол-во скачиваний: 89
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Mar 20 2008, 06:15
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

|
Цитата(torik @ Mar 20 2008, 01:29)  А попробовать имеется на чем? Может демоплата быть? Пример работоспособен, если использовать шину авалон. Мастер делается элементарно: просто создаем компонент без HDL и с "типичным набором мастера" и все... Прилагаю пример, который я делал под CycloneII Starter Kit. По кнопке записываем данные в память, по другой кнопке читаем. Все это наблюдаем в SignalTab. Если вместо сдрама взять ончип память, то прекрасно все видно на симуляторе, где надо нарисовать "нажатия кнопок" (это вариант, если платы нет). Там же можно поглядеть что из себя представляет самодельный мастер... Кита нет (хотя уже трижды пожалел что не уперся вовремя чтобы купили), а свою плату пока не собрал (циклоны где-то в пути). Спасибо за пример, попробую на симуляторе.
|
|
|
|
|
Mar 24 2008, 19:18
|
Местный
  
Группа: Свой
Сообщений: 305
Регистрация: 22-06-07
Из: Санкт-Петербург
Пользователь №: 28 617

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