SP605 Spartan 6 адресация DDR3
Следующий пост довольно длинный, но поскольку у меня были проблемы с тем, чтобы плата SP605 должным образом взаимодействовала с DDR3 уже более месяца, надеюсь, это будет полезно для других в той же ситуации, в которой я нахожусь. Я вполне уверен, что это простая конфигурация или концептуальная ошибка, но я был бы более чем рад, что это скоро решится.
=== СЦЕНАРИЙ ===
Я создал интерфейс USB-UART для связи с FPGA и управления DDR3. Используя генератор IP в ISE, я создал оболочку MIG, а затем разработал контроллер интерфейса памяти. Тем не менее, я ссылаюсь на руководства ug388 и ug416, но мне не удалось заставить DDR3 вести себя так, как ожидалось.
=== ПОСТАНОВКА ЗАДАЧИ ===
Играя с длинами пакета для команд записи и чтения, я могу получить данные от DDR3, но схема адресации, кажется, не верна, так как данные дублируются в адресах 0 и 1, 2 и 3, 4 и 5., и так далее. Кроме того, всякий раз, когда я пишу в адрес 0, например, ничего не меняется. Затем, когда я пишу в адрес 1, оба адреса 0 и 1 обновляются с использованием значения данных, которое я только что отправил. Кажется, из-за этого связанного эффекта я "теряю" половину пространства памяти.
=== DDR3 IP КОНФИГУРАЦИЯ ===
Настройка для DDR3 с использованием генератора IP - с учетом сценария платы SP605 - приведена ниже. В итоге я активировал DDR3 Bank 3 и настроил Port0 как 32-битный двунаправленный.
Выбор памяти:
Включить интерфейс AXI: не отмечено
Использовать расширенный диапазон производительности MCB: не проверено
Тип памяти для банка 3: DDR3 SDRAM
Тип памяти для банка 1: нет
Варианты для C3 - DDR3 SDRAM
Частота: 400 МГц
Часть памяти: MTJ41J64M16XX-187E
Варианты памяти для C3 - DDR3 SDRAM
Контроль полного сопротивления выходного драйвера: RZQ / 6
RTT (номинал) - ODT: RZQ/4
Автообновление: включено
Конфигурация порта для C3 - DDR3 SDRAM
Два 32-разрядных двунаправленных и четыре 32-разрядных однонаправленных порта
Port0: проверено
Порт 1: не проверено
Порт 2: не проверено
Порт 3: не проверено
Порт 4: не проверено
Port5: не проверено
Выбор отображения адресов памяти: строка-банк-столбец
Варианты ПЛИС для C3 - DDR3 SDRAM
Окончание контакта интерфейса памяти: калиброванное входное окончание
Выберите расположение контактов RZQ: R7
Выберите расположение контактов ZIO: W4
Сигналы отладки для контроллера памяти: отключить
Системные часы: дифференциальные
=== СТРУКТУРА ДАННЫХ ===
От Matlab я посылаю 64-битную команду, которая должна записать или прочитать DDR3 на основе адреса и данных, предоставленных в этой команде.
wire [00:00] cmd_instruction = usb_data[63:63]; // ‘0’ = write; ‘1’ = read
wire [27:00] cmd_address = usb_data[62:37]; // 26-bit address
wire [31:00] cmd_data = usb_data[31:00]; // 32-bit data
В ug388 можно извлечь следующее:
Страница 20: Адрес имеет ширину 26 бит.
C_MEM_ADDR_WIDTH = 13
C_MEM_BANKADDR_WIDTH = 3
C_MEM_NUM_COL_BITS = 10
C_P0_DATA_PORT_SIZE = 32 // 32-bit data ports
C_P0_MASK_SIZE = 4 // 4 bytes = 32 bits (1 mask bit = 1 entire data byte)
Стр. 26-27: Структура данных команд.
pX_cmd_addr [29: 0]: 30-битный адрес, однако последние два бита должны = "00", поскольку каждое слово (32 бита) состоит из 4 байтов.
pX_cmd_bl [5: 0]: длина пакета в 1 получается путем установки этого сигнала в 0.
pX_cmd_instr [2: 0]: используются только команды команды write=”000” и read=”001”.
Страница 28: Написать структуру данных.
- pX_wr_mask [PX_MASKSIZE-1: 0]: для 4-битной маски установлено значение "0000", поэтому все 4 байта всегда записываются в память.
=== НАЗНАЧЕНИЯ СИГНАЛА ===
Используя всю эту информацию, я назначил свои сигналы следующим образом:
assign p0_mcb_cmd_instr = {2'b00, cmd_instruction};
assign p0_mcb_cmd_addr = {2’d0, cmd_address, 2'd0};
assign p0_mcb_cmd_bl = 6'd0;
assign p0_mcb_wr_data = cmd_data;
assign p0_mcb_wr_mask = 4'd0;
localparam C3_MEM_BURST_LEN = 8;
=== ВЫВОДЫ ===
На основании конфигурации кто-нибудь знает, каким должно быть ожидаемое поведение моего контроллера? Если какая-либо дополнительная информация необходима для разъяснения, пожалуйста, дайте мне знать.
Большое спасибо, Бруно.