Tang Nano 9K で Apple II を再現する(7)6502
第六章 The 6502 and System Bus
6502 マイクロプロセッサの FPGA での実装はいくつかありますが、Verilog 6502 を使わせてもらうことにしました。
トランジスタレベルでの解析結果をもとに、半自動で Velrilog のコードに置き換えたとのことです。
回路図 C-9 を microprocessor.sv として実装します。
`default_nettype none
module microprocessor (
output wire [15:0] ad, // System Address Bus
output wire rw, // System Bus
inout wire [7:0] d_rom, // From ROM
input wire [7:0] d_io, // From Peripheral I/O
output wire [7:0] d, // System Data Bus
input wire dma_n,
input wire ph0,
input wire irq_n,
input wire nmi_n,
input wire rdy,
input wire reset_n,
input wire clk // FPGA clock
);
chip_6502 mpu_inst(
.clk(clk), // FPGA clock
.phi(ph0_6502),
.res(reset_6502_n),
.so(so_6502),
.rdy(rdy_6502),
.nmi(nmi_6502_n),
.irq(irq_6502_n),
.sync(sync_6502),
.dbi(di_6502),
.dbo(do_6502),
.rw(rw_6502),
.ab(a_6502)
);
logic ph0_6502;
logic reset_6502_n;
logic so_6502;
logic rdy_6502;
logic nmi_6502_n;
logic irq_6502_n;
logic [7:0] di_6502;
logic [7:0] do_6502;
logic rw_6502;
logic [15:0] a_6502;
logic sync_6502;
logic ph1_6502;
logic ph2_6502;
logic ph1;
assign reset_6502_n = reset_n;
assign irq_6502_n = irq_n;
assign nmi_6502_n = nmi_n;
assign rdy_6502 = rdy;
assign so_6502 = 1'b0;
always_ff@(posedge clk) begin
ph1 <= ~ph0_6502;
ph1_6502 <= ph1;
ph2_6502 <= ~ph1;
end
// B11:74LS08
logic b11_3;
assign b11_3 = dma_n & ph0;
assign ph0_6502 = b11_3;
// 8T97
assign ad = dma_n ? a_6502 : 16'b0;
assign rw = dma_n ? rw_6502 : 1'b1;
// C14:74LS32
logic c14_8;
assign c14_8 = ph1_6502 | rw;
// H10 8304
assign di_6502 = c14_8 ? (d_rom | d_io) : 8'bz;
assign d = c14_8 ? 8'bz : do_6502;
endmodule
`default_nettype wire
/DMA が LOW のときアドレスバスを CPU から切り離します。
ROM と I/O からのデータを合成し 6502 データポート di_6502 に入力します。
6502 出力データ do_6502 を、φ2 期間(ph1_6502 が LOW)の間、システムデータバスに出力します。