RAM IP核配置

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.mzph.cn/diannao/26921.shtml

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

相关文章

在不使用js在情况下只用css实现瀑布流效果

使用到的是grid 布局&#xff0c;需要注意的是grid-template-rows: masonry; 目前只有Firefox 浏览器支持这个效果&#xff0c;而且还是一个实验性属性需要在设置里面开发实验性选项才行。 实例 <!DOCTYPE html> <html> <head><title>Document</ti…

为CAP面板添加简单的Authentication登录验证功能 C#|.net

终于搞定了CAP Dashboard的登录验证功能! 因为网上找不到简单的CAP Dashboard的登录验证功能,所以这个功能摸索着开发了好久。 这个Authentication认证功能,不仅适用于CAP面板,也适用于懒得开发登录页面,但是又需要简单用户名密码登录的网页。 做过后端的比较熟悉,CAP面…

告别“人治”时代,物业运维平台能否成为行业新标准?

随着数字化时代的飞速发展&#xff0c;智能化、数字化已经遍及所有的行业。物业服务企业也不例外&#xff0c;你是否还在想象物业运维工作依旧停留在手动报修、纸质记录的古老时代&#xff1f;那么&#xff0c;你就OUT了&#xff0c;物业运维平台已经悄然崛起&#xff0c;正在以…

《Brave New Words 》2.2 阅读理解的未来,让文字生动起来!

Part II: Giving Voice to the Social Sciences 第二部分&#xff1a;为社会科学发声 The Future of Reading Comprehension, Where Literature Comes Alive! 阅读理解的未来&#xff0c;让文字生动起来&#xff01; Saanvi, a ninth grader in India who attends Khan World S…

鸿蒙轻内核A核源码分析系列七 进程管理 (2)

本文先熟悉下进程管理的文件kernel\base\core\los_process.c中的内部接口&#xff0c;读读代码&#xff0c;做些记录。 1、LiteOS-A内核进程全局变量 ⑴是进程池&#xff0c;存放各个进程控制块LosProcessCB的信息。⑵处开始的g_freeProcess是空闲进程链表&#xff0c;挂载各…

【机器学习】简答

1.什么是机器学习&#xff1f; 机器学习致力于研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能。“训练”与“预测”是机器学习的两个过程&#xff0c;“模型”则是过程的中间输出结果&#xff0c;“训练”产生“模型”&#xff0c;“模型”指导 “预测”。计…

算法体系-20 第二十节暴力递归到动态规划

前言 动态规划模型从尝试暴力递归到傻缓存到动态规划 四种模型和体系班两种模型一共六种模型 0.1 从左往右模型 0.2 范围讨论模型范围尝试模型 &#xff08;这种模型特别在乎讨论开头如何如何 结尾如何如何&#xff09; 玩家博弈问题&#xff0c;玩家玩纸牌只能那左或者右 0.3 …

【DrissionPage】Linux上如何将https改为http

最近有个老板找我做一个自动化的程序&#xff0c;要求部署到Linux上 这是一个http协议的网站&#xff0c;chrome在默认设置下&#xff0c;会将http的网站识别成不安全的内容&#xff0c;然后自动将http转化成https访问 但是&#xff0c;这个http的网站它的加载项里既有http的…

HAL库--内存保护(MPU)实验

MPU是内核外设&#xff0c;想获取相关资料只能从内核手册查找 MPU功能仅F7/H7系列具备 内存保护单元(MPU介绍) MPU基本介绍 说白了MPU用来管理内存和外设存储区的访问权限 MPU可配置保护8/16个内存区域(看芯片型号)&#xff0c;每个区域最小要求256字节&#xff0c;且每个区…

STL入门指南:从容器到算法的完美结合

目录 ​编辑 一、什么是STL 二、STL的版本 三、STL的六大组件 1. 容器&#xff08;Containers&#xff09;&#xff1a; 2. 算法&#xff08;Algorithms&#xff09;&#xff1a; 3. 迭代器&#xff08;Iterators&#xff09;&#xff1a; 4. 仿函数&#xff08;Functo…

安鸾学院靶场——安全基础

文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包&#xff0c;可以拿到包含flag的txt文件。…

天降流量于雀巢?元老品牌如何创新营销策略焕新生

大家最近有看到“南京阿姨手冲咖啡”的视频吗&#xff1f;三条雀巢速溶咖啡入杯&#xff0c;当面加水手冲&#xff0c;十元一份售出&#xff0c;如此朴实的售卖方式迅速在网络上走红。而面对这一波天降的热度&#xff0c;雀巢咖啡迅速做出了回应&#xff0c;品牌组特地去到了阿…

计算机SCI期刊,中科院3区,IF=5.6,审稿速度非常快

一、期刊名称 International Journal of Machine Learning and Cybernetics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;5.6 中科院分区&#xff1a;3区 三、期刊征稿范围 控制论关注的是描述我们日常生活中无处不在…

迅狐跨境商城系统|全平台兼容|前端采用uni-app跨端框架,后端采用ThinkPHP5框架

高效实现全平台兼容的迅狐跨境商城系统 迅狐跨境商城系统是一款专为跨境电商企业设计的全平台兼容系统。其前端采用uni-app跨端框架&#xff0c;后端采用ThinkPHP5框架&#xff0c;旨在实现高效的开发和运营管理。 1. 全平台兼容的前端设计 迅狐跨境商城系统的前端采用uni-a…

STM32开发过程中碰到的问题总结 - 1

文章目录 前言1. 怎么生成keil下可以使用的文件和gcc下编译使用的makefile2. STM32的时钟树3.怎么查看keil5下的编译工具链用的是哪个4. Arm编译工具链和GCC编译工具链有什么区别吗&#xff1f;5. 怎么查看Linux虚拟机是x86的还是aarch646. 怎么下载gcc-arm的编译工具链7.怎么修…

PlugLink:让数据分析与工作流无缝连接(附源码)

PlugLink&#xff1a;让数据分析与工作流无缝连接 引言 数据分析和自动化工作流已成为各个企业和个人提高效率的关键手段。今天&#xff0c;我要介绍一款名为PlugLink的工具&#xff0c;它不仅能帮助你轻松进行数据分析&#xff0c;还能将这些分析结果无缝连接到你的工作流中&…

基于 Python 解析 XML 文件并将数据存储到 MongoDB 数据库

1. 问题背景 在软件开发中&#xff0c;我们经常需要处理各种格式的数据。XML 是一种常用的数据交换格式&#xff0c;它可以存储和传输结构化数据。很多网站会提供 XML 格式的数据接口&#xff0c;以便其他系统可以方便地获取数据。 我们有这样一个需求&#xff1a;我们需要从…

Vue30-自定义指令:对象式

一、需求&#xff1a;创建fbind指定 要用js代码实现自动获取焦点的功能&#xff01; 二、实现 2-1、步骤一&#xff1a;绑定元素 2-2、步骤二&#xff1a;input元素获取焦点 此时&#xff0c;页面初始化的时候&#xff0c;input元素并没有获取焦点&#xff0c;点击按钮&…

NestJS学习笔记

一、安装NestJS CLI工具 环境检查 //查看node版本 node -v//查看npm版本 npm -v 安装nest/cli 使用npm全局安装nestjs/cli npm i -g nestjs/cli 查看nest版本 nest -v 结果如图&#xff1a; 创建nest项目 //命令行创建nest项目 nest new 【项目名】 VScode扩展下载 1、…

远程登录新建会话

在做远程登录会话建立的时候有时候会忘记顺便就记录了&#xff0c;方便后期回顾