FPGA片内RAM读写测试实验 2

简介: FPGA片内RAM读写测试实验

3、添加 ILA IP 核

①、点击左侧 PROJECT MANAGER 栏 –> IP Catalog 或者菜单栏下 Window –> IP Catalog 然后在右侧出现的 IP Catalog 窗口下搜索 ILA,双击选择 Debug 下的 ILA 进行 IP 配置操作步骤如下图所示

②、General Option 添加两个探针去采集我们读的地址和数据,采样数据的长度我们设置大一些,如下图所示


③、Probe_Ports(0…7) 中PROBE0 用来采集9 位地址,PROBE1 用来采集 16 位数据,如下图所示

④、点击 OK,再点击 Generate,生成 ILA IP

二、程序编写

编写程序之前我们先介绍下我们涉及到哪些信号

Simple Dual Port RAM 模块端口的说明如下:

信号名称 方向 说明
clka in 端口 A 时钟输入
wea in 端口 A 使能
addra in 端口 A 地址输入
dina in 端口 A 数据输入
clkb in 端口 B 时钟输入
addrb in 端口 B 地址输入
doutb out 端口 B 数据输出

RAM 的数据写入和读出都是按时钟的上升沿操作的,端口 A 数据写入的时候需要置高 wea 信号,同时提供地址和要写入的数据。下图为输入写入到 RAM 的时序图。

而端口 B 是不能写入数据的,只能从 RAM 中读出数据,只要提供地址就可以了,一般情况下可以在下一个周期采集 到有效的数据 。

1、新建测试程序

新建 ram_test.v 源文件并将下面的程序块拷贝过去

ram_test.v

`timescale 1ns / 1ps
module ram_test(
    input clk,          // 50 MHz 时钟
    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 读数据
// ************************************************************************
// ** main
// ************************************************************************
// 产生RAM PORTB读地址,读的地址 + 1,模拟写的地址滞后一个周期
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 ) begin       // ram 写使能有效
            if( &w_addr ) begin   // w_addr 的 bit 位全为 1,共写入 512 个数据,写入完成
                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_instance (
  .clka(clk   ),      // input wire clka
  .wea(wea      ),      // input wire [0 : 0] wea
  .addra(w_addr   ),    // input wire [8 : 0] addra
  .dina(w_data    ),      // input wire [15 : 0] dina
  .clkb(clk   ),        // input wire clkb
  .addrb(r_addr   ),    // input wire [8 : 0] addrb
  .doutb(r_data   )     // output wire [15 : 0] doutb
);
// 实例化 ila 逻辑分析仪
ila_0 ila_0_instance (
  .clk(clk),        // input wire clk
  .probe0(r_addr),    // input wire [8:0]  probe0  
  .probe1(r_data)     // input wire [15:0]  probe1
);
endmodule

2、新建仿真文件

新建 vtf_ram_tb.v 仿真文件并将下面的程序块拷贝过去

vtf_ram_tb.v

`timescale 1ns / 1ps
module vtf_ram_tb;
// Inputs
reg clk;
reg rst_n;
// Instantiate the Unit Under Test (UUT)
ram_test uut (
  .clk  (clk),
  .rst_n  (rst_n)
);
initial 
begin
  // Initialize Inputs
  clk = 0;
  rst_n = 0;
  // Wait 100ns for global reset to finish
  #100;
    rst_n = 1;
end
always #10 clk = ~clk;  // 20ns 一个周期,产生 50MHz 时钟源
endmodule

三、进行仿真

①、点击 Run Simulation -> Run Behavioral Simulation,进行仿真

②、将 RAM 里面相关信号拖拽进观察窗口

(clocka 和 clockb 用的就是系统时钟,因此这里无需拖入到观察窗口)

③、设置个 200us 跑一下

④、分析波形

开始的波形信息

可以看到读地址是滞后于写地址的一个时钟周期的,读出的数据是滞后于写地址的一个时钟周期的

结束的波形信息

我们这里把这些信号以 10 进制方式进行查看

可以看到最后写的一个地址是 511,写入的内容是 512,最后读的一个地址是 511,读取的内容是 512

可以发现我们的写只写第一,而读一直在进行。

四、下载到 FPGA

1、引脚约束及时序约束

rst_n -> T11
clk -> U18

新建引脚约束文件 ram.xdc,将下面语句拷贝过去并保存

set_property PACKAGE_PIN T11 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN U18 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]

2、生成比特文件

点击 “Generate Bitstream”,直接生成 bit 文件

3、下载程序

连接上 JTAG 以及电源线,将板子上电,下载程序

4、逻辑分析仪分析波形

以 10 进制方式查看读取的内存及数据,设置触发条件为 “读取的地址为 0”,可以看到读取地址 0 的数据为 1,读取地址 511 时的数据为 512,可见满足了预期结果。

五、资源自取

FPGA片内RAM读写测试实验

目录
相关文章
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
342 7
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
11月前
|
数据采集 移动开发 算法
【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现QPSK调制与软解调系统,包含Testbench、高斯信道、误码率统计模块,并支持不同SNR设置。硬件版本新增ILA在线数据采集和VIO在线SNR设置功能,提供无水印完整代码及测试结果。通过VIO分别设置SNR为6dB和12dB,验证系统性能。配套操作视频便于用户快速上手。 理论部分详细解析QPSK调制原理及其软解调实现过程,涵盖信号采样、相位估计、判决与解调等关键步骤。软解调通过概率估计(如最大似然法)提高抗噪能力,核心公式为*d = d_hat / P(d_hat|r[n])*,需考虑噪声对信号点分布的影响。 附Verilog核心程序代码及注释,助力理解与开发。
367 5
|
11月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2ASK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文分享了基于FPGA的2ASK+帧同步系统硬件测试版本,包含ILA数据采集、VIO SNR设置及数据源模块。通过调整SNR(如45dB和10dB),实现对调制解调性能的验证。2ASK调制将数字信号转为二进制码,通过载波振幅变化传输;帧同步用于确定帧起始位置,确保数据正确解调。附带操作视频与核心Verilog代码,便于理解和复现。
338 9
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
445 19
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
333 17
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
329 13
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
331 7
|
数据采集 算法 数据处理
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
298 2
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16QAM基带通信系统硬件测试版本。该系统在仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比(如15dB、25dB)的测试。16QAM是一种正交幅度调制方式,通过两路4ASK信号叠加实现,每个符号包含4比特信息。系统采用正交调幅法生成16QAM信号,并通过DAC转换为模拟信号。解调时使用正交相干解调,经低通滤波器恢复电平信号。开发板内完成发射与接收,无需定时同步模块。代码可移植至其他开发板,具体步骤见配套文档。
286 2