![見出し画像](https://assets.st-note.com/production/uploads/images/152180436/rectangle_large_type_2_811115ff47c74a012402bf8c27107f7d.png?width=1200)
A2PDP11 (9) 2KB RAM の実装
ALE のノイズ問題は、X でアドバイスをいただき、シールド線にしてみたところ解消しました。
最小限の RAM として、安直に、Shadow SRAM を使って実装します。
Address Depth は、1024 Word
Data Width は、16 Bit
とします。
![](https://assets.st-note.com/img/1724760929602-7jJ5qVwGtp.png?width=1200)
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 のドライバは、こちらからダウンロードしました。
![](https://assets.st-note.com/img/1724762898832-1eHuw2iBm9.png?width=1200)
次は、PSRAM を使って、4MB フル実装してみます。
参考文献
DCJ11 Microprocessor User's Guide, 3.5 BUS READ CYCLE, 1983