Make/Day

毎日なにか作ります

30日目 ~ram~

こんにちは!今日はデジタル回路の話題で更新します!

今回は順序回路から、RAM(Random Access Memory)の実装をしていきます。(読み込み専用のRead Only Memolyはまた次回)
参考書籍である、nand2tetrisの本では実装したレジスタブロックから積み重ねてメモリを構築していますが、折角verilogを使っているので、配列の形で簡単に実装してしまいます。

まず、入力としては、入力データのin,アドレス指定のaddress、クロックとロード信号が考えられます。そして、出力側は16bitのout一つとなります。
次に、メモリの容量を設定します......といっても、ここは書籍の最大値である16KBに従おうと思います。
16bitCPUなので、信号線の太さは2Byteとなります。
従って、16KB=2(Byte) * 2^13レジスタ配列を作ります。
後はこのメモリをoutに繋げて、値更新をクロック毎にloadで見張れば完成です。

よって、以下のようなverilogコードになります。

module RAM16K(
    input [15:0] in,
    input        clk, load,
    input [13:0] address,
    output[15:0] out
);
  // 16bit=2byte × 2^13行の配列でレジスタ確保
  reg[15:0] ram[2**13-1:0];
  assign out = ram[address];
	
  always @(posedge clock) begin
    if (load) begin
        ram[address] = in;
    end
  end
endmodule

着実にCPUというゴールまで近づいてきている気がします*1ワクワク
次回の更新もお楽しみに❕

参考書籍

*1:o(´∀`)o