一种单端口ram的写法

1、该种写法内部用输入的地址直接作为数组mem的参数进行地址寻址,比较简洁

module ram(
	input                    I_sys_clk, 
	input					 I_cs,
    input                    I_wen,//cs选通时,高为写,低为读
	input          [4:0]     I_addr,
	input          [31:0]    I_wdata,
    output  reg              O_rdata_vld,
	output  reg    [31:0]    O_rdata
);
	reg [31:0] mem[0:31];


	always@(posedge I_sys_clk)
		if(I_wen && I_cs) mem[I_addr] <= I_wdata;
  
    always@(posedge I_sys_clk)
    begin
        if(!I_wen && I_cs)
        begin
            O_rdata <= mem[I_addr];
            O_rdata_vld <= 1'b1;
        end
        else
        begin
            O_rdata <= O_rdata ;
            O_rdata_vld <= 1'b0;
        end
    end

endmodule

2、也可以根据需要对其进行修改,比如现在要配置/控制一些信号,可以有如下写法。在控制信号比较少的情况下,接口较少,还能接受,但是在接口比较多的情况下,就比较繁琐了。

module ram(
	input                    I_sys_clk, 
	input					 I_cs,
    input                    I_wen,//cs选通时,高为写,低为读
	input          [4:0]     I_addr,
	input          [31:0]    I_wdata,
    output  reg              O_rdata_vld,
	output  reg    [31:0]    O_rdata,
    output           		 O_enable_ctrl,
    output 		   [4:0]     O_divider_cfg
);
	reg [31:0] mem[0:31];


	always@(posedge I_sys_clk)
		if(I_wen && I_cs) mem[I_addr] <= I_wdata;
  
    always@(posedge I_sys_clk)
    begin
        if(!I_wen && I_cs)
        begin
            O_rdata <= mem[I_addr];
            O_rdata_vld <= 1'b1;
        end
        else
        begin
            O_rdata <= O_rdata ;
            O_rdata_vld <= 1'b0;
        end
    end


assign    O_enable_ctrl = mem[0][0];
assign    O_divider_cfg = mem[1][4:0];

endmodule

3、前两种写法占用的资源比较少,可能只占用一个lut,一个reg,不过会占用一个ram块。

如果采取下面的写法,则会占用300+的lut,1000+的reg,不占用ram块。根据需求自主选择逻辑写法。

module test(
	input                    I_sys_clk, 
	input					 I_cs,
    input                    I_wen,//cs选通时,高为写,低为读
	input          [4:0]     I_addr,
	input          [31:0]    I_wdata,
    output  reg              O_rdata_vld,
	output  reg    [31:0]    O_rdata
);

 reg	[31:0]	mem0 ;
 reg	[31:0]	mem1 ;
 reg	[31:0]	mem2 ;
 reg	[31:0]	mem3 ;
 reg	[31:0]	mem4 ;
 reg	[31:0]	mem5 ;
 reg	[31:0]	mem6 ;
 reg	[31:0]	mem7 ;
 reg	[31:0]	mem8 ;
 reg	[31:0]	mem9 ;
 reg	[31:0]	mem10;
 reg	[31:0]	mem11;
 reg	[31:0]	mem12;
 reg	[31:0]	mem13;
 reg	[31:0]	mem14;
 reg	[31:0]	mem15;
 reg	[31:0]	mem16;
 reg	[31:0]	mem18;
 reg	[31:0]	mem19;
 reg	[31:0]	mem20;
 reg	[31:0]	mem21;
 reg	[31:0]	mem22;
 reg	[31:0]	mem23;
 reg	[31:0]	mem24;
 reg	[31:0]	mem25;
 reg	[31:0]	mem26;
 reg	[31:0]	mem27;
 reg	[31:0]	mem28;
 reg	[31:0]	mem29;
 reg	[31:0]	mem30;
 reg	[31:0]	mem31;
 

 always@(posedge I_sys_clk)
 begin
 	if(I_wen && I_cs)
    begin
     	case(I_addr)
         5'd0  : mem0  <= I_wdata;
         5'd1  : mem1  <= I_wdata;
         5'd2  : mem2  <= I_wdata;
         5'd3  : mem3  <= I_wdata;
         5'd4  : mem4  <= I_wdata;
         5'd5  : mem5  <= I_wdata;
         5'd6  : mem6  <= I_wdata;
         5'd7  : mem7  <= I_wdata;
         5'd8  : mem8  <= I_wdata;
         5'd9  : mem9  <= I_wdata;
         5'd10 : mem10 <= I_wdata;
         5'd11 : mem11 <= I_wdata;
         5'd12 : mem12 <= I_wdata;
         5'd13 : mem13 <= I_wdata;
         5'd14 : mem14 <= I_wdata;
         5'd15 : mem15 <= I_wdata;
         5'd16 : mem16 <= I_wdata;
         5'd18 : mem18 <= I_wdata;
         5'd19 : mem19 <= I_wdata;
         5'd20 : mem20 <= I_wdata;
         5'd21 : mem21 <= I_wdata;
         5'd22 : mem22 <= I_wdata;
         5'd23 : mem23 <= I_wdata;
         5'd24 : mem24 <= I_wdata;
         5'd25 : mem25 <= I_wdata;
         5'd26 : mem26 <= I_wdata;
         5'd27 : mem27 <= I_wdata;
         5'd28 : mem28 <= I_wdata;
         5'd29 : mem29 <= I_wdata;
         5'd30 : mem30 <= I_wdata;
         5'd31 : mem31 <= I_wdata;         
        endcase
    end
	else if(!I_wen && I_cs)
	begin
     	case(I_addr)
         5'd0  : begin O_rdata <= mem0  ;O_rdata_vld <= 1'b1;end
         5'd1  : begin O_rdata <= mem1  ;O_rdata_vld <= 1'b1;end
         5'd2  : begin O_rdata <= mem2  ;O_rdata_vld <= 1'b1;end
         5'd3  : begin O_rdata <= mem3  ;O_rdata_vld <= 1'b1;end
         5'd4  : begin O_rdata <= mem4  ;O_rdata_vld <= 1'b1;end
         5'd5  : begin O_rdata <= mem5  ;O_rdata_vld <= 1'b1;end
         5'd6  : begin O_rdata <= mem6  ;O_rdata_vld <= 1'b1;end
         5'd7  : begin O_rdata <= mem7  ;O_rdata_vld <= 1'b1;end
         5'd8  : begin O_rdata <= mem8  ;O_rdata_vld <= 1'b1;end
         5'd9  : begin O_rdata <= mem9  ;O_rdata_vld <= 1'b1;end
         5'd10 : begin O_rdata <= mem10 ;O_rdata_vld <= 1'b1;end
         5'd11 : begin O_rdata <= mem11 ;O_rdata_vld <= 1'b1;end
         5'd12 : begin O_rdata <= mem12 ;O_rdata_vld <= 1'b1;end
         5'd13 : begin O_rdata <= mem13 ;O_rdata_vld <= 1'b1;end
         5'd14 : begin O_rdata <= mem14 ;O_rdata_vld <= 1'b1;end
         5'd15 : begin O_rdata <= mem15 ;O_rdata_vld <= 1'b1;end
         5'd16 : begin O_rdata <= mem16 ;O_rdata_vld <= 1'b1;end
         5'd18 : begin O_rdata <= mem18 ;O_rdata_vld <= 1'b1;end
         5'd19 : begin O_rdata <= mem19 ;O_rdata_vld <= 1'b1;end
         5'd20 : begin O_rdata <= mem20 ;O_rdata_vld <= 1'b1;end
         5'd21 : begin O_rdata <= mem21 ;O_rdata_vld <= 1'b1;end
         5'd22 : begin O_rdata <= mem22 ;O_rdata_vld <= 1'b1;end
         5'd23 : begin O_rdata <= mem23 ;O_rdata_vld <= 1'b1;end
         5'd24 : begin O_rdata <= mem24 ;O_rdata_vld <= 1'b1;end
         5'd25 : begin O_rdata <= mem25 ;O_rdata_vld <= 1'b1;end
         5'd26 : begin O_rdata <= mem26 ;O_rdata_vld <= 1'b1;end
         5'd27 : begin O_rdata <= mem27 ;O_rdata_vld <= 1'b1;end
         5'd28 : begin O_rdata <= mem28 ;O_rdata_vld <= 1'b1;end
         5'd29 : begin O_rdata <= mem29 ;O_rdata_vld <= 1'b1;end
         5'd30 : begin O_rdata <= mem30 ;O_rdata_vld <= 1'b1;end
         5'd31 : begin O_rdata <= mem31 ;O_rdata_vld <= 1'b1;end  
		default :begin O_rdata <= O_rdata;O_rdata_vld <= 1'b0;end
        endcase	
	end
    else
    begin
        O_rdata <= O_rdata;
        O_rdata_vld <= 1'b0;
    end
 end
 
 
 
endmodule

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值