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