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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordpress旅游网站模板

旅行社wordpress主题 简洁实用的旅行社wordpress主题&#xff0c;适用于旅行社建网站的wordpress主题模板。 https://www.jianzhanpress.com/?p4296 旅游WordPress主题 简洁实用的旅游WordPress主题&#xff0c;适合做旅游公司网站的WordPress主题模板。 https://www.jian…

网络故障排除:保持网络稳定与业务连续

目录 什么是网络故障&#xff1f; 网络故障排除的基本步骤 1. 问题识别 2. 确定故障范围 3. 检查物理连接 4. 检查设备配置 5. 测试与诊断 6. 实施解决方案 7. 验证与监控 了解更多 在现代企业中&#xff0c;网络的稳定性和性能直接影响业务的连续性和效率。作为一名…

上岸北科大计算机专业难度有多大?北京科技大学计算机考研考情分析!

北京科技大学计算机与通信工程学院源于1973年成立的计算机及应用专业&#xff0c;经过近40年的建设&#xff0c;学院在学科建设、科学研究水平和教育教学质量上实现了跨越式的发展与大力提升。学院目前设有计算机科学与技术系、软件工程系、通信工程系、物联网与电子工程系、信…

项目文件预览

在实际项目开发过程&#xff0c;项目使用数据存在多种形式&#xff0c;“文件”也是一种常见形式&#xff0c;因此&#xff0c;“文件预览”功能变成了常规需求。 kkFileView项目使用流行的spring boot搭建&#xff0c;易上手和部署。万能的文件预览开源项目&#xff0c;基本支…

知识图谱的应用---智慧外交

文章目录 智慧外交典型应用 智慧外交 智慧外交是指通过事件分析的手段&#xff0c;从历史、政治、经济、军事、文化等多个层面对各个国家的关系进行定量分析&#xff0c;提供智能化的外交关系研判和外交决策支撑。依托公开媒体、互联网及内部信息等海量资源数据&#xff0c;综合…

视频号小店常见问题全网最全的合集,赶紧收藏起来!

大家好&#xff0c;我是电商小V 新的电商项目视频号小店也是越来越火&#xff0c;想去操作的小伙伴也是越来越多&#xff0c;但是很多人对于这个项目本身不是很了解&#xff0c;咱们今天就来详细的说一下视频号小店&#xff0c;最关心的问题&#xff0c;一篇详解&#xff0c;建…

计算机组成原理(五)

一、链式查询方式 接口的优先级固定不变 在链式查询的情况下&#xff0c;设备的优先级通常与其在链中的位置有关。具体来说&#xff0c;越靠近查询链的起始位置的设备通常具有较高的优先级&#xff0c;而越靠近链的末尾位置的设备优先级较低。 优点&#xff1a; 简单实现&am…

12. ESP32-JSON(Arduino)

使用ESP32和Arduino框架处理JSON数据 在物联网&#xff08;IoT&#xff09;开发中&#xff0c;ESP32是一款功能强大的微控制器&#xff0c;它结合了Wi-Fi和蓝牙功能&#xff0c;适用于各种智能设备和传感器项目。JSON&#xff08;JavaScript Object Notation&#xff09;是一种…

StaticText文本类

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 创建完窗口以后&#xff0c;我们可以在窗口内添加一些控件&#xff0c;所谓的控件&#xff0c;就是经常使用的按钮、文本、输入框、单选框等。 于所…

AIOps实现的简单途径

AIOps需要大模型的支持&#xff0c;但是训练一个业务专用的大模型并不是一件理想的任务&#xff0c;所以利用开源的通用大模型才是王道。 我们可以利用AI大模型的理解能力来帮助分析和解释Kubernetes&#xff08;K8s&#xff09;的日志。通过提供日志中可能存在问题的部分&…

白酒:茅台镇白酒的消费趋势与未来发展

茅台镇&#xff0c;中国白酒的璀璨明珠&#xff0c;以出产品质的白酒而享誉全球。在这片神奇的土地上&#xff0c;云仓酒庄豪迈白酒以其别具一格的酿造工艺和风格特点&#xff0c;成为了市场的宠儿。随着消费市场的不断变化&#xff0c;云仓酒庄豪迈白酒的消费趋势也在悄然发生…

代码随想录算法训练营第四十三天 | 01背包问题理论基础、01背包问题滚动数组、416. 分割等和子集

背包问题其实有很多种&#xff0c;01背包是最基础也是最经典的&#xff0c;软工计科学生一定要掌握的。 01背包问题 代码随想录 视频讲解&#xff1a;带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经…

基于学习模型的可学习小波变换方法(Pytorch)

首先以图像编码为例进行说明。 图像编码是一个复杂的系统&#xff0c;通常包含多个模块&#xff0c;其中变换模块具有重要作用。小波变换在图像编码领域得到了广泛的应用&#xff0c;例如著名的JPEG 2000就是一种小波图像编码方法。然而&#xff0c;现阶段的小波图像编码方法与…

java入门-文件与IO流

File类 提供一些方法(api)来操纵文件和获取文件的信息 File常用API 属性 获取系统分隔符 不同操作系统的分隔符 windows的目录分割符号是用向右的斜线&#xff0c;java中\ 表示转义字符&#xff0c;所以向右的斜线需要写两个 \; linux目录分割符号是向左的斜线: / private st…

C#开源项目推荐:Watt Toolkit跨平台游戏工具箱支持github网络加速

Watt Toolkit是一个开源跨平台的多功能游戏工具箱&#xff0c;主要专注于增强玩家在Steam平台上的游戏体验及国外网站平台加速。 主要功能 兼容性 用户数据 团队背景 github加速功能 使用方法&#xff1a;用户只需在Watt Toolkit中启用网络加速功能&#xff0c;并选择对Gi…

cleanmymacx最新破解版百度云免费下载 cleanmymac激活码分享

CleanMyMac X4.15.3 中文破解版是一款 mac 系统清理软件&#xff0c;是一款专业的 Mac 清理、优化和维护工具&#xff0c;可以帮助用户清理系统垃圾、卸载不需要的应用程序、优化系统性能、保护隐私和安全等&#xff0c;让用户的 Mac 始终保持高效、安全和稳定。 CleanMyMac X4…

再度牵手,制造升级 | 毅达科技IMS OS+通用产品集+行业套件项目正式启动!

在数字化与智能制造的浪潮中&#xff0c;制造业企业纷纷加快转型步伐&#xff0c;力求通过技术创新实现生产效率与质量的双重提升。近日&#xff0c;广东毅达医疗科技股份有限公司&#xff08;以下简称“毅达科技”&#xff09;再次携手盘古信息&#xff0c;正式启动了IMS 数字…

跃入AI新纪元:亚马逊云科技LLM全景培训,解锁AI构建者之路

亲爱的技术爱好者们&#xff0c;你是否也对大语言模型&#xff08;LLM&#xff09;的神奇魅力所吸引&#xff0c;渴望深入探索其背后的技术奥秘&#xff1f;今天&#xff0c;我要为大家推荐一份超级硬核的学习资源——亚马逊云科技 对话AI 构建者&#xff1a;从基础到应用的LLM…

判断环形链表-链表题

141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool hasCycle(ListNode *head) {ListNode* slow head;ListNode* fast head;while(fast ! NULL &&fast->next ! NULL){fast fast->next->next;slow slow->next;if(fast…

iOS/iPadOS18Beta是否值得升级体验?Bug汇总和升级办法分享!

苹果昨天发布了iOS/iPadOS18Beta更新&#xff0c;引入了诸多新功能/新特性&#xff0c;很多喜欢尝鲜的用户已经在第一时间进行了升级。 iOS/iPadOS18Beta目前存在不少Bug&#xff0c;建议暂时不要更新&#xff0c;轻则浪费装机时间&#xff0c;重则丢失相关数据&#xff0c;甚至…