|
Констрейны для контроллера SDR SDRAM на Altera EP2C8Q208, Помогите советом, как правильно посчитать |
|
|
|
Feb 1 2012, 17:53
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Здравствуйте! Есть плата контроллера 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 с такого вывода ?
Сообщение отредактировал IanPo - Feb 1 2012, 18:24
|
|
|
|
|
Feb 1 2012, 18:23
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

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

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Сделал все по статье, не влезаю в 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 ?
|
|
|
|
|
Feb 3 2012, 16:56
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Регистры в IO буферах - не очень понятно, что это. Данные на вых. пинах защелкиваются по клоку - это регистры? Фаза клока - сделать 2 клока, один для сигналов, другой вывести на PLLOut=SDR_CLK ? Проект прилагаю.
Прикрепленные файлы
ipavc.7z ( 20.78 килобайт )
Кол-во скачиваний: 26
|
|
|
|
|
Feb 5 2012, 09:17
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(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, вы не учли что временная диаграмма измениться (в приложении) и нужно скорректировать анализ. Это же элементарно определяется. Как лечить такие вещи можете посмотреть либо у меня в блоге либо в публикациях %) Пока проект не переделаете копать дальше смысла нет. ЗЫ. Совет на будущее, делать все в топе, крайне некрасиво и неправильно
Эскизы прикрепленных изображений
--------------------
|
|
|
|
|
Feb 5 2012, 11:47
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Большое спасибо за ответы 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 написано.
Сообщение отредактировал IanPo - Feb 5 2012, 11:50
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 5 2012, 14:46
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(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. Точно не помню, но где то там ошибка есть, вроде даже на форуме писал об этом. Так что лучше понять что и как задается констрейнами и потом уже работать %) Проект передалайте и выкладывайте. будем рыть дальше.
--------------------
|
|
|
|
|
Feb 7 2012, 05:46
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Поправил проект, назначил Fast Output Registers на управляющие пины и пины данных (oSDR_DQ). -1. С назначением разобрался - пин 15 DQ читался, но не выводился никуда, поэтому Fast Input на нем игнорировался. Я приобщил его к выводу, теперь все нормально. 2. Чтение в 16-битный регистр не помогло, Slackи из-за него идут. Как читать в IO регистр, я не понял  3. Убрал из top логику sdram в отдельный файл
Сообщение отредактировал IanPo - Feb 8 2012, 05:21
|
|
|
|
|
Feb 11 2012, 10:21
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Добрый день! В связи с неответами бьюсь с проектом самостоятельно. Получил-таки стабильную картинку, но в Timing requirements не укладываюсь. Просьба подсказать, как забороть.
Прикрепленные файлы
ipavc.7z ( 21.62 килобайт )
Кол-во скачиваний: 23
|
|
|
|
|
Feb 11 2012, 14:07
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
hynix hy57v641620FTP-H по справ.листку tHZ=tAC3=5.4
Сообщение отредактировал IanPo - Feb 11 2012, 14:10
|
|
|
|
|
Feb 11 2012, 14:28
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(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[*]}]
--------------------
|
|
|
|
|
Feb 11 2012, 15:40
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152

|
Спасибо, так запас по частоте гораздо больше. Вывод из памяти в VGA стабильный. Еще есть вопрос по 2 варианту: правильно ли я понял, что я инвертирую сигнал в исходнике, добавляю -invert в описании тактовой и добавляю multicycle с -setup 2 в sdc?
Сообщение отредактировал IanPo - Feb 11 2012, 15:59
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|