我用verilog设计了一个单端口的RAM,但是我无法做到RAM内存的纵向和横向扩展。您能帮我解决一下吗?[已关闭]

问题描述 投票:0回答:1

以下是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

模块

verilog ram expansion
1个回答
1
投票

我想你问的是一个通用的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 作为读写地址信号的大小。

通过改变 DATDPTH 你可以得到任何维度的内存。

我希望这就是你说的 水平或垂直扩展

© www.soinside.com 2019 - 2024. All rights reserved.