Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Констрейны для контроллера SDR SDRAM на Altera EP2C8Q208
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
IanPo
Здравствуйте!

Есть плата контроллера SDR SDRAM, пишу VHDL-код для него.

Код
set_time_format -unit ns

create_clock -name "iF14" -period 71.428 [get_ports {iF14}]

create_generated_clock -name {sPLL126} -source [get_pins {altpll0_inst|altpll_component|pll|inclk[0]}] \
    -multiply_by 9 [get_pins {altpll0_inst|altpll_component|pll|clk[0]}]

set_output_delay -clock {sPLL126} -reference_pin [get_ports {oSDR_CLK}] -max 2.0 [get_ports {oSDR_A[*] oSDR_BA[*] oSDR_RAS oSDR_CAS oSDR_WE oSDR_DQM_L oSDR_DQM_H ioSDR_DQ[*]}]
set_output_delay -clock {sPLL126} -reference_pin [get_ports {oSDR_CLK}] -min -1.0 [get_ports {oSDR_A[*] oSDR_BA[*] oSDR_RAS oSDR_CAS oSDR_WE oSDR_DQM_L oSDR_DQM_H ioSDR_DQ[*]}]

set_input_delay -clock {sPLL126} -reference_pin [get_ports {oSDR_CLK}] -max 2.5 [get_ports {ioSDR_DQ[*]}] -add_delay
set_input_delay -clock {sPLL126} -reference_pin [get_ports {oSDR_CLK}] -min 1.0 [get_ports {ioSDR_DQ[*]}] -add_delay


Так вот - чтение сбоит (вывожу через VGA содержимое ОЗУ), на экране видно непостоянство точек.
Тактовая 14*9=126 МГц.

Сильно подозреваю, что я чего-то не так задал.

1) Как правильно рассчитать констрейны? Особенно непонятен set_input_delay

2) CLK на ОЗУ идет от вывода 151 PLLOut. Обязательно ли выводить CLK с такого вывода ?
des00
на сайте альтеры есть дока
Constraint of SOPC Builder design. Там разбирается как раз сдрам и ее констрейны.

ЗЫ. эта же дока есть у меня в блоге, в атаче к одной из статей.
IanPo
Цитата(des00 @ Feb 1 2012, 22:14) *
на сайте альтеры есть дока
Constraint of SOPC Builder design. Там разбирается как раз сдрам и ее констрейны.

ЗЫ. эта же дока есть у меня в блоге, в атаче к одной из статей.

Спасибо, нашел, читаю.
IanPo
Сделал все по статье, не влезаю в timing requirements
Код
create_clock -name "iF14clk" -period 71.428ns [get_ports {iF14}]
derive_pll_clocks
set SDRCLK {altpll0_inst|altpll_component|pll|clk[0]}
create_generated_clock -name {PLL126clk} -source $SDRCLK -offset 0.5 [get_ports {oSDR_CLK}]
set_input_delay -clock PLL126clk -max [expr 5.4 + 0.6] [get_ports {ioSDR_DQ[*]}]
set_input_delay -clock PLL126clk -min [expr 2.5 + 0.4] [get_ports {ioSDR_DQ[*]}]
set_output_delay -clock PLL126clk -max [expr 1.5 + 0.6] [get_ports {oSDR_A[*] oSDR_BA[*] oSDR_RAS oSDR_CAS oSDR_WE oSDR_DQM_L oSDR_DQM_H ioSDR_DQ[*]}]
set_output_delay -clock PLL126clk -min [expr 1 - (0.8 + 0.4)] [get_ports {oSDR_A[*] oSDR_BA[*] oSDR_RAS oSDR_CAS oSDR_WE oSDR_DQM_L oSDR_DQM_H ioSDR_DQ[*]}]


Тактовые
Код
altpll0_inst|altpll_component|pll|clk[0]    Generated    7.936    126.01 MHz    0.000    3.968    50.00    1    9                    false    iF14clk    altpll0_inst|altpll_component|pll|inclk[0]    { altpll0_inst|altpll_component|pll|clk[0] }
iF14clk    Base    71.428    14.0 MHz    0.000    35.714                                            { iF14 }
PLL126clk    Generated    7.936    126.01 MHz    0.500    4.468        1    1        0.500            false    altpll0_inst|altpll_component|pll|clk[0]    altpll0_inst|altpll_component|pll|clk[0]    { oSDR_CLK }


Слаки
Код
PLL126clk    -3.173    -95.956
altpll0_inst|altpll_component|pll|clk[0]    -2.608    -19.867


Как бороться со Slack ?
des00
Цитата(IanPo @ Feb 2 2012, 11:53) *
Как бороться со Slack ?

регистры в IO буферы поставили ? если да, то фазу сдрам клока двигать %)

сделайте проект, в котором минимум логики сдрам для задания констрейнов и выкладывайте сюда %)
IanPo
Регистры в IO буферах - не очень понятно, что это. Данные на вых. пинах защелкиваются по клоку - это регистры?
Фаза клока - сделать 2 клока, один для сигналов, другой вывести на PLLOut=SDR_CLK ?
Проект прилагаю.
des00
Цитата(IanPo @ Feb 3 2012, 10:56) *
Регистры в IO буферах - не очень понятно, что это. Данные на вых. пинах защелкиваются по клоку - это регистры?

гляжу проект,
1. где Fast Input/Output Register ? это регистры в ячейках ввода/вывода, крайне желательны для интерфейсов %)
2. почему при наличии sdc файла, включено использование Classic TA ?
3. логика
Код
                        if sMem_Adr(0) = '0' then
                            sMem_Rd <= ioSDR_DQ(7 downto 0);
                        else
                            sMem_Rd <= ioSDR_DQ(15 downto 8);
                        end if;

не допускает возможности использования триггера в IO буффере, а без этого крайне тяжело выполнить времянку по чтению. Надо переделать.
4. когда вы задали offset, вы не учли что временная диаграмма измениться (в приложении) и нужно скорректировать анализ. Это же элементарно определяется. Как лечить такие вещи можете посмотреть либо у меня в блоге либо в публикациях %)

Пока проект не переделаете копать дальше смысла нет.

ЗЫ. Совет на будущее, делать все в топе, крайне некрасиво и неправильно
IanPo
Большое спасибо за ответы

1. Нашел в Assignment Editore, где задавать. Что ставится в поле From ? Или нужно делать signal sSDR_A для порта oSDR_A и потом задать в исходнике oSDR_A <= sSDR_A (тогда в поле from ставится sSDR_A)? Как быть с двунаправленным DQ ?
2. У меня версия 11.1, я не нашел тут Classic вообще. Решил, что его убрали. В Settings ничего похожего не нашел. Не подскажете, где в Settings такая настройка?
3. Сделаю 16-битное чтение без мультиплексора.
4. Я делал, как в Constraining_SOPC_Designs написано.
des00
Цитата(IanPo @ Feb 5 2012, 06:47) *
1. Нашел в Assignment Editore, где задавать. Что ставится в поле From ? Или нужно делать signal sSDR_A для порта oSDR_A и потом задать в исходнике oSDR_A <= sSDR_A (тогда в поле from ставится sSDR_A)? Как быть с двунаправленным DQ ?
2. У меня версия 11.1, я не нашел тут Classic вообще. Решил, что его убрали. В Settings ничего похожего не нашел. Не подскажете, где в Settings такая настройка?
3. Сделаю 16-битное чтение без мультиплексора.
4. Я делал, как в Constraining_SOPC_Designs написано.

1. ничего, просто пишите что на такие то пины поставить Fast input/output
2. Тогда понятно, 9.1сп2 открыл по дефолту в классике %)
3. Лучше читайте в IO регистр, даже без сигналов разрешения, а потом уже делайте что хотите, только учтите латентность.
4. Точно не помню, но где то там ошибка есть, вроде даже на форуме писал об этом. Так что лучше понять что и как задается констрейнами и потом уже работать %)

Проект передалайте и выкладывайте. будем рыть дальше.
IanPo
Поправил проект, назначил Fast Output Registers на управляющие пины и пины данных (oSDR_DQ).
-1. С назначением разобрался - пин 15 DQ читался, но не выводился никуда, поэтому Fast Input на нем игнорировался. Я приобщил его к выводу, теперь все нормально.
2. Чтение в 16-битный регистр не помогло, Slackи из-за него идут. Как читать в IO регистр, я не понял sad.gif
3. Убрал из top логику sdram в отдельный файл
IanPo
Добрый день!

В связи с неответами бьюсь с проектом самостоятельно.
Получил-таки стабильную картинку, но в Timing requirements не укладываюсь.
Просьба подсказать, как забороть.
des00
модель памяти скажите какая. что то мне 5.4 нс выборки подозрительными кажутся %)
IanPo
hynix hy57v641620FTP-H
по справ.листку tHZ=tAC3=5.4
des00
Цитата(IanPo @ Feb 11 2012, 09:07) *
hynix hy57v641620FTP-H
по справ.листку tHZ=tAC3=5.4

тогда понятно. при периоде 8 нан, смотря на то, что пишет TQ, нужно либо
1. изменить тактирование ПЛИС, сделать отдельный клок на память и подвигать его фазу.
2. инвертировать клок на плис и учесть дополнительную задержку на 1 такт.

ЗЫ. Поправил вам sdc ешник, ИМХО так более правильно.
Код
set_time_format -unit ns
#
create_clock -name {F14clk} -period 71.428 [get_ports {iF14}]
#
derive_pll_clocks

set SDRAM_CLK altpll0_inst|altpll_component|pll|clk[0]


create_generated_clock -name pSDRAM_CLK -source $SDRAM_CLK [get_ports {oSDR_CLK}]
set_clock_groups -exclusive -group [list F14clk $SDRAM_CLK pSDRAM_CLK ]

set_output_delay -clock pSDRAM_CLK -max 1.5  [get_ports {oSDR_A[*] oSDR_BA[*] oSDR_RAS oSDR_CAS oSDR_WE oSDR_DQM_L oSDR_DQM_H ioSDR_DQ[*]}]
set_output_delay -clock pSDRAM_CLK -min -0.2 [get_ports {oSDR_A[*] oSDR_BA[*] oSDR_RAS oSDR_CAS oSDR_WE oSDR_DQM_L oSDR_DQM_H ioSDR_DQ[*]}]

set_input_delay -clock pSDRAM_CLK -max 5.4 [get_ports {ioSDR_DQ[*]}]
set_input_delay -clock pSDRAM_CLK -min 2.5 [get_ports {ioSDR_DQ[*]}]

IanPo
Спасибо, так запас по частоте гораздо больше.
Вывод из памяти в VGA стабильный.
Еще есть вопрос по 2 варианту: правильно ли я понял, что я инвертирую сигнал в исходнике, добавляю -invert в описании тактовой и добавляю multicycle с -setup 2 в sdc?
IanPo
Реализовал 2 вариант (случай точь-в-точь, как в публикации des00 TimeQuest для чайников, часть 4, System-Syncronous Input ).
Работает в реале нормально.
(Если кто будет скачивать: команда рефреш идет извне модуля, а не автоматически - так задумано. Так что не забудьте переделать. И чтение надо поправить, там чип 16-битный)
des00
Цитата(IanPo @ Feb 12 2012, 00:34) *
Работает в реале нормально.

Поздравляю!!! Желаю дальнейших успехов на плисовском пути %)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.