手撕RAM(单端口,简单双端口,真双端口)

单端口与双端口RAM模块RTL实现详解
本文详细介绍了单端口、简单双端口及真双端口RAM模块在RTL级的Verilog代码实现,包括参数设置、输入输出信号以及读写操作。通过实例展示,读者可以理解不同端口类型的内存结构和工作原理。

这里写自定义目录标题

单端口

rtl

module hand_ram_sp #(
	parameter DATAWIDTH	=8	,
	parameter ADDRSIZE	=8
)
(
	input 						clka		,
	input 						ena			,
	input 						wea			,
	input 			[ADDRSIZE-1:0]	addra	,
	input 			[DATAWIDTH-1:0]	dina	,
	output 	reg		[DATAWIDTH-1:0]	douta
);

localparam DATADEPTH = 1<<ADDRSIZE;
reg [DATAWIDTH-1:0]	mem	[DATADEPTH-1:0];

always @(posedge clka ) begin
	if(ena&&(~wea))begin
		douta <= mem[addra];
	end
	else 	begin
		douta <= 0;
	end
end

always @(posedge clka ) begin
	if(ena&&wea)	begin
		mem[addra] <= dina;
	end
	else 	begin
		mem[addra] <= mem[addra];
	end
end


	
endmodule

sim

//~ `New testbench
`timescale  1ns / 1ps

module tb_hand_ram_sp;

// hand_ram_sp Parameters
parameter PERIOD = 10;
parameter DATAWIDTH  = 8;
parameter ADDRSIZE  = 4;

// hand_ram_sp Inputs
reg   clk                                 		= 0 ;
reg   ena                                  		= 0 ;
reg   wea                                  		= 0 ;
reg   [ADDRSIZE-1:0]  	addra               	= 0 ;
reg   [DATAWIDTH-1:0]  	dina                 	= 0 ;

// hand_ram_sp Outputs
wire  [DATAWIDTH-1:0]  douta                   ;

initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

hand_ram_sp #(
    .DATAWIDTH ( DATAWIDTH ),
    .ADDRSIZE ( ADDRSIZE ))
 u_hand_ram_sp (
    .clka                    ( clk                ),
    .ena                     ( ena                ),
    .wea                     ( wea                ),
    .addra                   ( addra  [ADDRSIZE-1:0] 	),
    .dina                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值