伪双口RAM读写设计

1.1 概念

     伪双口RAM有两个读写端口,但一个端口只能读,一个端口只能写。

1.2 使用

     1、一般FIFO内部例化的都是伪双口RAM
     2、如果读和写同时有效,且读和写是同一个地址时,发生RAM读写冲突,此时会把最新的写数据直接赋给读数据,称为写穿通到读

1.3 伪双口RAM读写代码

下面展示 功能代码

`timescale 1ns / 1ps
///

// 读写模块 Verilog 功能代码如下:


module tp_ram_ab_rw(

input sys_clk,
input sys_rst_n
    );
    
wire ram_en ;
wire ram_wrena ;
wire ram_rdenb ;
wire  [7:0] ram_rd_data ;
wire  [4:0] ram_wr_addr ;
wire  [4:0] ram_rd_addr ;

reg  [7:0] ram_wr_data ;
reg  [7:0] ram_cnt ;


assign   ram_rdenb = ((ram_cnt >= 8'd5) && (ram_cnt <= 8'd32))? 1'b1:1'b0 ;
assign   ram_wrena = ((ram_cnt >= 8'd0) && (ram_cnt <= 8'd31))? 1'b1:1'b0 ;

assign   ram_wr_addr = ram_cnt[4:0];
assign   ram_rd_addr = ram_cnt[4:0] - 5'd1 ;
   
always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
           ram_cnt <= 8'd0 ;
     else if(ram_cnt == 8'd63)
           ram_cnt <= 8'd0 ;
           else
           ram_cnt <= ram_cnt + 1'b1 ;

always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
           ram_wr_data <= 8'd0 ;
     else if(ram_wrena)
          if(ram_wr_data == 8'd31)           
                    ram_wr_data <= 8'd0 ;    
                 else
                    ram_wr_data <= ram_wr_data + 1'b1 ;  


 tp_ram_ab_ctrl  tp_ram_ab_ctrl_inst(

.clka(sys_clk)  ,
.clkb(sys_clk)  ,
.wena(ram_wrena)  ,
.ena (ram_en)  ,
.enb (ram_rdenb)  ,
.dina(ram_wr_data)  ,
.wr_addra(ram_wr_addr),
.rd_addrb(ram_rd_addr),

.doutb(ram_rd_data)
    );
           
 endmodule          
    


// 控制模块 Verilog 功能代码如下:

module tp_ram_ab_ctrl(

input  clka,
input  clkb,
input  wena,
input  ena,
input  enb,
input  [7:0] dina,
input  [4:0] wr_addra,
input  [4:0] rd_addrb,

output reg [7:0] doutb
    );
    
reg [7:0] ram [31:0] ;

always @ (posedge clka)
     if(wena)   
        ram[wr_addra] <= dina ;
       
always @ (posedge clkb)
     if(enb)
         doutb <= ram[wr_addra] ;
     else
       doutb <=8'hx;
       
endmodule


// 仿真模块 Verilog 功能代码如下:

    
module tb_tp_ram(
    );
    
    reg clk ;
    reg rst ;
    
    initial  begin
       clk = 1'b0 ;
       rst = 1'b0;
       #400
       rst = 1'b1;
    end
    
always #10 clk = ~clk ;

tp_ram_ab_rw  tp_ram_ab_rw_inst(

.sys_clk (clk),
.sys_rst_n (rst)

    );    
    
endmodule  

 

1.4 仿真波形

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值