見出し画像

A2PDP11 (6) NXM アボートの実装

NXM (Non-existent Memory、未実装メモリ) アボートを正しく生成するようにします。
Users Guide 2.6.3 節の ABORT 信号の説明によると、ABORT 端子は、DCJ11 内部または外部のどちらからもアサートできるように、オープンコレクタ出力を使いワイヤード OR 接続するとあります。ABORT 信号は内部でプルアップされています。
外部から ABORT 信号をアサートするタイミングは、メモリアクセスの延長期間(すなわち、STCL がアサートされる期間)に行います。NIO 期間にはアサートしてはいけないとのことです。

タイミンクチャートを、Users Guide 3 章に記載の図 3.5図 3.6 から書き起こしました。より詳細には、図 B-6 と B-7 に記載があります。

延長バス読み出しサイクル
バス書き込みサイクル

Tang Nano 9K との接続回路を変更します。63 ピンをオープンコレクタ出力の 74LS07 を介して、DCJ11 の ABORT 端子に接続します。74LS07 の余ったゲートを使って、AIO 信号の 5V から 3.3V の変換に使用します。
また、16 ビット双方向レベル変換モジュールの方向切り替え信号 DIR を、BUFCTL で駆動することで、DAL<0:15> の入出力を切り替えます。

Tang Nano 9K 接続回路(NXM アボート対応)

top.sv を以下のように修正しました。
ALE の立ち下がりで AIO をチェックします。AIO<3:2> が 10 (デマンド読み出し) または、00 (バス書き込み) の時、アドレス範囲か有効であるか調べます。
BS が 00 (メモリー) で、16 ビットマッピング時の最上位アドレス 157777 を超えた時、または、BS が 01 (外部 I/O) の時は、NXM をオン (1) にします。それ以外の場合は、NXM をオフ (0) に戻します。
アボート信号は、SCTL のアサートに合わせて、アサート (0) にします。

// DCJ11 TangNano interface
// TEST2 2024.07.28 Bus read, nanja.info
// TSET3 2024.08.03 Start-Up config, nanja.info
// TEST4 2024.08.07 NXM abort signal
`default_nettype none

module top ( 
    input wire [3:0] aio,
    input wire [1:0] bs,
    input wire [5:0] dal_hi,    // DAL<21:16>
    inout wire [15:0] dal_lo,   // DAL<15:0>
    input wire proc_n,
    input wire bufctl_n,
    input wire ale_n,
    input wire strb_n,
    input wire sctl_n,
    input wire map_n,
    input wire abort_n,
    input wire clk,
    output wire nxm_n
);

logic sclk;
Gowin_rPLL u_rpll(
    .clkout(sclk),  //output clkout  54MHz
    .clkin(clk)     //input clkin    18MHz
);

// AIO CODE
parameter NIO           = 4'b1111;  // internal operation only, no I/O
parameter GP_READ       = 4'b1110;  // General-Purpose read
parameter INTERRUPT_ACK = 4'b1101;  // Interrupt acknowledge, vector read
parameter REQEST_READ   = 4'b1100;  // Instruction-stream request read
parameter RMW_NOLOCK    = 4'b1011;  // Read/Modify/Write - no bus lock
parameter RMW_BUSLOCK   = 4'b1010;  // Read/Modify/Write - bus lock
parameter DATA_READ     = 4'b1001;  // Data-stream read
parameter DEMAND_READ   = 4'b1000;  // Instruction-stream demand read
parameter GP_WRITE      = 4'b0101;  // General-Purpose word write
parameter BYTE_WRITE    = 4'b0011;  // Bus byte write
parameter WORD_WRITE    = 4'b0001;  // Bus word write

// BANK SELECT
parameter BS_MEM        = 2'b00;    // Memory
parameter BS_SYS        = 2'b01;    // System register
parameter BS_EXT        = 2'b10;    // Extarnal I/O
parameter BS_INT        = 2'b11;    // Internal register

// GP CODE
parameter POWER_UP0     = 8'o000;   // Reads the power-up mode
parameter POWER_UP2     = 8'o002;   // Reads the power-up mode, clears the FPA’s FPS

logic [7:0] gp_code;
always_ff@(negedge ale_n) begin
    if ((aio == GP_READ) || (aio == GP_WRITE)) begin
        gp_code <= dal_lo[7:0];
    end else begin
        gp_code <= 8'b11111111;
    end
end

logic [15:0] dal_out;
assign dal_lo = bufctl_n ? 16'bz: dal_out;

always_ff@(negedge bufctl_n) begin
    if ((gp_code == POWER_UP0) || (gp_code == POWER_UP2)) begin
        dal_out <= 16'b1000001_0_0000_0_11_1;
                // BOOT_ADDRESS, FPE, UNUSED, HALT, MODE, POK
    end else begin
        dal_out <= 0;
    end
end

logic nxm;
assign nxm_n = sctl_n ? 1'b1 : ~nxm;
always_ff@(negedge ale_n) begin
    if ((aio[3:2] == 2'b10) || (aio[3:2] == 2'b00)) begin
        // RMW_BUSLOCK, RMW_NOLOCK, DATA_READ, DEMAND_READ, WORD_WRITE, BYTE_WRITE
        if (bs == BS_MEM) begin
            if (dal_lo > 16'o157777) begin
                nxm <= 1'b1;
            end
        end
        if (bs == BS_EXT) begin
            nxm <= 1'b1;
        end
    end else begin
        nxm <= 1'b0;
    end
end

endmodule

`default_nettype wire

INIT 時の動作を確認します。
下図、赤マーカー部でアドレス  17777700 の外部 I/O 読み出しが行われます。オレンジマーカ部で NXM がアサートされ、少し遅れて ABORT がアサートされます。その結果、白マーカー部で GP CODE 224 (マイクロ診断テスト 2 成功) が生成されるようになりました。 

NXM アボート動作

参考文献

DCJ11 Microprocessor User's Guide, 2.6.3 Abort, 1983


いいなと思ったら応援しよう!