片内RAM读写测试实验

news2024/11/25 22:30:27

片内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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 用 C++ 实现 - 获取最大软件版本号

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

以太网协议和DNS协议

1.以太网协议报文属性上面的图表示的是整个以太网数据报.目的地址和原地址此处的地址并非是IP地址,而是mac地址.在大小上:mac地址占有6个字节,相比于IPv4,mac可以给全球的每一台设备一个自己的mac地址.在地址的描述上:IP地址描述的是整体路程的起点和终点,而mac地址描述的是相邻…

GAN入门示例

本文参考&#xff1a;pytorch实现简单GAN - 灰信网&#xff08;软件开发博客聚合&#xff09; 上文中pytorch代码执行会有问题&#xff0c;这块本文中已经修复&#xff01; 1、GAN概述 GAN&#xff1a;Generative Adversarial Nets&#xff0c;生成对抗网络。在给定充分的建…

SpringBoot整合Mybatis+人大金仓(kingbase8)

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-人大金仓&#xff08;kingbase8&#xff09;&#xff08;主要讲一些人大金仓数据库相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Mybatis框架整合人…

SAP MM学习笔记1-入库中的发注完了自动设定

SAP点滴学习笔记记录。 今天想整理一下MM模块儿的入库中的发注完了字段儿。 具体业务&#xff1a; 对于某个购买发注票&#xff0c;分批入库之后&#xff0c;剩下几个不想要了&#xff0c;在最后一次入库的时候&#xff0c;如何自动设定购买发注票发注完了字段。 业务流程&a…

LeetCode 160. 相交链表 -- 消除长度差

相交链表 简单 2K 相关企业 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意…

数据服务总线的搭建

关于http协议的基础知识就不介绍了。主要介绍它的报文格式。 如何显示http的报文&#xff1b; 浏览器登录服务端的IP和端口&#xff1a; 服务端接收http客户端发过来的报文&#xff1a;recv(connfd,buffer,1000,0),打印出来。 请求报文格式是请求行&#xff0c;请求头部&#…

系列四、多表查询

一、多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结 构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a;一对多…

【分组CNN:超分】

Image super-resolution with an enhanced group convolutional neural network &#xff08;基于增强型分组卷积神经网络的图像超分辨率&#xff09; 具有较强学习能力的神经网络被广泛应用于超分辨率问题的求解。然而&#xff0c;CNNs依赖于更深层次的网络结构来提高图像超…

2021.3.3idea创建Maven项目

首先new - project - 找到Maven 然后按下图操作&#xff1a;先勾选使用骨架&#xff0c;再找到Maven-archetype-webapp&#xff0c;选中&#xff0c;然后next填写自己想要创建的项目名&#xff0c;然后选择自己的工作空间①、选择自己下载的Maven插件②、选择选择Maven里的sett…

基于Opencv的缺陷检测任务

数据及代码见文末 1.任务需求和环境配置 任务需求:使用opencv检测出手套上的缺陷并且进行计数 环境配置:pip install opencv-python 2.整体流程 首先,我们需要定义几个参数。 图像大小,原图像比较大,首先将图像resize一下再做后续处理图像阈值处理的相应阈值反转阈值的…

git 的使用方法(上 - 指令)

目录前言&#xff1a;一、Git 是什么&#xff1f;二、SVN与Git的最主要的区别&#xff1f;三、Git 安装四、git 配置1. 创建仓库 - repository2. 配置3. 工作流与基本操作五、Git 的使用流程1. 仓库中创建 1.txt文件2. 查看工作区的文件状态3. 添加工作区文件到暂存区4. 创建版…

c++11 之智能指针

文章目录std::shared_ptrstd::weak_ptrstd::unique_ptr智能指针多线程安全问题在实际的 c 开发中&#xff0c;我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题&#xff0c;这些问题往往都是内存资源管理不当造成的。比如&#xff1a; 有…

浅谈Synchronized的原理

文章目录1.引言2.Synchronized使用方式2.1.普通函数2.2.静态函数2.3.代码块3.Synchronized原理4.Synchronized优化4.1.锁粗化4.2.锁消除4.3.锁升级4.4.无锁4.5.锁偏向锁4.6.轻量级锁4.7.重量级锁5.整个锁升级的过程1.引言 在并发编程中Synchronized一直都是元老级的角色&#…

斗地主洗牌发牌-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-4】 斗地主洗牌发牌 【案例介绍】 1.任务描述 扑克牌游戏“斗地主”&#xff0c;相信许多人都会玩&#xff0c;本案例要求编写一个斗地主的洗牌发牌程序&#xff0c;要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有54张牌&#xff0c;牌面由花色和数字组成…

Linux 定时任务调度(crontab)

一、Crontab Crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令&#xff0c;并将其存放于“crontab”文件中&#xff0c;以供之后读取和执行。 可以使用Crontab定时处理离线任务&#xff0c;比如每天凌晨2点更新数据等&#xff0c;经常用于系统任务调度。…

【Linux】冯.诺依曼体系结构与操作系统

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;冯.诺依曼体系结构什么是冯诺依曼体系结构&#xff1f;我们如今的计算机比如笔记本&#xff0c;或者是服务器&#xff0c;基本上都遵循冯诺依曼体系结构…

记一次web漏洞挖掘随笔

最近挖了一些漏洞。虽然重复了&#xff0c;但是有参考价值。这边给大家分享下。漏洞重复还是很难受的&#xff0c;转念一想&#xff0c;人生从不是事事如人意的&#xff0c;漏洞重复忽略&#xff0c;不代表失败。先来后到很重要&#xff0c;出场顺序很重要。1.某站rce 忽略理由…

Docker----------DockerFile解析

1. 是什么 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 官网&#xff1a;https://docs.docker.com/engine/reference/builder/ 1.编写Dockerfile文件 2.docker build命令构建镜像 3.docker run依镜像运行容器实例…

第47天|LeetCode392. 判断子序列、LeetCode392. 判断子序列

1.题目链接&#xff1a;392. 判断子序列 题目描述&#xff1a; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&…