手写RAM(单端口、伪双端口、真双端口)

一、单端口RAM
单端口 RAM 指的是只有一个读写口,就是只有一组数据线和地址线,就是读和写都是通过这个口来访问 RAM,但是同一个时刻只能访问一个,要么是读,要么是写。


RAM 模型主要有一个二维的 RAM 存储,写入数据处理和读出数据处理,读出数据在读使能无效时,输出“X”态,那么为什么输出“X”态呢,输出“X”态是为了避免使用无效的读数据,防止逻辑使用错误。RAM 读无效时的数据我们不建议使用,我们一般只使用 RAM 读有效时的RAM 读数据。

module sp_ram ( 
    input clock , //ram clk
    input wen , //ram 写使能 WEN
    input en , //ram 总使能 ENA
    input [4:0] address , //ram 读写地址 ADDA
    input [7:0] data , //ram 写数据 DINA

    output reg [7:0] q //ram 读数据 DOUTA
);
 
    //reg define
 
    reg [7:0] ram [15:0] ; //ram 数据

    //*****************************************************
    //**                main code
    //*****************************************************
    
    always @(posedge clock ) begin
        if(wen && en)
        ram[address] <= data;
    end 
    
    always @(posedge clock ) begin
        if(( wen == 1'b0) && en)
            q <= ram[address];
        else
            q <= 8'hx ;
    end 
    
endmodule

二、伪双端口RAM
伪双端口 RAM 指的是有两个读写端口,但是一个端口只能读,一个端口只能写,伪双端口 RAM 一般叫 TP RAM。一般 FIFO 内部例化的都是伪双端口 RAM。

下面我们来看下伪双端口 RAM,伪双端口 RAM 指的是有两个读写口,就是有两组数据线和地址线,一组是写数据线,一组是读数据线,同一个时刻写和读可以同时访问。


RAM 模型主要有一个二维的 RAM 存储,写入数据处理和读出数据处理,读出数据在读使能无效时,输出“X”态,那么为什么输出“X”态呢,输出“X”态是为了避免使用无效的读数据,防止逻辑使用错误。RAM 读无效时的数据我们不建议使用,我们一般只使用 RAM 读有效时的 RAM 读数据。

module tp_ram ( 
    input clocka , //ram clk
    input clockb , //ram clk
    input wea, //ram A端口写使能    WEA
    input ena, //ram A端口使能    ENA
    input enb, //ram B端口使能    ENB
    input [4:0] wr_address , //ram 写地址 ADDA
    input [4:0] rd_address , //ram 写地址 ADDB
    input [7:0] data , //ram 写数据 DINA

    output reg [7:0] q //ram 读数据 DOUTB
 );
 
 //reg define
 
 reg [7:0] ram [31:0] ; //ram 数据
 
 //*****************************************************
 //**               main code
 //*****************************************************
 
 always @(posedge clocka ) begin
    if(ena & wea)
        ram[wr_address] <= data;
 end 

 always @(posedge clockb ) begin
    if(enb)
        q <= ram[rd_address];
    else
        q <= 8'hx ;
 end 

endmodule


三、真双端口RAM
真双端口 RAM 指的是有两个读写端口,每个端口都可以独立发起读或者写。下面我们来看下真双端口 RAM,真双端口 RAM 指的是有两个独立的读写口,就是有两组数据线和地址线,一组是读或者写数据线,另外一组也是读或者写数据线,同一个时刻两个端口可以同时访问,两个端口可以是读和读,也可以是写和读,还可以是写和写。


module dp_ram ( 
    input clocka , //ram clk
    input clockb , //ram clk
    input ena,       //ram A端口使能    ENA
    input enb,       //ram B端口使能    ENB
    input wea,    //ram 写使能    WEA
    input web,    //ram 写使能    WEB
    input [4:0] address_a , //ram 写地址
    input [4:0] address_b , //ram 写地址
    input [7:0] data_a , //ram 写数据 DINA
    input [7:0] data_b , //ram 写数据 DINB
 
    output reg [7:0] q_a , //ram 读数据 DOUTA
    output reg [7:0] q_b //ram 读数据 DOUTB
 );
 
 //reg define
 
 reg [7:0] ram [31:0] ; //ram 数据
 
 //*****************************************************
 //**                   main code
 //*****************************************************
 
 always @(posedge clocka ) begin
    if(ena & wea)
        ram[address_a] <= data_a;
 end 
 
 always @(posedge clockb ) begin
       if(enb & web)
           ram[address_b] <= data_b;
end 
 
 always @(posedge clocka ) begin
    if(ena & !wea)
        q_a <= ram[address_a];
    else
        q_a <= 8'hx ;
 end 
 
 always @(posedge clockb ) begin
    if(enb & !web)
        q_b <= ram[address_b];
    else
        q_b <= 8'hx ;
 end 
 
 endmodule
 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值