片内RAM读写测试实验

该文介绍了如何在FPGA中使用BlockMemoryGeneratorIP核进行RAM的读写测试。通过设置IP核,向RAM端口A写入数据,并从端口B读出,验证读写功能。在Verilog代码中,控制时钟、地址、数据和使能信号来实现读写操作,并通过ILA逻辑分析仪进行在线仿真和上板验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

片内RAM读写测试实验

概念

RAM是FPGA中常用的基础模块,可广泛用于缓存数据的情况,同样它也是 ROM,FIFO 的基础。
官方已经提供了RAM的IP核进行例化即可。
在这里插入图片描述

读写时序(具体还是要看官方资料):
在这里插入图片描述
在这里插入图片描述

过程

  1. 创建工程
  2. 在ip catalog里面搜索ram,选择Block Memory Generator,双击并进行设置即可。

代码

向RAM端口A写入一串连续数据,只写一次,并从端口B读出。

`timescale 1ns / 1ps 
// 
module ram_test( 
    input sys_clk_p, //system clock 200Mhz on board 
    input sys_clk_n, //system clock 200Mhz on board 
    input rst_n //复位信号,低电平有效 
    );
//----------------------------------------------------------- 
reg [8:0] w_addr; //RAM PORTA写地址 
reg [15:0] w_data; //RAM PORTA写数据 
reg wea; //RAM PORTA使能 
reg [8:0] r_addr; //RAM PORTB读地址 
wire [15:0] r_data; //RAM PORTB读数据

wire clk ;
IBUFDS IBUFDS_inst ( 
.O(clk), // Buffer output 
.I(sys_clk_p), // Diff_p buffer input (connect directly to top-level port) 
.IB(sys_clk_n) // Diff_n buffer input (connect directly to top-level port) 
);
//产生RAM PORTB读地址 
always @(posedge clk or negedge rst_n) 
begin 
    if(!rst_n)
        r_addr <= 9'd0; 
    else if (|w_addr) //w_addr位或,不等于0 
        r_addr <= r_addr+1'b1; 
    else 
        r_addr <= 9'd0; 
end


//产生RAM PORTA写使能信号 
always@(posedge clk or negedge rst_n) 
begin 
if(!rst_n)  
    wea <= 1'b0; 
else 
    begin 
    if(&w_addr) //w_addr的bit位全为1,共写入512个数据,写入完成 
        wea <= 1'b0; 
    else 
        wea <= 1'b1; //ram写使能 
    end 
end


//产生RAM PORTA写入的地址及数据 
always@(posedge clk or negedge rst_n) 
begin 
    if(!rst_n) 
        begin 
        w_addr <= 9'd0; 
        w_data <= 16'd1; 
        end 
    else 
        begin 
        if(wea) //ram写使能有效 
            begin 
            if (&w_addr) //w_addr的bit位全为1,共写入512个数据,写入完成 
                begin 
                w_addr <= w_addr ; //将地址和数据的值保持住,只写一次RAM 
                w_data <= w_data ; 
                end 
            else 
                begin 
                w_addr <= w_addr + 1'b1; 
                w_data <= w_data + 1'b1; 
                end 
            end 
        end 
end

//实例化RAM 
ram_ip ram_ip_inst ( 
    .clka (clk ), // input clka 
    .wea (wea ), // input [0 : 0] wea 
    .addra (w_addr ), // input [8 : 0] addra 
    .dina (w_data ), // input [15 : 0] dina 	
    .clkb (clk ), // input clkb 
    .addrb (r_addr ), // input [8 : 0] addrb 
    .doutb (r_data ) // output [15 : 0] doutb 
);

//实例化ila逻辑分析仪 
ila_0 ila_0_inst ( 
    .clk (clk ), 
    .probe0 (r_data ), 
    .probe1 (r_addr ) 
);

endmodule

`timescale 1ns / 1ps
//

module vtf_ram_test;
// Inputs 
reg sys_clk_p; 
reg rst_n ; 
wire sys_clk_n; 

ram_test uut(
    .sys_clk_p(sys_clk_p), 
    .sys_clk_n(sys_clk_n), 
    .rst_n(rst_n)
    );

initial 
begin 
    // Initialize Inputs 
    sys_clk_p = 0; 
    rst_n = 0; 
    // Wait for global reset to finish 
    #1000;  
    rst_n = 1; 
end 

//Create clock 
always #2.5 sys_clk_p = ~ sys_clk_p; assign sys_clk_n = ~sys_clk_p ; 

endmodule

仿真

在线仿真

仿真的话,可以把写入的值和读出的值均抓出来。

在这里插入图片描述
在这里插入图片描述

上板验证

代码中只抓取了读取数据的端口,通过读取数据验证是否正确。
在这里插入图片描述

总结

通过控制ram的时钟,地址,数据,使能端口,根据读取和写入时序进行数据的读取。

参考资料

  1. https://docs.xilinx.com/v/u/en-US/pg058-blk-mem-gen
RAM Stress Test(RST)内存测试软件使用指南 近日比较关注内存的检测问题,找到了名为“RAM Stress Test”的软件(简称“R. S. T.)。但是下载下来,只有区区的2M多,并且是nero格式的文件,这么小的文件能检测内存吗?于是在Google上查找相关说明,经过跋山涉水,终于找到一,但是很不幸,在一家被挡在墙外的网站上,也就只好半转载、半理解得写出了这一篇使用说明。 先看软件介绍。这个可以从网络上搜索。例如,它是一个独立开发的系统,没有依附任何操作系统,相容于x86系列,只要BIOS认的到的容量都能测。也有人写道,是什么专业测试软件,很贵(500美元)等等,其实只需要知道能测试内存好坏就可以了。 DDR测试软件简要说明书 0123456789ABCDEF0123456789ABCDEF 0123456789ABCDEF0123456789ABCDEF 第1颗粒 第2颗粒 第3颗粒 第4颗粒 第5颗粒 第6颗粒 第7颗粒 第8颗粒 如以上的示范图: 闪动的代表8颗粒的区域 横着数0-7带表第一颗区域8-F代表第二颗区域,0-7带表第三颗区域,8-F代表第四颗区域 依次带表8颗颗粒的内存条. ⒈DDR8位与16位的单面测法: 注意:DDR的颗粒排列循序是1-2-3-4-5-6-7-8 ⑴.0-7(第1颗粒)区域如果出现乱码,代表这根DDR内存条的第一颗粒已经损坏 ⑵. 8-F(第2颗粒)区域如果出现乱码,代表这根DDR内存条的第二颗粒已经损坏 ⑶. 0-7(第3颗粒)区域如果出现乱码,代表这根DDR内存条的第三颗粒已经损坏 ⑷.8-F(第4颗粒)区域如果出现乱码,代表这根DDR内存条的第四颗粒已经损坏 ⑸. 0-7(第5颗粒)区域如果出现乱码,代表这根DDR内存条的第五颗粒已经损坏 ⑹. 8-F(第6颗粒)区域如果出现乱码,代表这根DDR内存条的第六颗粒已经损坏 ⑺. 0-7(第7颗粒)区域如果出现乱码,代表这根DDR内存条的第七颗粒已经损坏 ⑻. 8-F(第8颗粒)区域如果出现乱码,代表这根DDR内存条的第八颗粒已经损坏 ⒉如果你是128M的双面DDR内存,如以上显示界面图: 1-16M ------------------------------------------------------------------------------------------------------------ 16-32M ------------------------------------------------------------------------------------------------------- 32-48M ------------------------------------------------------------------------------------------------------------ 48-64M------------------------------------------------------------------------------------------------------------- 从1M到64M的上面的4根虚线上出现乱码的话,代表这跟内存的的第一面的颗粒有问题(判断哪个颗粒的好坏按照以上的说明) 64-80M ------------------------------------------------------------------------------------------------------------ 80-96M ------------------------------------------------------------------------------------------------------- 96-112M------------------------------------------------------------------------------------------------------------ 112-128M---------------------------------------------------------------------------------------------------------- 从64M到128M的上面的4根虚线上出现乱码的话,代表这跟内存的的第二面的颗粒有问题(判断哪个颗粒的好坏按照以上的说明) 注意:在内存的PCB板上的两边标着1与92的代表第一面93与184的代表第二面,1-128M的8根虚线是用来区分两面区域的作用. ⒊SD的8位与16位的单面测法: 注意:SD的颗粒排列循序是8-4-7-3-6-2-5-1 ⑴.0-7(第1颗粒)区域如果出现乱码,代表这根DDR内存条的第8颗粒已经损坏 ⑵. 8-F(第2颗粒)区域如果出现乱码,代表这根DDR内存条的第4颗粒已经损坏 ⑶. 0-7(第3颗粒)区域如果出现乱码,代表这根DDR内存条的第7颗粒已经损坏 ⑷.8-F(第4颗粒)区域如果出现乱码,代表这根DDR内存条的第3颗粒已经损坏 ⑸. 0-7(第5颗粒)区域如果出现乱码,代表这根DDR内存条的第6颗粒已经损坏 ⑹. 8-F(第6颗粒)区域如果出现乱码,代表这根DDR内存条的第2颗粒已经损坏 ⑺. 0-7(第7颗粒)区域如果出现乱码,代表这根DDR内存条的第5颗粒已经损坏 ⑻. 8-F(第8颗粒)区域如果出现乱码,代表这根DDR内存条的第1颗粒已经损坏 4.通过以上的说明SD的双面是跟DDR的是一样的但是颗粒的好坏判断要按照 他们的排列循序来判断的. 5.PCB板的短路或者虚焊的测法:在以8根虚线上都出现乱码代表这根内存的PCB板有问题. 6.不点亮内存的测试方法:很多内存短路和颗粒损坏后都不能点亮,不点亮的可以用. 一根好的内存去带动他.必须SD的带SD的.DDR的带DDR的.内存软件会自动跳过好的那根去检测坏的那条. 7.使用方法:直接把软盘插入软驱,在主板的CMOS里设置软驱起动,起动后本软件会自动引导到测试界面进行检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值