見出し画像

A2PDP11 (9) 2KB RAM の実装

ALE のノイズ問題は、X でアドバイスをいただき、シールド線にしてみたところ解消しました。

最小限の RAM として、安直に、Shadow SRAM を使って実装します。
Address Depth は、1024 Word
Data Width は、16 Bit
とします。

Shadow SRAM

top.sv を修正します。
BS がメモリー(00)かつ、AIO が x0xx の時、メモリアクセスとなるので、RAM のアドレスを確定します。SSRAM では、メモリの出力は同時に得られるので、mem_out に出力します。

// 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

logic [15:0] dout;
logic [15:0] din;
logic [9:0] ram_ad;
logic wre;
Gowin_RAM16S ram(
    .dout(dout), //output [15:0] dout
    .wre(wre), //input wre
    .ad(ram_ad), //input [9:0] ad
    .di(din), //input [15:0] di
    .clk(clk) //input clk
);

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

always_ff@(negedge clk) begin
    if ((mbs == BS_MEM) && (!maio[2]) && (mdal < 22'o4000)) begin
        ram_ad <= mdal[10:1];
        mem_out <= dout;
    end else begin
        mem_out <= 16'bz;
    end
end

書き込み時は、AIO が 00xx となるので、SCTL がアサートされるタイミングで、RAM のライトイネーブル wre を HIGH にします。バイト書き込み時は、アドレスの LSB をみて、上位バイトと下位バイトを切り替えます。

always_ff@(negedge clk) begin
    if ((mbs == BS_MEM) && (mdal < 22'o4000) && (!maio[2]) && (!sctl_n)) begin
        wre <= 1'b1;
    end else begin
        wre <= 1'b0;
    end
end

always_ff@(negedge sctl_n) begin
    if ((mbs == BS_MEM) && (mdal < 22'o4000) && (maio[3:2] == 2'b00)) begin
        if (maio == BYTE_WRITE) begin
            if (mdal[0] == 0) begin
                din <= {dout[15:8], dal_lo[7:0]};
            end else begin
                din <= {dal_lo[15:8], dout[7:0]};
            end
        end
        if (maio == WORD_WRITE) begin
            din <= dal_lo;
        end
    end
end

PDP-11 GUI を使って、RAM のテストをしてみました。
MacBook Air M1 の Parallels 上で Windows 11 Arm を使っています。
USB シリアル CH340 のドライバは、こちらからダウンロードしました。

RAM Test

次は、PSRAM を使って、4MB フル実装してみます。

参考文献

DCJ11 Microprocessor User's Guide, 3.5 BUS READ CYCLE, 1983


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