Te he respondido aqui -->
viewtopic.php?f=20&p=648#p648
A lo que comento ahí, añado, que un módulo de SDRAM es "1" fichero, punto pelota, pero uno de DDR son como unos 12 enlazados, aunque con paciencia, los puedes dejar en unos 5 nada mas.
Acabo de mirar los proyectos que hice para intentar usar LPDDR2 , y en el mas sencillo que tengo, salen unas ¡¡¡ 15mil líneas de código !!!
En una DDR se necesita un calibrado previo antes de usarla, y luego, trabaja de una forma bastante rara, que es en forma de bancos individuales, es como si tuvieras 20 cajones de datos, y tuvieses que acceder a cada cajón secuencialmente para coger de cada uno un bit suelto. En una SDRAM es sería el selector de bancos, que son dos nada mas, el alto y el bajo, pero en una DDR hay docenas de bancos para seleccionar.
Sé que no ayuda mucho explicar cosas sin profundizar, pero no soy capaz de dar una respuesta completa. Estuve varios meses tratando de usar la DDR a modo SDRAM, y no fui capaz. Tenía varios ejemplos en la mano, pero adaptarlos a mis necesidades no fui capaz.
fpganoob escribió: ↑17 Oct 2018, 16:15
De esa manera podria substituir directamente los pines de SDRAM de los cores y conectarlos al controlador LPDRR2.
Si lo consigues, pasas de nivel novato a nivel dios en un plis plas. Yo, como ya digo, MESES estuve tratando de hacerlo. Estuve incluso en foros de gente que tenía la misma inquietud, y nadie daba con una respuesta clara. Encontré un foro donde un señor lograba usar la DDR a modo SDRAM, pero no decía como, no daba la solución, y me quedé con las ganas.
ejemplo de cabecera de parámetros LPDDR y de líneas de entrada salida:
Código: Seleccionar todo
parameter C_MEMCLK_PERIOD = 2500,
parameter C_P0_MASK_SIZE = 4,
parameter C_P0_DATA_PORT_SIZE = 32,
parameter C_P1_MASK_SIZE = 4,
parameter C_P1_DATA_PORT_SIZE = 32,
parameter C_PORT_ENABLE = 6'b111111,
parameter C_PORT_CONFIG = "B128",
parameter C_MEM_ADDR_ORDER = "BANK_ROW_COLUMN",
// The following parameter reflects the GUI selection of the Arbitration algorithm.
// Zero value corresponds to round robin algorithm and one to custom selection.
// The parameter is used to calculate the arbitration time slot parameters.
parameter C_ARB_ALGORITHM = 0,
parameter C_ARB_NUM_TIME_SLOTS = 12,
parameter C_ARB_TIME_SLOT_0 = 18'o012345,
parameter C_ARB_TIME_SLOT_1 = 18'o123450,
parameter C_ARB_TIME_SLOT_2 = 18'o234501,
parameter C_ARB_TIME_SLOT_3 = 18'o345012,
parameter C_ARB_TIME_SLOT_4 = 18'o450123,
parameter C_ARB_TIME_SLOT_5 = 18'o501234,
parameter C_ARB_TIME_SLOT_6 = 18'o012345,
parameter C_ARB_TIME_SLOT_7 = 18'o123450,
parameter C_ARB_TIME_SLOT_8 = 18'o234501,
parameter C_ARB_TIME_SLOT_9 = 18'o345012,
parameter C_ARB_TIME_SLOT_10 = 18'o450123,
parameter C_ARB_TIME_SLOT_11 = 18'o501234,
parameter C_MEM_TRAS = 45000,
parameter C_MEM_TRCD = 12500,
parameter C_MEM_TREFI = 7800,
parameter C_MEM_TRFC = 127500,
parameter C_MEM_TRP = 12500,
parameter C_MEM_TWR = 15000,
parameter C_MEM_TRTP = 7500,
parameter C_MEM_TWTR = 7500,
parameter C_NUM_DQ_PINS = 8,
parameter C_MEM_TYPE = "DDR3",
parameter C_MEM_DENSITY = "512M",
parameter C_MEM_BURST_LEN = 8,
parameter C_MEM_CAS_LATENCY = 4,
parameter C_MEM_ADDR_WIDTH = 13,
parameter C_MEM_BANKADDR_WIDTH = 3,
parameter C_MEM_NUM_COL_BITS = 11,
parameter C_MEM_DDR3_CAS_LATENCY = 7,
parameter C_MEM_MOBILE_PA_SR = "FULL",
parameter C_MEM_DDR1_2_ODS = "FULL",
parameter C_MEM_DDR3_ODS = "DIV6",
parameter C_MEM_DDR2_RTT = "50OHMS",
parameter C_MEM_DDR3_RTT = "DIV2",
parameter C_MEM_MDDR_ODS = "FULL",
parameter C_MEM_DDR2_DIFF_DQS_EN = "YES",
parameter C_MEM_DDR2_3_PA_SR = "OFF",
parameter C_MEM_DDR3_CAS_WR_LATENCY = 5,
parameter C_MEM_DDR3_AUTO_SR = "ENABLED",
parameter C_MEM_DDR2_3_HIGH_TEMP_SR = "NORMAL",
parameter C_MEM_DDR3_DYN_WRT_ODT = "OFF",
parameter C_MC_CALIB_BYPASS = "NO",
parameter LDQSP_TAP_DELAY_VAL = 0,
parameter UDQSP_TAP_DELAY_VAL = 0,
parameter LDQSN_TAP_DELAY_VAL = 0,
parameter UDQSN_TAP_DELAY_VAL = 0,
parameter DQ0_TAP_DELAY_VAL = 0,
parameter DQ1_TAP_DELAY_VAL = 0,
parameter DQ2_TAP_DELAY_VAL = 0,
parameter DQ3_TAP_DELAY_VAL = 0,
parameter DQ4_TAP_DELAY_VAL = 0,
parameter DQ5_TAP_DELAY_VAL = 0,
parameter DQ6_TAP_DELAY_VAL = 0,
parameter DQ7_TAP_DELAY_VAL = 0,
parameter DQ8_TAP_DELAY_VAL = 0,
parameter DQ9_TAP_DELAY_VAL = 0,
parameter DQ10_TAP_DELAY_VAL = 0,
parameter DQ11_TAP_DELAY_VAL = 0,
parameter DQ12_TAP_DELAY_VAL = 0,
parameter DQ13_TAP_DELAY_VAL = 0,
parameter DQ14_TAP_DELAY_VAL = 0,
parameter DQ15_TAP_DELAY_VAL = 0,
parameter C_CALIB_SOFT_IP = "TRUE",
parameter C_SIMULATION = "FALSE",
parameter C_SKIP_IN_TERM_CAL = 1'b0,
parameter C_SKIP_DYNAMIC_CAL = 1'b0,
parameter C_MC_CALIBRATION_MODE = "CALIBRATION",
parameter C_MC_CALIBRATION_DELAY = "HALF"
)
(
// Raw Wrapper Signals
input sysclk_2x,
input sysclk_2x_180,
input pll_ce_0,
input pll_ce_90,
input pll_lock,
input async_rst,
input mcb_drp_clk,
output [C_MEM_ADDR_WIDTH-1:0] mcbx_dram_addr,
output [C_MEM_BANKADDR_WIDTH-1:0] mcbx_dram_ba,
output mcbx_dram_ras_n,
output mcbx_dram_cas_n,
output mcbx_dram_we_n,
output mcbx_dram_cke,
output mcbx_dram_clk,
output mcbx_dram_clk_n,
inout [C_NUM_DQ_PINS-1:0] mcbx_dram_dq,
inout mcbx_dram_dqs,
inout mcbx_dram_dqs_n,
inout mcbx_dram_udqs,
inout mcbx_dram_udqs_n,
output mcbx_dram_udm,
output mcbx_dram_ldm,
output mcbx_dram_odt,
output mcbx_dram_ddr3_rst,
inout mcbx_rzq,
inout mcbx_zio,
output calib_done,
input selfrefresh_enter,
output selfrefresh_mode,
y aquí un módulo de llamada a LPDDR, como ves, tiene un montón de valores de entrada (una SDRAM tiene solo 10 valores de entrada, pero la DDR ya lo ves, como unos 50, eso, en este ejemplo reducido)
Código: Seleccionar todo
module lpddr #
(
parameter C3_P0_MASK_SIZE = 8,
parameter C3_P0_DATA_PORT_SIZE = 64,
parameter C3_P1_MASK_SIZE = 8,
parameter C3_P1_DATA_PORT_SIZE = 64,
parameter DEBUG_EN = 0,
parameter C3_MEMCLK_PERIOD = 5000,
parameter C3_CALIB_SOFT_IP = "TRUE",
parameter C3_SIMULATION = "FALSE",
parameter C3_RST_ACT_LOW = 0,
parameter C3_INPUT_CLK_TYPE = "SINGLE_ENDED",
parameter C3_MEM_ADDR_ORDER = "ROW_BANK_COLUMN",
parameter C3_NUM_DQ_PINS = 16,
parameter C3_MEM_ADDR_WIDTH = 13,
parameter C3_MEM_BANKADDR_WIDTH = 2
)
(
input sys_clk,
input sys_rst,
output c3_calib_done,
output clock,
output reset,
inout [C3_NUM_DQ_PINS-1:0] mcb3_dram_dq,
output [C3_MEM_ADDR_WIDTH-1:0] mcb3_dram_a,
output [C3_MEM_BANKADDR_WIDTH-1:0] mcb3_dram_ba,
output mcb3_dram_cke,
output mcb3_dram_ras_n,
output mcb3_dram_cas_n,
output mcb3_dram_we_n,
output mcb3_dram_dm,
inout mcb3_dram_udqs,
inout mcb3_rzq,
output mcb3_dram_udm,
inout mcb3_dram_dqs,
output mcb3_dram_ck,
output mcb3_dram_ck_n,
input c3_p0_cmd_clk,
input c3_p0_cmd_en,
input [2:0] c3_p0_cmd_instr,
input [5:0] c3_p0_cmd_bl,
input [29:0] c3_p0_cmd_byte_addr,
output c3_p0_cmd_empty,
output c3_p0_cmd_full,
input c3_p0_wr_clk,
input c3_p0_wr_en,
input [C3_P0_MASK_SIZE - 1:0] c3_p0_wr_mask,
input [C3_P0_DATA_PORT_SIZE - 1:0] c3_p0_wr_data,
output c3_p0_wr_full,
output c3_p0_wr_empty,
output [6:0] c3_p0_wr_count,
output c3_p0_wr_underrun,
output c3_p0_wr_error,
input c3_p0_rd_clk,
input c3_p0_rd_en,
output [C3_P0_DATA_PORT_SIZE - 1:0] c3_p0_rd_data,
output c3_p0_rd_full,
output c3_p0_rd_empty,
output [6:0] c3_p0_rd_count,
output c3_p0_rd_overflow,
output c3_p0_rd_error
);
Dejo adjunto uno de los ejemplos. Es el que genera el Xilinx al crear un módulo de control MIG para DDR, y lo único que hace es montón de líneas, es encender la DDR, calibrarla y si todo es correcto, encender un LED.
S
i quieres ejemplos funcionando con DDR, mira la placa Pipistrello, que ademas de DDR usa HDMI:
http://saanlima.com/forum/viewtopic.php?f=12&t=1234