見出し画像

Tang Nano 9K で Apple II を再現する(10)内蔵入出力

第六章 The 6502 and System Bus

回路図 C-12 と C-13 を onboard_io.sv として実装します。

`default_nettype none

module on_board_io (
    input wire [15:0] ad,
    input wire ph0,
    input wire h12_15,
    output wire text_mode,
    output wire mix_mode,
    output wire page2,
    output wire hires_mode,
    output wire [3:0] an,
    input wire [2:0] sw,
    input wire [3:0] pdl,
    output wire d7,
    output wire kbd_n,
    output wire speaker,
    output wire data_out,
    input wire data_in,
    input wire [7:0] dl,
    output wire [7:0] d,
    input wire [7:1] b,
    input wire strobe,
    input wire reset_btn_n,
    output wire reset_n,
    input wire ramsel_n,
    input wire mclk
);

logic clr_stb_n;

// F14:74LS259
logic [7:0] f14_z;
logic f14_e_n;

always_ff@(negedge f14_e_n) begin
    f14_z[{ad[3], ad[2], ad[1]}] <= ad[0];
end

assign f14_e_n = f13_z[5];
assign text_mode = f14_z[0];
assign mix_mode = f14_z[1];
assign page2 = f14_z[2];
assign hires_mode = f14_z[3];
assign an = f14_z[7:4];

// F13:74LS138
logic [7:0] f13_z;

assign f13_z[0] = (ph0 & !h12_15) ? (ad[4] | ad[5] | ad[6]) : 1'b1;
assign f13_z[1] = (ph0 & !h12_15) ? (!ad[4] | ad[5] | ad[6]) : 1'b1;
assign f13_z[2] = (ph0 & !h12_15) ? (ad[4] | !ad[5] | ad[6]) : 1'b1;
assign f13_z[3] = (ph0 & !h12_15) ? (!ad[4] | !ad[5] | ad[6]) : 1'b1;
assign f13_z[4] = (ph0 & !h12_15) ? (ad[4] | ad[5] | !ad[6]) : 1'b1;
assign f13_z[5] = (ph0 & !h12_15) ? (!ad[4] | ad[5] | !ad[6]) : 1'b1;
assign f13_z[6] = (ph0 & !h12_15) ? (ad[4] | !ad[5] | !ad[6]) : 1'b1;
assign f13_z[7] = (ph0 & !h12_15) ? (!ad[4] | !ad[5] | !ad[6]) : 1'b1;

assign clr_stb_n = f13_z[1];
assign kbd_n = f13_z[0];

// H14:74LS251
logic h14_y;
logic [7:0] h14_d;
assign h14_d[0] = data_in;
assign h14_d[1] = sw[0];
assign h14_d[2] = sw[1];
assign h14_d[3] = sw[2];
assign h14_d[4] = pdl[0];
assign h14_d[5] = pdl[1];
assign h14_d[6] = pdl[2];
assign h14_d[7] = pdl[3];
assign h14_y = f13_z[6] ? 1'bz : h14_d[{ad[2], ad[1], ad[0]}];
assign d7 = h14_y;

// J13:74LS74
logic j13_d1;
logic j13_q1;
logic j13_q1_n;

always_ff@(posedge f13_z[2]) begin
    j13_d1 <= j13_q1_n;
    j13_q1_n <= ~j13_d1;
end
assign data_out = j13_q1_n;

// J13:74LS74
logic j13_d0;
logic j13_q0;
logic j13_q0_n;

always_ff@(posedge f13_z[3]) begin
    j13_q0 <= j13_d0;
    j13_q0_n <= ~j13_d0;
    j13_d0 <= j13_q0_n;
end
assign speaker = j13_q0;

// B10:74LS74
logic b10_q;

always_ff@(posedge strobe or negedge clr_stb_n) begin
    if (!clr_stb_n) begin
        b10_q = 1'b0;
    end else begin
        b10_q = 1'b1;
    end
end

logic kbd0;
always_ff@(posedge mclk) begin
    kbd0 <= kbd_n;
end

// B6: 74LS257
// B7: 74LS257
assign d = ramsel_n ? 8'bz
    : kbd0 ? dl 
    : {b10_q, b};

assign reset_n = reset_btn_n;

endmodule

`default_nettype wire

キーボードは Arduino でシリアルパラレル変換器を作り、5V パラレル出力を SN74LVC245AN で 3.3V に変換して Tang Nano 9K につなぎました。

スピーカー出力は、Tang Nano 9K に直接圧電スピーカーをつなぎました。

リターンキー入力時の信号は以下のようになります。

6502 read from keyboard.

参考文献


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