見出し画像

Tang Nano 9K で Apple II を再現する(5) メモリアレイ

第五章 The Memory System 前半

4116 DRAM を dram.sv として実装します。ロジックで組みたいところですが、フリップフロップが足りないので、BSRAM を使います。

`default_nettype none

module dram (
    input wire clk,
    input wire [6:0] a,
    input wire wr_n,
    input wire [7:0] din,
    input wire ras_n,
    input wire cas_n,
    output reg [7:0] dout
);

logic [13:0] ad;    // BSRAM Address
logic wre;          // BSRAM Write Enable
logic [7:0] di;     // BSRAM Input Data

Gowin_SP sram(
    .dout(dout), //output [7:0] dout
    .clk(clk), //input clk
    .oce(1'b1), //input oce
    .ce(~ras_n), //input ce
    .reset(1'b0), //input reset
    .wre(wre), //input wre
    .ad(ad), //input [13:0] ad
    .din(di) //input [7:0] din
);

always_ff@(negedge ras_n) begin
    ad[13:7] <= a;
end

always_ff@(negedge cas_n) begin
    ad[6:0] <= a;
    di <= din;
end

assign wre = cas_n | wr_n;

endmodule

`default_nettype wire

4116 DRAM 8 個を、一つの 16KB BSRAM とします。

RAS の立ち下がりで ROW アドレスを、CAS の立ち下がりで COLUMN アドレスを取り込み、14 ビットの BSRAM アドレス ad とします。
ライトイネーブル wre は、/CAS と /WR が共に 0 の時、ON とします。

4116 は内部で必要な遅延を生成しているので、クロックを必要としませんが、これを再現するのは難しいので、外部クロック clk を入れることにしました。BSRAM の読み書きは、clk に同期して行われます。

回路図 C-7 を a2_ram.sv として実装します。
三つの DRAM ブロック、dram_c、dram_d、dram_e を /ROW_x_CAS で切り替えます。

`default_nettype none

module a2_ram (
    input wire mclk,
    input wire [7:0] d,
    input wire rw,
    input wire ph1,
    input wire [5:0] ra,
    input wire row_c_ra6,
    input wire row_d_ra6,
    input wire row_e_ra6,
    input wire ras_n,
    input wire row_c_cas_n,
    input wire row_d_cas_n,
    input wire row_e_cas_n,
    output wire [7:0] dl
);

logic c14_11 = rw | ph1;
logic [7:0] do_c;
logic [7:0] do_d;
logic [7:0] do_e;

dram dram_c(
    .clk(mclk),
    .a({row_c_ra6, ra}),
    .wr_n(c14_11),
    .din(d),
    .ras_n(ras_n),
    .cas_n(row_c_cas_n),
    .dout(do_c)
);

dram dram_d(
    .clk(mclk),
    .a({row_d_ra6, ra}),
    .wr_n(c14_11),
    .din(d),
    .ras_n(ras_n),
    .cas_n(row_d_cas_n),
    .dout(do_d)
);

dram dram_e(
    .clk(mclk),
    .a({row_e_ra6, ra}),
    .wr_n(c14_11),
    .din(d),
    .ras_n(ras_n),
    .cas_n(row_e_cas_n),
    .dout(do_e)
);

// B5:74LS174
// B8:74LS174
assign dl = !row_c_cas_n ? do_c
    : !row_d_cas_n ? do_d
    : !row_e_cas_n ? do_e
    : 1'b0;

endmodule

`default_nettype wire

参考文献


この記事が気に入ったらサポートをしてみませんか?