RAM IP核配置

news2024/11/25 12:50:35

REVIEW

之前已经学习过:

ROM:FPGA寄存器 Vivado IP核-CSDN博客

串口接收:Vivado 串口接收优化-CSDN博客

1.  今日摸鱼计划

RAM创建与测试

小梅哥视频:

21C_嵌入式块存储器RAM介绍_哔哩哔哩_bilibili

21D_嵌入式块存储器RAM实现和仿真_哔哩哔哩_bilibili

小梅哥教材:

02_【逻辑教程】基于HDL的FPGA逻辑设计与验证教程V3.4.pdf

        14 IP 核使用之 RAM

2.  RAM IP核配置

RAM(Random Access Memory):
RAM是一种计算机主存,用于临时存储数据和程序。

它可以随时把数据写入到任何一指定地址的存储单元,也可以随时从任一指定地址读出数据。

其读写速度有时钟频率决定,主要用来存放程序以及程序执行过程中产生的数据运算结果等。

Distributed Memory Generator 生成的 ROM/RAM Core 占用的资源是 LUT
(查找表,查找表本质就是一个小的 RAM
 Block Memory Generator 生成的 ROM/RAM Core 占用的资源是 Block Memory
(嵌入式的硬件 RAM

RAM :单端口 RAM 、简单双端口 RAM 和真双端口 RAM
具体的差异我们可以通过依次选择,然后观察窗口左边 RAM 端口来进行对比
单端口 RAM 读写一个时钟,读写不能同时进行。

简单双端口 RAM
相较单端口 RAM ,多出一个 PORTB,有两个时钟,可以同时读写,
PORTA 只能写数据, PORTB 只能进行读数据。

真双端口 RAM
两个 PORT ,分别有自己的时钟、地址、输入/输出数据端口,两个端口均可进行读写操作。

写数据字节使能: 如果勾选,写使能信号会根据写数据的字节数生成对应的 bit 数据, 1 个字节对应 1bit 写使能,这里字节的大小可以设置为 8 9,当这里选择后,输入输出的数据的位宽就必须是 8 9 的整数倍,这里我们需要一个位宽为 8bit RAM ,这里勾选 Write Enable 并设置字节大小为 8bit

算法类型 有三种选项可选,最小面积、低功耗、固定原语。这里不过多讲解,需要了解更多的可以查阅 IP 手册, IP 手册上面 42页开始有对这个详细的讲解。这里我们保持默认的最小面积选项即可。

操作模式设置: 有三个可选项,主要是针对在同时对同一地址进行读操作和写操作时,读出数据是写入的最新数据、该地址原来的数据、读数据不变化。
Write First 模式下的波形,如果仅读出数据而未发生数据的同时读写,则读出存储器以前存储的数据,如果发生数据的同时读写,读出数据为刚从数据总线送入的数据,而不考虑该地址以前存储的数据。

Read First 模式下的波形,同时对同一地址读写,读出数据为上次刚写入该地址以前的数据,忽略正在写数据这一事件对读出数据的影响。

No Change 模式下波形,读出的数据只有在进行读操作但未进行写操作时更新数据,在同时读写数据时,读出数据保持不变。

端口使能信号 类型设置,一个是一直使能,一个是通过一个 ENA 信号管脚控制,这里选择 Always Enable

端口B输出寄存器配置:
这里可以看下 RAM内部结构图,可以很清楚的看到 Primitives Output Register 是结构中的 1 处的寄存器, Core Output Register 是结构图中 2 出的寄存器。
REGCEB Pin 是寄存器使能管脚,如果勾选,会有一个寄存器使能控制管脚用于控制寄存器的使能,如果不勾选寄存器就一直使能状态,这里就不勾选。
要得到更好的性能,将这里的两个寄存器都勾选。

端口 B 输出置位/复位设置
这里不创建置位 / 复位端口,需注意这里置位/复位并不复位 RAM 中的数据而是只复位寄存器上的值。

其它保持默认就OK
最后看一看总的情况,信息包括使用的资源, A B 端口的地址位宽,以及端口 B Read Latency 3 个时钟周期。

Latentcy 指的是相对于某个时钟起始位的 1 个或多个时钟后数据才有效,一般以时钟为单位,这里表示的是时钟采集到读数据地址到数据有效的时间间隔,举例子说明:

这里之所以 Latency 等于 3 ,是因为我们前面配置同时勾选了 Primitives Output Register Core Output Register ,相当于数据打了两拍。
到这里 IP 设置就完成了,点击 OK ,点击 Generate 生成 IP

3.  RAM 测试

`timescale 1ns/1ns
`define CLKA_PERIOD 20
`define CLKB_PERIOD 30

module ram_tb();
        reg clka;
        reg wea;
        reg [7:0]addra;
        reg [7:0]dina;
        reg clkb;
        reg [7:0]addrb;
        wire[7:0]doutb;
        integer i;
        blk_mem_gen_0 blk_mem_gen_0_ (
                                     .clka(clka), // input wire clka
                                     .wea(wea), // input wire [0 : 0] wea
                                     .addra(addra), // input wire [7 : 0] addra
                                     .dina(dina), // input wire [7 : 0] dina
                                     .clkb(clkb), // input wire clkb
                                     .addrb(addrb), // input wire [7 : 0] addrb
                                     .doutb(doutb) // output wire [7 : 0] doutb
                                    );

        //blk_mem_gen_0 是忘记改名字哩~
        //配置时钟信号 clka  clkb                         
        initial clka = 1'b1;
        always #(`CLKA_PERIOD/2) clka = ~clka;
        initial clkb = 1'b1;
        always #(`CLKB_PERIOD/2) clkb = ~clkb;
        
        initial
            begin
                wea = 0;
                addra = 0;
                dina = 0;
                addrb = 255; //255
                #(`CLKA_PERIOD*10 +1 );
                wea = 1;   //写使能信号,高电平写入
                    for (i = 0 ; i< 32 ; i = i+1)begin
                        dina = 127 - i;
                        addra = i;
                        #`CLKA_PERIOD;
                    end
                wea = 0;
                #1;
                    for (i = 0 ; i < 32 ; i = i+1)begin
                        addrb = i;
                        #`CLKB_PERIOD;
                    end
            #200;
            $stop; 
            end
endmodule

本测试,对RAM 地址0~31 写入127~96

然后从地址0~31依次读取其中的数值

这里可以看到读取时,会晚3个时钟周期

本次RAM读写都未配置使能ena enb 所以看起来很简单;

(但是本摸鱼怪又觉得没有使能控制看着有点怪,后边再搞一下呗~)

4.  带使能en的RAM

ram_tb

`timescale 1ns/1ns
`define CLKA_PERIOD 20
`define CLKB_PERIOD 30

module ram_tb();
        reg clka;
        reg ena ;
        reg wea;
        reg [7:0]addra;
        reg [7:0]dina;
        reg clkb;
        reg enb ;
        reg [7:0]addrb;
        wire[7:0]doutb;
        integer i;
        
        ram_8 ram_8_ (
                                     .clka(clka), // input wire clka
                                     .ena(ena),
                                     .wea(wea), // input wire [0 : 0] wea
                                     .addra(addra), // input wire [7 : 0] addra
                                     .dina(dina), // input wire [7 : 0] dina
                                     .clkb(clkb), // input wire clkb
                                     .enb(enb),
                                     .addrb(addrb), // input wire [7 : 0] addrb
                                     .doutb(doutb) // output wire [7 : 0] doutb
                                    );

        
        //配置时钟信号 clka  clkb                         
        initial clka = 1'b1;
        always #(`CLKA_PERIOD/2) clka = ~clka;
        initial clkb = 1'b1;
        always #(`CLKB_PERIOD/2) clkb = ~clkb;
        
        initial
            begin
                ena = 0 ;
                wea = 0;
                addra = 0;
                dina = 0;
                enb = 0;
                addrb = 255; //255
                #(`CLKA_PERIOD*10 +1 );
                ena = 1;
                wea = 1;   //写使能信号,高电平写入
                    for (i = 0 ; i< 32 ; i = i+1)begin
                        dina = 127 - i;
                        addra = i;
                        #`CLKA_PERIOD;
                    end
                wea = 0;
                ena = 0;
                #1;
                enb = 1;
                    for (i = 0 ; i < 32 ; i = i+1)begin
                        addrb = i;
                        #`CLKB_PERIOD;
                    end
                
            #60;
            enb = 0;
            #200;
            $stop; 
            end
endmodule

#60;
enb = 0;

这个自己调试一下就会发现问题

(其实就是Latentcy

本摸鱼怪还是行动力很强的嘛,桀桀桀~~~

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

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

相关文章

C++ 实现HTTP的客户端、服务端demo和HTTP三方库介绍

本文使用C模拟实现http的客户端请求和http的服务端响应功能&#xff0c;并介绍几种封装HTTP协议的三方库。 1、实现简单HTTP的服务端功能 本程序使用C tcp服务端代码模拟HTTP的服务端&#xff0c;服务端返回给客户端的消息内容按照HTTP协议的消息响应格式进行了组装。 demo如…

腾讯云 BI 数据分析与可视化的快速入门指南

前言 腾讯云 BI 是一款商业智能解决方案&#xff0c;提供数据接入、分析、可视化、门户搭建和权限管理等全流程服务。它支持敏捷自助设计&#xff0c;简化报表制作&#xff0c;并通过企业微信等渠道实现协作。产品分为个人版、基础版、专业版和私有化版&#xff0c;满足不同规…

联想电脑 调节屏幕亮度不起使用,按F5,F6,屏幕上的hotkeys进度条是在改变,但是屏幕没有一些作用的处理方法

1、查看驱动是否正常 Win键X &#xff0c;设备管理器 发现似乎挺正常的。 查看原厂驱动&#xff1a;联想电脑管家 这样看来&#xff0c;驱动是没有问题了。 2、看看设置电池模式 其实还是这个电池模式的问题导致。 如果处于养护模式的话&#xff0c;充电只在75%~80%&#x…

探索Edge

目录 1.概述 1.1.什么是浏览器 1.2.浏览器的作用 2.Edge 2.1.什么是Edge 2.2.诞生背景 2.3.历史版本 2.4.作用 2.5.优缺点 2.5.1.优点 2.5.2.缺点 3.对比 3.1.和360浏览器的对比 3.2.和谷歌浏览器&#xff08;Chrome&#xff09;的对比 4.未来展望 5.总结 1.概…

浏览器f12控制台怎么获取vue实例,并且修改data数据

我们在日常的生产工作中&#xff0c;经常会遇到一些问题&#xff0c;比如&#xff0c;若产品已经部署&#xff0c;或是目前无法查看源代码&#xff0c;或者向用命令直接修改查询默认表单数据&#xff0c;那我们怎么去查看Vue实例呢&#xff1f; 我们在浏览器直接打印this不能得…

[Alogithm][动态规划][背包问题][组合总和IV][不同的二叉搜索树]详细讲解

目录 1.组合总和 Ⅳ1.题目链接2.算法原理详解3.代码实现 2.不同的二叉搜索树1.题目链接2.算法原理详解3.代码实现 1.组合总和 Ⅳ 1.题目链接 组合总和 Ⅳ 2.算法原理详解 本题是个排列题&#xff0c;而并非组合题&#xff0c;所以并非背包问题 思路&#xff1a; 确定状态表示…

【spring 】支持spring WebFlux 的容器

spring WebFlux 是 Spring 5 引入的响应式 Web 框架&#xff0c;它支持非阻塞、事件驱动的编程模型&#xff0c;特别适合处理高并发的场景。 Spring WebFlux 可以运行在多种容器上 包括下面&#xff1a; Netty: Netty 是一个异步事件驱动的网络应用程序框架&#xff0c;用于快…

OpenCV 的模板匹配

OpenCV中的模板匹配 模板匹配&#xff08;Template Matching&#xff09;是计算机视觉中的一种技术&#xff0c;用于在大图像中找到与小图像&#xff08;模板&#xff09;相匹配的部分。OpenCV提供了多种模板匹配的方法&#xff0c;主要包括基于相关性和基于平方差的匹配方法。…

【RPC项目-1】0612

写在前面&#xff0c;主要是作学习回顾笔记&#xff0c;以备后续面试 LogEvent 组成&#xff1a; 日志级别&#xff08;level&#xff09;日期时间(精确到ms)进程号pid&#xff0c;线程号threadid文件名file_name、行号line自定义msg 输出格式如&#xff1a;[level]\t[%y-%…

dvadmin 调试问题

链接&#xff1a;django-vue3-admin: django-vue3-admin 是一套全部开源的快速开发平台&#xff0c;毫无保留给个人免费使用、团体授权使用。 django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台&#xff0c;权限粒度达到列级别&#xff0c;前后端分离&#xff0c;…

vb.net小demo(计算器、文件处理等/C#也可看)

Demo1&#xff1a;使用窗体控件实现一个简易版计算器 Public Class Form1Private Sub Button_1_Click(sender As Object, e As EventArgs) Handles Button_1.ClickCalSubBox.Text Button_1.TextEnd SubPrivate Sub Button_2_Click(sender As Object, e As EventArgs) Handles …

HBase数据存储

1、数据模型 Namespace&#xff08;表命名空间&#xff09;&#xff1a;表命名空间不是强制的&#xff0c;当想把多个表分到一个组去统一管理的时候才会用到表命名空间。Table&#xff08;表&#xff09;&#xff1a;一个表由一个或者多个列族组成。数据属性&#xff0c;都在列…

javaWeb项目-ssm+vue个人博客网站管理系统功能介绍

本项目源码&#xff1a;java-基于ssmvue的个人博客网站的设计与实现源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a…

第 5 章:面向生产的 Spring Boot

在 4.1.2 节中&#xff0c;我们介绍了 Spring Boot 的四大核心组成部分&#xff0c;第 4 章主要介绍了其中的起步依赖与自动配置&#xff0c;本章将重点介绍 Spring Boot Actuator&#xff0c;包括如何通过 Actuator 提供的各种端点&#xff08;endpoint&#xff09;了解系统的…

DDD领域应用理论实践分析回顾

目录 一、DDD的重要性 &#xff08;一&#xff09;拥抱互联网黑话&#xff08;抓痛点、谈愿景、搞方法论&#xff09; &#xff08;二&#xff09;DDD真的重要吗&#xff1f; 二、领域驱动设计DDD在B端营销系统的实践 &#xff08;一&#xff09;设计落地步骤 &#xff0…

小程序无法调用服务端问题排查

1、问题描述 突然有一天线上的小程序不能登录&#xff0c;经查小程序无法调用。经查无法小程序页面无法调用后台服务。 2、排查过程 由于无法登录小程序发布服务器&#xff0c;无法测试小程序前端服务器到服务端网络&#xff0c;并且小程序无法看到日志。所以就得从服务端和网…

使用CSS、JavaScript、jQuery三种方式实现手风琴效果

手风琴效果有不少&#xff0c;王者荣耀官网&#xff08;源网址 https://pvp.qq.com/raiders/ &#xff09;有一处周免英雄&#xff0c;使用的就是手风琴效果&#xff0c;如图所示。 我试着用css、js、jQuery三种方式实现了这种效果&#xff0c;最终效果差不多&#xff0c;美中不…

IDEA创建简单web(servlet)项目(server为tomcat)

引言 鉴于网上很少有关于IDEA开发servlet项目的教程&#xff08;24版idea&#xff0c;并且servlet技术十分复古&#xff0c;很少有人用到&#xff0c;能够理解&#xff0c;该文章旨在为在校的学生提供一个参考&#xff0c;项目技术简单&#xff09;本人在此总结从头开始到项目…

MATLAB算法实战应用案例精讲-【数模应用】有序Logit(Logistic)分析

目录 算法原理 logit回归分析步骤 二元logit分析 多分类logit分析 有序logit分析 总结 SPSS 1、问题与数据 2、对数据结构的分析 3、SPSS分析方法 SPSSAU 有序Logit回归案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解惑 提示…

Joplin Typora 粘贴图片 | 当使用Typora作为Joplin编辑器时,如何粘贴图片并上传到Joplin服务器,替换链接

一、背景 当我们使用Joplin时&#xff0c;上传图片时会自动上传到Joplin服务器并替换链接 但是Joplin的编辑器不好用&#xff0c;我更习惯用Typora来编辑&#xff0c; 然而Typora中上传的图片只能在本地&#xff0c;无法上传到Joplin服务器&#xff0c;在其他客户端也看不到图片…