FPGA上板项目(三)——RAM测试

2024-08-26 15:44
文章标签 项目 测试 fpga ram 上板

本文主要是介绍FPGA上板项目(三)——RAM测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 实验内容
  • 实验原理
  • 实验步骤
  • 实验用时序波形
  • HDL 代码
  • 仿真
  • 综合实现
  • 上板测试


实验内容

对 FPGA 内部的 RAM 进行数据读写操作。

实验原理

RAM (Random Access Memory),是可以进行数据交换的存储器,可读可写;而 ROM(Read-Only Memory)为只读存储器,只可读取不可写入。

实验步骤

  • 添加 Block Memory Generator IP核,选择 Simple Dual Port RAM,则代表使用两个独立端口,Port A 作为输入,Port B 作为输出。
    在这里插入图片描述
  • 关于 Port A 的设置:Width 代表数据位宽,Depth 代表可以存放的数据个数。
    在这里插入图片描述
  • 关于 Port B 的设置:Width 和 Depth 与端口A保持一致,勾选 Primitives Output Register 会在输出数据后加一级寄存器,输出会落后地址两个时钟,取消勾选则落后一个时钟。
    在这里插入图片描述
  • RAM 模块端口定义
信号名称方向说明
clkain端口A的时钟
weain端口A的写使能
addrain端口A的地址输入
dinain端口A的数据输入
clkbin端口B的时钟
addrbin端口B的地址输入
doutbout端口B的数据输出
  • 写时序图:在 wea 为高,同时 clka 为上升沿时,将数据 dina 写入地址 addra 中。

在这里插入图片描述

  • 读时序图:clkb 的上升沿时刻读取地址 addrb,并输出该地址对应的数据 doutb。由于是流水线作业,从时序上看,输出的数据 doutb 落后地址 addrb 一个时钟周期。

在这里插入图片描述

实验用时序波形

在这里插入图片描述

时序图说明:

  • wea 置高时,DINA、ADDRA 开始变化,从而开始写入数据,地址为 0 - 511,数据为 10 - 521。
  • 写入后的下一时刻便开始读取数据,地址从 0 - 511。

HDL 代码

module RAM#(parameter DATA_DEPTH = 'd512
)(input wire sys_clk_p,input wire sys_clk_n,input wire rst          // 同步低复位
);/**********************************************
*********** IBUFDS 原语
**********************************************/IBUFDS IBUFDS_inst(.O(sys_clk),.I(sys_clk_p),.IB(sys_clk_n));/**********************************************
*********** 实例化 RAM
**********************************************/reg wea;reg [8:0] addra;reg [8:0] addrb;reg [31:0] dina;wire [31:0] doutb;ram_ip inst_ram (.clka(sys_clk),    // input wire clka.wea(wea),      // input wire [0 : 0] wea.addra(addra),  // input wire [8 : 0] addra.dina(dina),    // input wire [31 : 0] dina.clkb(sys_clk),    // input wire clkb.addrb(addrb),  // input wire [8 : 0] addrb.doutb(doutb)  // output wire [31 : 0] doutb);/**********************************************
*********** 输入端信号赋值
**********************************************/// 赋值wea信号always@(posedge sys_clk) beginif(!rst) beginwea <= 1'b0;endelse if(addra == DATA_DEPTH - 1) beginwea <= 1'b0;endelse beginwea <= 1'b1;endend// 赋值dina信号always@(posedge sys_clk) beginif(!rst) begindina <= 32'd10;endelse if(dina >= DATA_DEPTH + 32'd9) begindina <= DATA_DEPTH + 32'd9;endelse if(wea) begindina <= dina + 32'd1;endend// 赋值addra信号always@(posedge sys_clk) beginif(!rst) beginaddra <= 9'd0;endelse if(addra >= DATA_DEPTH - 9'd1) beginaddra <= DATA_DEPTH - 32'd1;endelse if(wea) beginaddra <= addra + 9'd1;endend/**********************************************
*********** 输出端信号赋值
**********************************************/// 赋值addrb信号always@(posedge sys_clk) beginif(!rst) beginaddrb <= 9'd0;endelse beginaddrb <= addra;endend/**********************************************
*********** 实例 ILA
**********************************************/ila_0 inst_ila(.clk(sys_clk), // input wire clk.probe0(wea), // input wire [0:0]  probe0  .probe1(addrb), // input wire [8:0]  probe1 .probe2(doutb) // input wire [31:0]  probe2);
endmodule

仿真

  • testbench 代码
module tb_RAM#(parameter DATA_DEPTH = 'd512
)();
/**********************************************
*********** 实例化模块
**********************************************/reg sys_clk_p;wire sys_clk_n;reg rst;RAM #(.DATA_DEPTH(DATA_DEPTH))tb_RAM(.sys_clk_p(sys_clk_p),.sys_clk_n(sys_clk_n),.rst(rst));/**********************************************
*********** 初始化 clk、rst
**********************************************/// 初始化 clkassign sys_clk_n = ~sys_clk_p;initial beginsys_clk_p = 1;forever #2.5 sys_clk_p = ~sys_clk_p;   end// 初始化 rstinitial beginrst = 0;#102.5;rst = 1;endendmodule
  • 仿真结果:

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

综合实现

添加管脚和时序约束后,run synthesis 以及 run implementation,具体步骤可参考:FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试

上板测试

上板测试结果如下:

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

这篇关于FPGA上板项目(三)——RAM测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108989

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免