|
|
  |
DE0 + sdram |
|
|
|
Oct 15 2010, 12:45
|
Участник

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

|
Пытаюсь задействовать 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. В хендбуке я данный раздел не осилил, поэтому очень надеюсь на вашу помощь )
Сообщение отредактировал Evired - Oct 15 2010, 12:47
|
|
|
|
|
Oct 15 2010, 13:06
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
чтобы сделать по уму, надо знать тайминги чипа памяти и, по возможности, платы. потом правильно обконстрейнить это дело в таймквесте, тогда сразу видно будет, куда фазу клока крутить. халявный вариант - покрутить рандомом, пока не заведется. по таймквесту читать тут: http://embedders.org/blog/des00вот пример (спасибо des00, ждем обещанных статей  ) Код #************************************************************** # 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
|
|
|
|
|
Oct 15 2010, 16:42
|
Участник

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

|
Посмотел входящий в пакет кита проект, там сдвиг -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 все будет работать?
|
|
|
|
|
Oct 15 2010, 22:42
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

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

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

|
Все, проблема решена ) Я как всегда тупанул и подключил шину данных к портам (пинам) типа out, а надо было к bidirectional ) Получилось что инфа пишется, а считаться не может) Ничего умнее чем завести на 13 бит шины адреса 0 я не придумал) Тест памяти сделал (есть в темплейтах), он показал что все нормально) ИТОГ: если у вас плата DE0 то фаза клоков sdram должна быть сдвинута на -60 градусов относительно клоков контроллера (делается сие при помощи pll). И будьте внимательнее при подключении пинов)
Сообщение отредактировал Evired - Oct 16 2010, 08:37
|
|
|
|
|
Oct 20 2010, 07:39
|

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

|
По констрейнам для 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. Нет, нельзя так?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Oct 22 2010, 10:03
|

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

|
О, вот еще что заметил! Код 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[*]}] А? Знак ли не перепутан?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|