[Verilog] Single Port RAM vs Dual Port RAM

약 3분 소요

개요

포트란 무엇인가

  1. RAM의 포트는 메모리에 접근하기 위한 입출력 통로를 의미
  2. 하나의 포트는 주소 버스(Addr), 데이터 버스(Data), 제어 신호(We) 등을 의미

=> 포트가 몇 개냐에 따라 같은 클럭 사이클에 메모리에 접근할 수 있는 주체의 수가 결정됨

Single Port RAM

개요 및 특징

  • 포트가 1개인 RAM을 의미
  • 읽기 또는 쓰기 중 하나만 가능
  • 구조가 단순해 면적이 작음
  • 일반적인 버퍼, 캐시 라인 등에 사용됨

구현

`timescale 1ns / 1ps

module single_port_ram #(
    parameter DATA_WIDTH = 8,
    parameter ADDR_WIDTH = 8
) (
    input                       clk,
    input                       we,
    input      [ADDR_WIDTH-1:0] addr,
    input      [DATA_WIDTH-1:0] wdata,
    output reg [DATA_WIDTH-1:0] rdata
);
    reg [DATA_WIDTH-1:0] mem[0:(1<<ADDR_WIDTH)-1];

    always @(posedge clk) begin
        if (we) begin
            mem[addr] <= wdata;
        end else begin
            rdata <= mem[addr];
        end
    end
endmodule

Dual Port RAM

개요 및 특징

  • 포트가 2개이기 때문에 각 포트는 독립적으로 동작.
    • 독립된 주소
    • 독립된 데이터
    • 독립된 제어 신호
    • 독립된 클럭
  • 두 포트가 같은 사이클에서 서로 다른 주소를 동시에 읽거나 쓸 수 있음
  • FIFO, DMA, CDC, 파이프라인 사이 버퍼 등에 사용됨

구현

`timescale 1ns / 1ps

module true_dual_port_ram #(
    parameter DATA_WIDTH = 8,
    parameter ADDR_WIDTH = 8
) (
    // ------------- PORT A -------------
    input                       clk_a,
    input                       we_a,
    input      [ADDR_WIDTH-1:0] addr_a,
    input      [DATA_WIDTH-1:0] wdata_a,
    output reg [DATA_WIDTH-1:0] rdata_a,

    // ------------- PORT B -------------
    input                       clk_b,
    input                       we_b,
    input      [ADDR_WIDTH-1:0] addr_b,
    input      [DATA_WIDTH-1:0] wdata_b,
    output reg [DATA_WIDTH-1:0] rdata_b
);
    reg [DATA_WIDTH-1:0] mem[0:(1<<ADDR_WIDTH)-1];

    // Port A
    always @(posedge clk_a) begin
        if (we_a) begin
            mem[addr_a] <= wdata_a;
        end else begin
            rdata_a <= mem[addr_a];
        end
    end

    // Port B
    always @(posedge clk_b) begin
        if (we_b) begin
            mem[addr_b] <= wdata_b;
        end else begin
            rdata_b <= mem[addr_b];
        end
    end
endmodule

Leave a Comment

error: Content is protected !!