![見出し画像](https://assets.st-note.com/production/uploads/images/139557941/rectangle_large_type_2_083967c31d51ff84d8753e69a79f990f.jpeg?width=1200)
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
参考文献
この記事が気に入ったらサポートをしてみませんか?