Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DE0 + sdram
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Evired
Пытаюсь задействовать SDRAM на плате Terasic DE0. SOPC билдером построил систему, включил в нее контроллер SDRAM. Возник вопрос как подсчитать сдвиг фазы клоков для SDRAM.На форуме альтеры прочитал что люди для DE2 ставили сдвиг -3 ns, да и в каком-то туториале я это читал. Реализовал его с помощью pll, запустил темплейт из NIOS EDS (binary counter), а он ругается при попытке запуска на желеячке:


Using cable "USB-Blaster [USB 3-1.1]", device 1, instance 0x00
Processor is already paused
Reading System ID at address 0x00004008: verified
Initializing CPU cache (if present)
OK

Downloading 00000000 ( 0%)
Downloading 00800000 ( 0%)
Downloading 008032B4 (94%)
Downloaded 13KB in 0.2s (65.0KB/s)

Verifying 00000000 ( 0%)
Verifying 00800000 ( 0%)
Verify failed between address 0x800000 and 0x802FA7
Leaving target processor paused

Я так понял что именно на внешнюю память, то есть SDRAM и ругается. А там только один может быть вариант - неправильный сдвиг по фазе между клоками контроллера и самой sdram. В хендбуке я данный раздел не осилил, поэтому очень надеюсь на вашу помощь )
vadimuzzz
чтобы сделать по уму, надо знать тайминги чипа памяти и, по возможности, платы. потом правильно обконстрейнить это дело в таймквесте, тогда сразу видно будет, куда фазу клока крутить. халявный вариант - покрутить рандомом, пока не заведется.
по таймквесту читать тут:
http://embedders.org/blog/des00
вот пример (спасибо des00, ждем обещанных статей smile.gif)
Код
#**************************************************************
# Create Clock
#**************************************************************
# Input clock constraints
create_clock -name {altera_reserved_tck} -period 10MHz [get_ports {altera_reserved_tck}]
create_clock -name {sys_clk} -period 50MHz [get_ports {sys_clk}]
# Generated clocks
derive_pll_clocks -create_base_clocks
derive_clock_uncertainty

set main_clk pll1_inst|altpll_component|auto_generated|pll1|clk[0]
set sdram_clk pll1_inst|altpll_component|auto_generated|pll1|clk[1]

create_generated_clock -name sdram_clk_pin -source $sdram_clk [get_ports {sdram_clk}]

# clock groups
set_clock_groups -exclusive -group {altera_reserved_tck}
set_clock_groups -exclusive -group [list $main_clk $sdram_clk sdram_clk_pin]
#**************************************************************
# board delays
#**************************************************************
set CLK_BD_MIN [expr 0.415 - 0.1]
set CLK_BD_MAX [expr 0.415 + 0.1]
set DATA_BD_MIN [expr 0.415 - 0.1]
set DATA_BD_MAX [expr 0.415 - 0.1]
#**************************************************************
# sdram timings
#**************************************************************
set tAC 5.5
set tOH 2.5

set tCM_Hold 1.0
set tCM_Setup 2.0

set tD_Hold 1.0
set tD_Setup 2.0

set tA_Hold 1.0
set tA_Setup 2.0
#**************************************************************
# Set Output Delay
#**************************************************************
set_output_delay -max -clock sdram_clk_pin [expr $DATA_BD_MAX + $tD_Setup - $CLK_BD_MIN] [get_ports {sdram_dq[*]}]
set_output_delay -min -clock sdram_clk_pin [expr $DATA_BD_MIN + $tD_Hold - $CLK_BD_MAX] [get_ports {sdram_dq[*]}]

set_output_delay -max -clock sdram_clk_pin [expr $DATA_BD_MAX + $tCM_Setup - $CLK_BD_MIN] [get_ports {sdram_cas_n sdram_ras_n sdram_we_n sdram_cs_n sdram_cke sdram_dqm[*]}]
set_output_delay -min -clock sdram_clk_pin [expr $DATA_BD_MIN + $tCM_Hold - $CLK_BD_MAX] [get_ports {sdram_cas_n sdram_ras_n sdram_we_n sdram_cs_n sdram_cke sdram_dqm[*]}]

set_output_delay -max -clock sdram_clk_pin [expr $DATA_BD_MAX + $tA_Setup - $CLK_BD_MIN] [get_ports {sdram_addr[*] sdram_ba[*]}]
set_output_delay -min -clock sdram_clk_pin [expr $DATA_BD_MIN + $tA_Hold - $CLK_BD_MAX] [get_ports {sdram_addr[*] sdram_ba[*]}]

#**************************************************************
# Set Input Delay
#**************************************************************
set_input_delay -max -clock sdram_clk_pin [expr $CLK_BD_MAX + $tAC + $DATA_BD_MAX] [get_ports {sdram_dq[*]}]
set_input_delay -min -clock sdram_clk_pin [expr $CLK_BD_MIN + $tOH + $DATA_BD_MIN] [get_ports {sdram_dq[*]}]

set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks $main_clk] -setup -end 2
set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks $main_clk] -hold -end 0
Evired
Посмотел входящий в пакет кита проект, там сдвиг -60 degrees. Выставил у себя, все равно не работает. У меня еще одно предположение: шина адреса у моей sdram 13 бит, а у контроллера 12. Я 13 бит шины адреса попросту не назначил, а в работающем проекте сделано так:

module DE0_TOP
(

///////////////////// SDRAM Interface ////////////////
DRAM_DQ, // SDRAM Data bus 16 Bits
DRAM_ADDR, // SDRAM Address bus 13 Bits
DRAM_LDQM, // SDRAM Low-byte Data Mask
DRAM_UDQM, // SDRAM High-byte Data Mask
DRAM_WE_N, // SDRAM Write Enable
DRAM_CAS_N, // SDRAM Column Address Strobe
DRAM_RAS_N, // SDRAM Row Address Strobe
DRAM_CS_N, // SDRAM Chip Select
DRAM_BA_0, // SDRAM Bank Address 0
DRAM_BA_1, // SDRAM Bank Address 1
DRAM_CLK, // SDRAM Clock
DRAM_CKE, // SDRAM Clock Enable

);

/////////////////////// SDRAM Interface ////////////////////////
inout [15:0] DRAM_DQ; // SDRAM Data bus 16 Bits
output [12:0] DRAM_ADDR; // SDRAM Address bus 13 Bits
output DRAM_LDQM; // SDRAM Low-byte Data Mask
output DRAM_UDQM; // SDRAM High-byte Data Mask
output DRAM_WE_N; // SDRAM Write Enable
output DRAM_CAS_N; // SDRAM Column Address Strobe
output DRAM_RAS_N; // SDRAM Row Address Strobe
output DRAM_CS_N; // SDRAM Chip Select
output DRAM_BA_0; // SDRAM Bank Address 0
output DRAM_BA_1; // SDRAM Bank Address 1
output DRAM_CLK; // SDRAM Clock
output DRAM_CKE; // SDRAM Clock Enable

//=======================================================
// Structural coding
//=======================================================

DE0_SOPC DE0_SOPC_inst(

// the_sdram
.zs_addr_from_the_sdram(DRAM_ADDR),
.zs_ba_from_the_sdram({DRAM_BA_1,DRAM_BA_0}),
.zs_cas_n_from_the_sdram(DRAM_CAS_N),
.zs_cke_from_the_sdram(DRAM_CKE),
.zs_cs_n_from_the_sdram(DRAM_CS_N),
.zs_dq_to_and_from_the_sdram(DRAM_DQ),
.zs_dqm_from_the_sdram({DRAM_UDQM,DRAM_LDQM}),
.zs_ras_n_from_the_sdram(DRAM_RAS_N),
.zs_we_n_from_the_sdram(DRAM_WE_N),

// the_tristate_bridge_avalon_slave (16-bit mode)
.address_to_the_cfi_flash({FL_ADDR, FLASH_16BIT_IP_A0}),
.data_to_and_from_the_cfi_flash(FL_DQ),
.read_n_to_the_cfi_flash(FL_OE_N),
.select_n_to_the_cfi_flash(FL_CE_N),
.write_n_to_the_cfi_flash(FL_WE_N),

);


endmodule

Так вот я не понимаю как может такое работать: .zs_addr_from_the_sdram(DRAM_ADDR) когда zs_addr_from_the_sdram 12 бит а DRAM_ADDR 13 бит?

Если я заведу на 13 бит шины адреса 0 все будет работать?
vadimuzzz
Цитата(Evired @ Oct 15 2010, 23:42) *
Так вот я не понимаю как может такое работать: .zs_addr_from_the_sdram(DRAM_ADDR) когда zs_addr_from_the_sdram 12 бит а DRAM_ADDR 13 бит?

неправильно настроили компонент в билдере?
Цитата
Если я заведу на 13 бит шины адреса 0 все будет работать?

лучше так не делать, а то будет как в фильме "тут помню, тут - не помню.."
Evired
Все, проблема решена ) Я как всегда тупанул и подключил шину данных к портам (пинам) типа out, а надо было к bidirectional ) Получилось что инфа пишется, а считаться не может) Ничего умнее чем завести на 13 бит шины адреса 0 я не придумал) Тест памяти сделал (есть в темплейтах), он показал что все нормально) ИТОГ: если у вас плата DE0 то фаза клоков sdram должна быть сдвинута на -60 градусов относительно клоков контроллера (делается сие при помощи pll). И будьте внимательнее при подключении пинов)
torik
По констрейнам для SDRAM:
Код
[quote]set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks $main_clk] -setup -end 2
set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks $main_clk] -hold -end 0[/quote]


А почему именно так?
Первое что приходит в голову, сделать
Код
set_clock_groups -exclusive    -group {sdram_clk_pin} \
                            -group [list $main_clk] \

Или false_path.

Нет, нельзя так?
vadimuzzz
Цитата(torik @ Oct 20 2010, 14:39) *
Нет, нельзя так?

почему же можно, только настоящие джедаи так не делают smile.gif иначе какой толк от таймквеста, если самые вкусные вещи не анализировать

вариант с мультициклом нужен в тех случаях, когда фазу клока крутят назад (в минус). от этого нехитрого действа у TQ рвет башню и он начинает мерять не от того фронта, что надо.
torik
О, вот еще что заметил!

Код
set_output_delay -max -clock sdram_clk_pin [expr $DATA_BD_MAX + $tD_Setup - $CLK_BD_MIN] [get_ports {sdram_dq[*]}]
set_output_delay -min -clock sdram_clk_pin [expr $DATA_BD_MIN + $tD_Hold - $CLK_BD_MAX] [get_ports {sdram_dq[*]}]

set_output_delay -max -clock sdram_clk_pin [expr $DATA_BD_MAX + $tCM_Setup - $CLK_BD_MIN] [get_ports {sdram_cas_n sdram_ras_n sdram_we_n sdram_cs_n sdram_cke sdram_dqm[*]}]
set_output_delay -min -clock sdram_clk_pin [expr $DATA_BD_MIN + $tCM_Hold - $CLK_BD_MAX] [get_ports {sdram_cas_n sdram_ras_n sdram_we_n sdram_cs_n sdram_cke sdram_dqm[*]}]

set_output_delay -max -clock sdram_clk_pin [expr $DATA_BD_MAX + $tA_Setup - $CLK_BD_MIN] [get_ports {sdram_addr[*] sdram_ba[*]}]
set_output_delay -min -clock sdram_clk_pin [expr $DATA_BD_MIN + $tA_Hold - $CLK_BD_MAX] [get_ports {sdram_addr[*] sdram_ba[*]}]


Не должно ли быть для set_output_delay -min:
Код
set_output_delay -min -clock sdram_clk_pin [expr $DATA_BD_MIN [b]-[/b] $tD_Hold - $CLK_BD_MAX] [get_ports {sdram_dq[*]}]


А? Знак ли не перепутан?


torik
всмысле, -$tD_Hold, а не +$tD_Hold
vadimuzzz
Цитата(torik @ Oct 22 2010, 17:03) *
О, вот еще что заметил!
...
А? Знак ли не перепутан?

ахз smile.gif я всегда плюсы с минусами и синусы с косинусами путаю. Если верить доке "Constraining SOPC Builder Designs with TimeQuest", то там минус. а если верить des00, то там ошибка и д.б. плюс. да, ниос с sdram там работает на 100 МГц, так что большой ошибки там быть не должно smile.gif
torik
Я пробовал и так и так, констрейны все равно выполняются. Но хотелось бы знать точно, т.к. стоило бы верить доке "Constraining SOPC Builder Designs with TimeQuest" (там -), но и des00 для нас авторитет.

Господин des00, отпишитесь пжлста smile.gif

Ой, кстати, смотрю блог des00, и наблюдаю там минус, а ни какой ни плюс для System-Synchronus Output (наш случай)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.