§ Контроллер
Шаблон контроллера памяти. Ничего не делается, только инициализация при запуске.
module sdram
(
input clock,
input reset_n,
input [21:0] a,
output reg [15:0] i,
input [15:0] o,
input w,
output reg bsy,
output sd_clk,
output sd_cs,
output sd_cke,
output reg [12:0] sd_a,
output reg [1:0] sd_ba,
inout [15:0] sd_dq,
output sd_ras,
output sd_cas,
output sd_we,
output reg sd_ldqm,
output reg sd_udqm
);
assign sd_dq = sd_we ? 16'bZ : data;
assign {sd_cs, sd_cke, sd_clk} = {2'b01, clock};
assign {sd_ras, sd_cas, sd_we } = command;
localparam cmd_loadmode = 3'b000,
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,
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),
.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),
.bsy (bsy),
.a (a),
.i (i),
.o (o),
.w (w)
);