RAM的verilog设计


RAM的介绍

  RAM是用一块memory和外围的读写控制电路组成。在FPGA中RAM可分为分布式RAM(distributed ram,消耗lut资源)和块RAM(block ram,消耗BRAM资源)。利用lut实现存储器,既可以实现芯片内部存储,又能提高资源利用率,同时可以实现BRAM不能实现的异步访问。 不过使用分布式RAM实现大规模的存储器会占用大量的lut,可用来实现逻辑的lut就会减少,一般在需要小规模存储器时,使用这种分布式RAM。

RAM的实现

1. 生成memory

  利用以下代码便能生成宽度为WIDTH、深度为DEPTH的RAM,其中(* ram_style= “distributed” *) 可控制RAM由distributed ram(分布式ram,由lut构成)生成还是block ram生成。

(*ram_style= "distributed"*) 
reg  [WIDTH-1:0]  mem  [DEPTH-1:0]; 

2. 增加外围控制电路

  可以将上述1中的代码进行简单的封装,就可以生成一个单口RAM IP。

module single_port_ram		//simple双口RAM
#(
	parameter WIDTH=8,
	parameter DEPTH=16,
    parameter ADDR_BIT = $clog2(DEPTH);
	parameter RAM_STYLE_VAL="distributed"
)
(
	input clk,
	input we_a,						//a口写使能信号
	input en_a,						//a口使能信号
	input [ADDR_BIT-1:0] addr_a ,	//a口写地址
    input [   WIDTH-1:0] din_a  ,   //a口写数据
	output reg [WIDTH-1:0] dout_a	//a口输出数据
);

	(*ram_style=RAM_STYLE_VAL*)
	reg [WIDTH-1:0] RAM[0:DEPTH-1];	//RAM深度:DEPTH,宽度:WIDTH
	
	integer t;						//初始化RAM存储数值为0
	initial begin
		for(t=0;t<DEPTH;t=t+1)
			RAM[t]=0;
	end
	
	always@(posedge clk) begin
		if(en_a)
		begin
			if(we_a)
				RAM[addr_a]<=din_a;	//若en_a且we_a=1,a口输入数据至RAM[addr_a]
            else
			    dout_a<=RAM[addr_a];	//每过一个时钟,a口输出RAM[addr_a]数据
		end
	end
	
endmodule

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值