以下是RAM模块的代码
模块syncRAM( dataIn,dataOut,address,cs,we,oe,clk)。
parameter ADR = 8;
parameter DAT = 8;
parameter DPTH = 8;
input [DAT-1:0] dataIn;
output reg [DAT-1:0] dataOut;
input [ADR-1:0] address;
input cs,we,clk,oe;
reg [DAT-1:0] mem [DPTH-1:0];
always @ (posedge clk)
begin : MEM_READ
if (cs && !we && oe) begin
mem[address] = dataIn;
end
end
always @ (posedge clk)
begin : MEM_WRITE
if ( cs && we ) begin
dataOut = mem[address];
end
end
模块
我想你问的是一个通用的RAM代码,你可以修改内存的深度和宽度。下面是一个示例代码,可能不符合你的要求。
module RAM (
ReadAddress ,
ReadEn ,
dataOut ,
WriteEn ,
WriteAddress ,
dataIn ,
clk ,
rst_n
);
parameter DAT = 32 ;
parameter DPTH = 1024 ;
parameter ADR = $clog2(DPTH) ; // 10
input [ ADR - 1 : 0 ] ReadAddress ;
input ReadEn ;
output reg [ DAT - 1 : 0 ] dataOut ;
input WriteEn ;
input [ ADR - 1 : 0 ] WriteAddress ;
input [ DAT - 1 : 0 ] dataIn ;
input clk ;
input rst_n ;
reg [ DAT - 1 : 0 ] ram [0 : DPTH-1] ; // DAT x DPTH = 32 x 1024
integer i ;
always@( posedge clk )
begin
if ( !rst_n )
begin
dataOut <= { DAT { 1'b0 } } ;
end
else
begin
if ( WriteEn ) // write
begin
ram [ WriteAddress ] <= dataIn ;
end
if (ReadEn) // read
begin
dataOut <= ram [ ReadAddress ] ;
end
end
end
endmodule
这里的参数定义了RAM模块的大小。
DAT 是指从RAM中写入和读出数据的宽度。DPTH 是指您的RAM中条目的大小或数量。ADR 是用于遍历到RAM的Index大小。
这里的 ADR 计算方法是 DPTH 即RAM的条目数。$clog2 用来取DPTH的log2(),并将其封顶到下一个整数值。
在目前的例子中,$clog2(DPTH)是$clog2(1024)等于10的大小。ADR
因此 ADR 作为读写地址信号的大小。
通过改变 DAT 和 DPTH 你可以得到任何维度的内存。
我希望这就是你说的 水平或垂直扩展