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 に直接圧電スピーカーをつなぎました。
リターンキー入力時の信号は以下のようになります。
参考文献
この記事が気に入ったらサポートをしてみませんか?