Доброго времени суток!
Разрабатываю систему включающую память DDR3. Реализовывать контроллер планирую с помощью MIG (Virtex6 ISE 13.4).
Планируемая Конфигурация памяти - четыре м/с MT41J256M8 общей ёмкостью 1 GB, управляется это
дело двумя контроллерами, сгенерированными CoreGenerator. Т.е. один контроллер управляет двумя
чипами памяти у которых общая шина адреса и управляющие сигналы, младший байт шины данных
заведен на один чип, а старший на другой.
В процессе изучения example_disign столкнулся со следующим противоречием:
фрагмент ucf-файла
NET "c0_ddr3_dq[0]" LOC = "F11" ; #Bank 36
NET "c0_ddr3_dq[1]" LOC = "E10" ; #Bank 36
NET "c0_ddr3_dq[2]" LOC = "B8" ; #Bank 36
NET "c0_ddr3_dq[3]" LOC = "C8" ; #Bank 36
NET "c0_ddr3_dq[4]" LOC = "A7" ; #Bank 36
NET "c0_ddr3_dq[5]" LOC = "B7" ; #Bank 36
NET "c0_ddr3_dq[6]" LOC = "H13" ; #Bank 36
NET "c0_ddr3_dq[7]" LOC = "D8" ; #Bank 36
NET "c0_ddr3_dq[8]" LOC = "E9" ; #Bank 36
NET "c0_ddr3_dq[9]" LOC = "G11" ; #Bank 36
NET "c0_ddr3_dq[10]" LOC = "F10" ; #Bank 36
NET "c0_ddr3_dq[11]" LOC = "C10" ; #Bank 36
NET "c0_ddr3_dq[12]" LOC = "G7" ; #Bank 36
NET "c0_ddr3_dq[13]" LOC = "H10" ; #Bank 36
NET "c0_ddr3_dq[14]" LOC = "K13" ; #Bank 36
NET "c0_ddr3_dq[15]" LOC = "G8" ; #Bank 36
NET "c0_ddr3_addr[14]" LOC = "E12" ; #Bank 26
NET "c0_ddr3_addr[13]" LOC = "D11" ; #Bank 26
NET "c0_ddr3_addr[12]" LOC = "E13" ; #Bank 26
NET "c0_ddr3_addr[11]" LOC = "E14" ; #Bank 26
NET "c0_ddr3_addr[10]" LOC = "H16" ; #Bank 26
NET "c0_ddr3_addr[9]" LOC = "G16" ; #Bank 26
NET "c0_ddr3_addr[8]" LOC = "G14" ; #Bank 26
NET "c0_ddr3_addr[7]" LOC = "F14" ; #Bank 26
NET "c0_ddr3_addr[6]" LOC = "J16" ; #Bank 26
NET "c0_ddr3_addr[5]" LOC = "B11" ; #Bank 26
NET "c0_ddr3_addr[4]" LOC = "C11" ; #Bank 26
NET "c0_ddr3_addr[3]" LOC = "D13" ; #Bank 26
NET "c0_ddr3_addr[2]" LOC = "D12" ; #Bank 26
NET "c0_ddr3_addr[1]" LOC = "C14" ; #Bank 26
NET "c0_ddr3_addr[0]" LOC = "B13" ; #Bank 26
NET "c0_ddr3_ba[2]" LOC = "K15" ; #Bank 26
NET "c0_ddr3_ba[1]" LOC = "F16" ; #Bank 26
NET "c0_ddr3_ba[0]" LOC = "F15" ; #Bank 26
NET "c0_ddr3_ras_n" LOC = "G12" ; #Bank 26
NET "c0_ddr3_cas_n" LOC = "F12" ; #Bank 26
NET "c0_ddr3_we_n" LOC = "E15" ; #Bank 26
NET "c0_ddr3_reset_n" LOC = "D15" ; #Bank 26
NET "c0_ddr3_cke[0]" LOC = "A15" ; #Bank 26
NET "c0_ddr3_cke[1]" LOC = "A16" ; #Bank 26
NET "c0_ddr3_odt[0]" LOC = "A11" ; #Bank 26
NET "c0_ddr3_odt[1]" LOC = "C15" ; #Bank 26
NET "c0_ddr3_cs_n[0]" LOC = "B16" ; #Bank 26
NET "c0_ddr3_cs_n[1]" LOC = "D16" ; #Bank 26
NET "sys_clk_f0_p" LOC = "H20" ; #Bank 25
NET "sys_clk_f0_n" LOC = "G21" ; #Bank 25
NET "clk300_ref_p" LOC = "F20" ; #Bank 25
NET "clk300_ref_n" LOC = "F21" ; #Bank 25
NET "sys_rst" LOC = "K17" ; #Bank 25
NET "c0_phy_init_done" LOC = "K18" ; #Bank 25
NET "c0_error" LOC = "G17" ; #Bank 25
NET "c0_ddr3_dqs_p[0]" LOC = "A10" ; #Bank 36
NET "c0_ddr3_dqs_n[0]" LOC = "A9" ; #Bank 36
NET "c0_ddr3_dqs_p[1]" LOC = "E8" ; #Bank 36
NET "c0_ddr3_dqs_n[1]" LOC = "F9" ; #Bank 36
NET "c0_ddr3_ck_p[0]" LOC = "B14" ; #Bank 26
NET "c0_ddr3_ck_n[0]" LOC = "A14" ; #Bank 26
сигналы cs_n и odt исходя из логики ucf должны поступать на отдельно на каждый чип памяти.
Однако в generic параметрах example_top есть строчки:
C0_nCS_PER_RANK : integer := 1;
-- # of unique CS outputs per Rank for
-- phy.
C0_CS_WIDTH : integer := 1;
-- # of unique CS outputs to memory.
Поэтому порт
c0_ddr3_cs_n : out std_logic_vector((C0_CS_WIDTH*C0_nCS_PER_RANK)-1 downto 0);
и
c1_ddr3_odt : out std_logic_vector((C1_CS_WIDTH*C1_nCS_PER_RANK)-1 downto 0);
ожидаемо имеет разрядность 1.
В результате при попытке транслировать проект-пример выдаются ошибки типа такой:
ERROR:ConstraintSystem:59 - Constraint <NET "c0_ddr3_odt[1]"
LOC = "C15" ;> [example_top.ucf(143)]: NET "c0_ddr3_odt[1]" not
found.
Формально можно либо убрать "лишние" строчки из ucf-файла, либо "подправить" generic-параметры.
C DDR памятью я раньше не работал, поэтому вопрос:
как быть с линиями cs_n и odt? Вывести по одной от контроллера и распараллелить, либо
выводить по линни на каждый чип и что то менять в проекте.
Буду признателен за ваши советы и замечания.