Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как правильно описать интерфейс на DDR регистрах?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Dima_G
Добрый день!

Не получается достичь более или менее приличной скорости при реализации DDR интерфейса.
Написал тестовый проект - по фронту выходного клока раз в 8 тактов выдается импульс по шине данных (в приложении диаграмма wave.png - результат симуляции в modelsim). Клок смещен в центр данных.

Пробую собрать в Quartus - на 200Мгц уже не вписываюсь во времянки на Arria 10! wacko.gif
Подскажите пожалуйста, где в закралась ошибка.

Исходник тестового модуля (для ddr_reg использовалась ALT_GPIO мегафункция):
Код
module test_sdc
(
    input  bit ref_clk,
    output bit clk_out,
    output bit data_out
);


// Generate reset signal for PLL
bit[3:0] reset_cntr = '0;
bit reset_pll;
always_ff @(posedge ref_clk) begin
    if (reset_cntr != '1)
        reset_cntr <= reset_cntr + 1'b1;
end
assign reset_pll = reset_cntr != '1;

// Generate clock and reset
bit reset_n, core_clk, out_clk;
pll pll_25_200
(
  .locked   ( reset_n   ),
  .outclk_0 ( core_clk  ), // phase 0 deg
  .outclk_1 ( out_clk   ), // phase 90 deg
  .refclk   ( ref_clk   ),
  .rst      ( reset_pll )
);

// Generate data signal
bit[2:0] data_cntr;
always_ff @(posedge core_clk) begin
if (!reset_n)
  data_cntr <= '0;
else
  data_cntr <= data_cntr + 1'b1;
end
assign data_flag = data_cntr == '1;

// Create DDR output for data and clock
ddr_reg ddr_data
(
  .ck      (core_clk),
  .din     ({1'b0, data_flag}),
  .pad_out (data_out)
);

ddr_reg clk_data
(
  .ck      (out_clk),
  .din     (2'b01),
  .pad_out (clk_out)
);

endmodule


Вот наложенные констрейны
Код
create_clock -period 25MHz [get_ports ref_clk]
derive_pll_clocks
derive_clock_uncertainty

create_generated_clock -name ext_clk_pin -source [get_pins pll_25_200|iopll_0|altera_pll_i|twentynm_pll|iopll_inst|outclk[1]] [get_ports {clk_out}]

set_output_delay -clock [get_clocks ext_clk_pin] -max  0.5 [get_ports data_out]
set_output_delay -clock [get_clocks ext_clk_pin] -min -0.5 [get_ports data_out]
set_output_delay -clock [get_clocks ext_clk_pin] -max  0.5 [get_ports data_out] -clock_fall -add_delay
set_output_delay -clock [get_clocks ext_clk_pin] -min -0.5 [get_ports data_out] -clock_fall -add_delay

set_false_path -setup  -fall_from pll_25_200|iopll_0|outclk0 -rise_to ext_clk_pin
set_false_path -setup  -rise_from pll_25_200|iopll_0|outclk0 -fall_to ext_clk_pin
set_false_path -hold   -fall_from pll_25_200|iopll_0|outclk0 -fall_to ext_clk_pin
set_false_path -hold   -rise_from pll_25_200|iopll_0|outclk0 -rise_to ext_clk_pin

set_false_path -from [all_clocks] -to [get_ports {clk_out}]


Приложил так же архив проекта и скриншот из TQ
Dima_G
Провел эксперимент - собрал этот же проект для 3 циклона при помощи квартуса 13.0.
Естественно, пришлось пересоздать PLL и заменить ALTGPIO на ALTDDIO_OUT. Ну и в исходники пришлось внести небольшие изменения.
TQ не выявил ошибок - врямянки выполнимы (см. вложение).

Тестовый проект:
Код
module test_sdc
(
  input  bit ref_clk,
  output bit clk_out,
  output bit data_out
);

// Generate reset signal for PLL
bit[3:0] reset_cntr = '0;
bit reset_pll;
always_ff @(posedge ref_clk) begin
    if (reset_cntr != '1)
        reset_cntr <= reset_cntr + 1'b1;
end
assign reset_pll = reset_cntr != '1;

// Generate clock and reset
bit reset_n, core_clk, out_clk, core_clk_, out_clk_;

pll pll_25_200
(
  .locked   ( reset_n   ),
  .c0       ( core_clk  ), // phase 0 deg
  .c1       ( out_clk   ), // phase 90 deg
  .inclk0   ( ref_clk   ),
  .areset   ( reset_pll )
);

// Generate data signal
bit[2:0] data_cntr;
bit data_flag;
always_ff @(posedge core_clk) begin
  if (!reset_n)
    data_cntr <= '0;
  else
    data_cntr <= data_cntr + 1'b1;
end
assign data_flag = data_cntr == '1;

// Create DDR output for data and clock
ddr_reg ddr_data
(
  .datain_h ( 1'b0      ),
  .datain_l ( data_flag ),
  .outclock ( core_clk  ),
  .dataout  ( data_out  )
);

ddr_reg clk_data
(
  .datain_h ( 1'b0      ),
  .datain_l ( 1'b1      ),
  .outclock ( out_clk   ),
  .dataout  ( clk_out   )
);

endmodule


Констрейны:
Код
create_clock -period 25MHz [get_ports ref_clk]
derive_pll_clocks
derive_clock_uncertainty

create_generated_clock -name ext_clk_pin -source [get_pins clk_data|ALTDDIO_OUT_component|auto_generated|ddio_outa[0]|muxsel] [get_ports {clk_out}]

set_output_delay -clock [get_clocks ext_clk_pin] -max  0.5 [get_ports data_out]
set_output_delay -clock [get_clocks ext_clk_pin] -min -0.5 [get_ports data_out]
set_output_delay -clock [get_clocks ext_clk_pin] -max  0.5 [get_ports data_out] -clock_fall -add_delay
set_output_delay -clock [get_clocks ext_clk_pin] -min -0.5 [get_ports data_out] -clock_fall -add_delay

set_false_path -setup  -fall_from pll_25_200|altpll_component|auto_generated|pll1|clk[0] -rise_to ext_clk_pin
set_false_path -setup  -rise_from pll_25_200|altpll_component|auto_generated|pll1|clk[0] -fall_to ext_clk_pin
set_false_path -hold   -fall_from pll_25_200|altpll_component|auto_generated|pll1|clk[0] -fall_to ext_clk_pin
set_false_path -hold   -rise_from pll_25_200|altpll_component|auto_generated|pll1|clk[0] -rise_to ext_clk_pin

set_false_path -from [all_clocks] -to [get_ports {clk_out}]

MegaVolt
1. Не очень понятно зачем сдвиг на пол такта клока и данных?

2. Не знаю как в Альтере но в Хилинх по моим прикидкам затащить что-то снаружи больше 250Мгц уже нужно ставить выравнивание фронтов.
des00
Цитата(Dima_G @ Nov 13 2015, 20:37) *
Провел эксперимент - собрал этот же проект для 3 циклона при помощи квартуса 13.0.
Естественно, пришлось пересоздать PLL и заменить ALTGPIO на ALTDDIO_OUT. Ну и в исходники пришлось внести небольшие изменения.
TQ не выявил ошибок - врямянки выполнимы (см. вложение).

Чего то там намучено в этих новых чипах. Вот похожая тема Смотрите полную информацию по путям : откуда пришли, через что идут, с какими задержками.
Dima_G
Цитата(MegaVolt @ Nov 14 2015, 01:01) *
1. Не очень понятно зачем сдвиг на пол такта клока и данных?
2. Не знаю как в Альтере но в Хилинх по моим прикидкам затащить что-то снаружи больше 250Мгц уже нужно ставить выравнивание фронтов.

Помочь фиттеру выполнить setup/hold соотношения.

Цитата(des00 @ Nov 14 2015, 10:06) *
Чего то там намучено в этих новых чипах. Вот похожая тема Смотрите полную информацию по путям : откуда пришли, через что идут, с какими задержками.

Смотрел пути в ChipPlanner - ясности не прибавилось. Почему-то набегает дикая (~3.5нс) задержка распространения сигнала до IO регистра.


Dima_G
Попробовал собрать этот же проект для Cyclone 5 - та же проблема со слаками smile3046.gif
andrew_b
Цитата(Dima_G @ Nov 16 2015, 08:02) *
Почему-то набегает дикая (~3.5нс) задержка распространения сигнала до IO регистра.
Покажите отчёт TimeQuest по этому пути с включенным Show routing.
Dima_G
Цитата(andrew_b @ Nov 16 2015, 17:27) *
Покажите отчёт TimeQuest по этому пути с включенным Show routing.

Dima_G
Техподдержка Альтеры написала, что "такая частота слишком высокая для GPIO. Используйте мегафункцию PhyLite для реализации таких интерфейсов"
smile3046.gif
des00
Цитата(Dima_G @ Nov 30 2015, 10:17) *
Техподдержка Альтеры написала, что "такая частота слишком высокая для GPIO. Используйте мегафункцию PhyLite для реализации таких интерфейсов"
smile3046.gif

не знаю что они вам ответили. на 5 ой арии я свободно 400 МГц в ддре вытаскиваю наружу.

PS. Надеюсь вы CMOS/LVTTL режимы не поставили ? wink.gif
Dima_G
Цитата(des00 @ Nov 30 2015, 09:35) *
не знаю что они вам ответили. на 5 ой арии я свободно 400 МГц в ддре вытаскиваю наружу.

Вот дословно:
Цитата
The 200MHz output frequency is to high for GPIO.
For such frequency the PHYLite IP should be used. That IP is dedicated to building custom memory interfaces.

laughing.gif

Цитата(des00 @ Nov 30 2015, 09:35) *
PS. Надеюсь вы CMOS/LVTTL режимы не поставили ? wink.gif

Нет, 1.2POD (У меня QDR-IV память подцеплена)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.