§ Контроллер
Шаблон контроллера памяти. Ничего не делается, только инициализация при запуске.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) );
27 июл 2025, 20:52
© 2011-2025 Дурил фиговый компьютер