§ Контроллер

Шаблон контроллера памяти. Ничего не делается, только инициализация при запуске.
module sdram
(
    input               clock,              // 25 mhz
    input               reset_n,            // Сброс от PLL

    // Обмен данными с SDRAM
    input       [21:0]  a,                  // Запрошенный адрес в памяти (4 Мб)
    output reg  [15:0]  i,                  // Данные из SDRAM к процессору
    input       [15:0]  o,                  // Данные на запись от процессора
    input               w,                  // Сигнал на запись от процессора
    output  reg         bsy,                // BSY=1, устройство занято

    // Физический интерфейс работы с памятью
    output              sd_clk,             // Clock
    output              sd_cs,              // Chip Select (n)
    output              sd_cke,             // Clock Enabled
    output  reg [12:0]  sd_a,               // Address
    output  reg [1:0]   sd_ba,              // Bank
    inout       [15:0]  sd_dq,              // Data
    output              sd_ras,             // Row Select
    output              sd_cas,             // Column Select
    output              sd_we,              // Write Enabled (n)
    output  reg         sd_ldqm,            // Low  Data Mask
    output  reg         sd_udqm             // High Data Mask
);

// =============================================================================
// WE=1, принимаем данные ОТ чипа памяти, WE=0 пишем в чип DATA
assign sd_dq = sd_we ? 16'bZ : data;

// CS=0 Чип выбран; CKE=1 Такты включены; CLOCK на выходе
assign {sd_cs,  sd_cke, sd_clk} = {2'b01, clock};
assign {sd_ras, sd_cas, sd_we } = command;

// Command modes                 RCW
localparam  cmd_loadmode     = 3'b000,  // Загрузка MODE регистра
            cmd_refresh      = 3'b001,  // Обновление страницы
            cmd_precharge    = 3'b010,  // Перезарядка строки
            cmd_activate     = 3'b011,  // Активация строки
            cmd_write        = 3'b100,  // Запись в память
            cmd_read         = 3'b101,  // Чтение
            cmd_burst_term   = 3'b110,  // Завершение чтения или записи
            cmd_nop          = 3'b111;  // Нет операции

// Стадия исполнения
localparam
    INIT        = 0,        // Инициализация SDRAM
    AWAIT       = 1,        // Ждать команд на чтение и запись
    WRITE       = 2,        // Писать в память
    READ        = 3,        // Читать из памяти
    REFRESH     = 4,        // Автоматическое обновление
    INIT_WAIT   = 1250;

// =============================================================================
reg [ 2:0]  t, n, command;
reg [15:0]  data;
reg [10:0]  init;
// =============================================================================

// Прием данных от процессора ОБЯЗАТЕЛЬНО на негативном фронте
always @(negedge clock)
if (reset_n == 1'b0) begin
`ifdef ICARUS
    t       <= AWAIT;
`else
    t       <= INIT;
`endif
    bsy     <= 1;
    init    <= 0;
    sd_a    <= 0;
    sd_ldqm <= 0;
    sd_udqm <= 0;
    command <= cmd_nop;
end
else case (t)

    // Стадия инициализация чипа памяти
    INIT: begin

        case (init)
        INIT_WAIT+1:    begin command <= cmd_precharge; end
        INIT_WAIT+4:    begin command <= cmd_refresh;   end
        INIT_WAIT+18:   begin command <= cmd_loadmode;  sd_a <= 10'b0_00_010_0_111; sd_ba <= 2'b00; end
        INIT_WAIT+21:   begin t <= AWAIT; end
        default:        begin command <= cmd_nop; end
        endcase

        init <= init + 1;

    end

    // Ожидание запросов к памяти
    AWAIT: begin

        bsy     <= 0;
        command <= cmd_nop;
        {sd_udqm, sd_ldqm} <= 2'b11;

    end

    // Чтение данных из памяти
    READ: begin end

    // Запись данных в память
    WRITE: begin end

    // Обновить очередную строку
    REFRESH: begin end

endcase

endmodule

§ TOP-модуль

wire        bsy;
wire [22:0] a;
wire [15:0] i, o;
wire        w;

sdram SR
(
    .clock      (clock_25),
    .reset_n    (reset_n),
    // --- SDRAM
    .sd_clk     (DRAM_CLK),
    .sd_cs      (DRAM_CS),
    .sd_cke     (DRAM_CKE),
    .sd_a       (DRAM_A),
    .sd_ba      (DRAM_B),
    .sd_dq      (DRAM_DQ),
    .sd_ras     (DRAM_RAS),
    .sd_cas     (DRAM_CAS),
    .sd_we      (DRAM_W),
    .sd_ldqm    (DRAM_L),
    .sd_udqm    (DRAM_U),
    // --- CPU
    .bsy        (bsy),
    .a          (a),
    .i          (i),
    .o          (o),
    .w          (w)
);