伪双口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
    评论
Vivado 双口 RAM IP 核是通过使用 Vivado 软件中的 RAM IP 核来实现的。双口 RAM 具有两个端口,但只能在一个时钟上进行读写操作。其中一个端口可以同时进行读写操作,而另一个端口只能进行读出操作。这种类型的 RAM 可以用于并行处理或者需要同时读写的应用场景。 在 Vivado 中,通过使用 RAM IP 核并选择相应的配置参数,可以生成双口 RAM IP 核。根据你提供的引用中的信息,Vivado 的 RAM IP 核可以生成多种不同类型的内存空间,包括单口 RAM、简化双口 RAM 和真双口 RAM。其中,双口 RAM 是其中之一。 如果你需要使用 Vivado 中的双口 RAM IP 核,你可以按照以下步骤进行操作: 1. 打开 Vivado 软件并创建一个新的项目。 2. 在设计页面中,点击工具栏上的 "IP Integrator" 图标,进入 IP Integrator 界面。 3. 在 IP Integrator 中,点击 "Add IP" 按钮,并选择 "RAM" 类别下的 "RAM" IP 核。 4. 在 IP 配置页面中,选择 "双口 RAM" 作为 RAM 的类型。 5. 根据你的需求,进行其他参数的配置,如数据位宽、地址位宽等。 6. 完成配置后,点击 "OK" 按钮,将双口 RAM IP 核添加到设计中。 7. 连接适当的时钟和控制信号,并进行其他必要的连接。 8. 生成 Bitstream 并下载到目标设备中进行仿真或部署。 需要注意的是,根据你提供的引用中的信息,在仿真中可能只使用了一个端口进行读写操作。因此,在使用 Vivado 的双口 RAM IP 核时,你可能需要根据具体的应用需求和设计要求确定是否需要使用两个端口进行读写操作。 : 使用 Vivado 软件中的 RAM 的 IP 核实现真双口 RAM 的仿真 : Vivado 的双口 RAM 的 IP 核是通过 Block Memory Generator 产生的,其中包含单口 RAM、简化双口 RAM 和真双口 RAM : Xilinx 官方例程中使用寄存器构建了一个真双口 RAM 的模块,并提供了相应的代码示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值