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读写测试实验

目录
相关文章
|
14天前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
28 7
|
1月前
|
芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(一)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
|
1月前
|
芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(三)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
|
2月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
2月前
|
算法 异构计算
m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
该文介绍了基于FPGA的电子钟设计,利用Vivado2019.2平台进行开发并展示测试结果。电子钟设计采用Verilog硬件描述语言,核心包括振荡器、分频器和计数器。时间显示为2个十进制格式,闹钟功能通过存储器和比较器实现,当当前时间等于设定时间时触发。文中给出了Verilog核心程序示例,展示了时钟信号、设置信号及输出的交互。
34 2
|
1月前
|
异构计算
FPGA片内ROM测试实验(二)
FPGA片内ROM测试实验
19 1
|
4天前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
6天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
11天前
|
算法 计算机视觉 异构计算
基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证
该内容展示了FPGA实现图像累积直方图的算法。使用Vivado2019.2和matlab2022a,通过FPGA的并行处理能力优化图像处理。算法基于像素值累加分布,计算图像中像素值小于等于特定值的像素个数。核心代码为`test_image`模块,读取二进制图像文件并传递给`im_hist`单元,生成直方图和累积直方图。
|
20天前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。

热门文章

最新文章