見出し画像

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)の間、システムデータバスに出力します。

参考文献


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