약 3분 소요
개요
포트란 무엇인가
- RAM의 포트는 메모리에 접근하기 위한 입출력 통로를 의미
- 하나의 포트는 주소 버스(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